Polly 24.0.0git
IslNodeBuilder.cpp File Reference
#include "polly/CodeGen/IslNodeBuilder.h"
#include "polly/CodeGen/BlockGenerators.h"
#include "polly/CodeGen/CodeGeneration.h"
#include "polly/CodeGen/IslAst.h"
#include "polly/CodeGen/IslExprBuilder.h"
#include "polly/CodeGen/LoopGeneratorsGOMP.h"
#include "polly/CodeGen/LoopGeneratorsKMP.h"
#include "polly/CodeGen/RuntimeDebugBuilder.h"
#include "polly/Options.h"
#include "polly/ScopInfo.h"
#include "polly/Support/ISLTools.h"
#include "polly/Support/SCEVValidator.h"
#include "polly/Support/ScopHelper.h"
#include "polly/Support/VirtualInstruction.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/RegionInfo.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "isl/aff.h"
#include "isl/aff_type.h"
#include "isl/ast.h"
#include "isl/ast_build.h"
#include "isl/isl-noexceptions.h"
#include "isl/map.h"
#include "isl/set.h"
#include "isl/union_map.h"
#include "isl/union_set.h"
#include "isl/val.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstring>
#include <string>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "polly-codegen"

Enumerations

enum class  OpenMPBackend { GNU , LLVM }
 OpenMP backend options. More...

Functions

 STATISTIC (VersionedScops, "Number of SCoPs that required versioning.")
 STATISTIC (SequentialLoops, "Number of generated sequential for-loops")
 STATISTIC (ParallelLoops, "Number of generated parallel for-loops")
 STATISTIC (IfConditions, "Number of generated if-conditions")
static cl::opt< bool > PollyGenerateRTCPrint ("polly-codegen-emit-rtc-print", cl::desc("Emit code that prints the runtime check result dynamically."), cl::Hidden, cl::cat(PollyCategory))
static cl::opt< bool > PollyGenerateExpressions ("polly-codegen-generate-expressions", cl::desc("Generate AST expressions for unmodified and modified accesses"), cl::Hidden, cl::cat(PollyCategory))
static cl::opt< int > PollyTargetFirstLevelCacheLineSize ("polly-target-first-level-cache-line-size", cl::desc("The size of the first level cache line size specified in bytes."), cl::Hidden, cl::init(64), cl::cat(PollyCategory))
static cl::opt< OpenMPBackendPollyOmpBackend ("polly-omp-backend", cl::desc("Choose the OpenMP library to use:"), cl::values(clEnumValN(OpenMPBackend::GNU, "GNU", "GNU OpenMP"), clEnumValN(OpenMPBackend::LLVM, "LLVM", "LLVM OpenMP")), cl::Hidden, cl::init(OpenMPBackend::GNU), cl::cat(PollyCategory))
static void findReferencesByUse (Value *SrcVal, ScopStmt *UserStmt, Loop *UserScope, const ValueMapT &GlobalMap, SetVector< Value * > &Values, SetVector< const SCEV * > &SCEVs)
static void findReferencesInInst (Instruction *Inst, ScopStmt *UserStmt, Loop *UserScope, const ValueMapT &GlobalMap, SetVector< Value * > &Values, SetVector< const SCEV * > &SCEVs)
static void findReferencesInStmt (ScopStmt *Stmt, SetVector< Value * > &Values, ValueMapT &GlobalMap, SetVector< const SCEV * > &SCEVs)
static void addReferencesFromStmtSet (isl::set Set, SubtreeReferences *UserPtr)
 Extract the out-of-scop values and SCEVs referenced from a set describing a ScopStmt.
static void addReferencesFromStmtUnionSet (isl::union_set USet, SubtreeReferences &References)
 Extract the out-of-scop values and SCEVs referenced from a union set referencing multiple ScopStmts.
static bool IsLoopVectorizerDisabled (isl::ast_node_for Node)
 Restore the initial ordering of dimensions of the band node.
static bool hasLoopCarriedDependence (isl::ast_node_for For, const Scop &S)
 Returns true if the loop has a dist=1 dependence involving FP operations (array-carried RAW/WAW or scalar FP reduction).

Variables

llvm::cl::opt< bool > PollyVectorizeMetadata

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "polly-codegen"

Definition at line 80 of file IslNodeBuilder.cpp.

Enumeration Type Documentation

◆ OpenMPBackend

enum class OpenMPBackend
strong

OpenMP backend options.

Enumerator
GNU 
LLVM 

Definition at line 89 of file IslNodeBuilder.cpp.

Function Documentation

◆ addReferencesFromStmtSet()

void addReferencesFromStmtSet ( isl::set Set,
SubtreeReferences * UserPtr )
static

Extract the out-of-scop values and SCEVs referenced from a set describing a ScopStmt.

This includes the SCEVUnknowns referenced by the SCEVs used in the statement and the base pointers of the memory accesses. For scalar statements we force the generation of alloca memory locations and list these locations in the set of out-of-scop values as well.

Parameters
SetA set which references the ScopStmt we are interested in.
UserPtrA void pointer that can be casted to a SubtreeReferences structure.

Definition at line 293 of file IslNodeBuilder.cpp.

References polly::addReferencesFromStmt().

Referenced by addReferencesFromStmtUnionSet().

◆ addReferencesFromStmtUnionSet()

void addReferencesFromStmtUnionSet ( isl::union_set USet,
SubtreeReferences & References )
static

Extract the out-of-scop values and SCEVs referenced from a union set referencing multiple ScopStmts.

This includes the SCEVUnknowns referenced by the SCEVs used in the statement and the base pointers of the memory accesses. For scalar statements we force the generation of alloca memory locations and list these locations in the set of out-of-scop values as well.

Parameters
USetA union set referencing the ScopStmts we are interested in.
ReferencesThe SubtreeReferences data structure through which results are returned and further information is provided.

Definition at line 312 of file IslNodeBuilder.cpp.

References addReferencesFromStmtSet(), and isl::checked::union_set::get_set_list().

Referenced by polly::IslNodeBuilder::getReferencesInSubtree().

◆ findReferencesByUse()

void findReferencesByUse ( Value * SrcVal,
ScopStmt * UserStmt,
Loop * UserScope,
const ValueMapT & GlobalMap,
SetVector< Value * > & Values,
SetVector< const SCEV * > & SCEVs )
static

◆ findReferencesInInst()

void findReferencesInInst ( Instruction * Inst,
ScopStmt * UserStmt,
Loop * UserScope,
const ValueMapT & GlobalMap,
SetVector< Value * > & Values,
SetVector< const SCEV * > & SCEVs )
static

Definition at line 225 of file IslNodeBuilder.cpp.

References findReferencesByUse().

Referenced by findReferencesInStmt().

◆ findReferencesInStmt()

void findReferencesInStmt ( ScopStmt * Stmt,
SetVector< Value * > & Values,
ValueMapT & GlobalMap,
SetVector< const SCEV * > & SCEVs )
static

◆ hasLoopCarriedDependence()

bool hasLoopCarriedDependence ( isl::ast_node_for For,
const Scop & S )
static

Returns true if the loop has a dist=1 dependence involving FP operations (array-carried RAW/WAW or scalar FP reduction).

In that case we omit the vectorize.enable annotation and let the Loop Vectorizer decide.

Definition at line 442 of file IslNodeBuilder.cpp.

References isl::checked::pw_aff::copy(), domain, isl::checked::pw_aff::get(), polly::IslAstInfo::getMinimalDependenceDistance(), polly::IslAstInfo::getSchedule(), isl::checked::pw_aff::is_null(), isl_bool_true, isl_pw_aff_domain(), isl_pw_aff_is_equal(), isl::checked::manage(), isl::val::one(), and S.

Referenced by polly::IslNodeBuilder::createForSequential().

◆ IsLoopVectorizerDisabled()

bool IsLoopVectorizerDisabled ( isl::ast_node_for Node)
static

Restore the initial ordering of dimensions of the band node.

In case the band node represents all the dimensions of the iteration domain, recreate the band node to restore the initial ordering of the dimensions.

Parameters
NodeThe band node to be modified.
Returns
The modified schedule node.

Definition at line 426 of file IslNodeBuilder.cpp.

References isl::checked::ast_node::as(), assert, isl::checked::ast_node_for::body(), isl::checked::ast_node::get(), isl::checked::ast_node_mark::id(), isl_ast_node_for, isl_ast_node_get_type(), and isl_ast_node_mark.

Referenced by polly::IslNodeBuilder::createForSequential().

◆ PollyGenerateExpressions()

cl::opt< bool > PollyGenerateExpressions ( "polly-codegen-generate-expressions" ,
cl::desc("Generate AST expressions for unmodified and modified accesses") ,
cl::Hidden ,
cl::cat(PollyCategory)  )
static

◆ PollyGenerateRTCPrint()

cl::opt< bool > PollyGenerateRTCPrint ( "polly-codegen-emit-rtc-print" ,
cl::desc("Emit code that prints the runtime check result dynamically.") ,
cl::Hidden ,
cl::cat(PollyCategory)  )
static

◆ PollyOmpBackend()

cl::opt< OpenMPBackend > PollyOmpBackend ( "polly-omp-backend" ,
cl::desc("Choose the OpenMP library to use:") ,
cl::values(clEnumValN(OpenMPBackend::GNU, "GNU", "GNU OpenMP"), clEnumValN(OpenMPBackend::LLVM, "LLVM", "LLVM OpenMP")) ,
cl::Hidden ,
cl::init(OpenMPBackend::GNU) ,
cl::cat(PollyCategory)  )
static

◆ PollyTargetFirstLevelCacheLineSize()

cl::opt< int > PollyTargetFirstLevelCacheLineSize ( "polly-target-first-level-cache-line-size" ,
cl::desc("The size of the first level cache line size specified in bytes.") ,
cl::Hidden ,
cl::init(64) ,
cl::cat(PollyCategory)  )
static

◆ STATISTIC() [1/4]

STATISTIC ( IfConditions ,
"Number of generated if-conditions"  )

◆ STATISTIC() [2/4]

STATISTIC ( ParallelLoops ,
"Number of generated parallel for-loops"  )

◆ STATISTIC() [3/4]

STATISTIC ( SequentialLoops ,
"Number of generated sequential for-loops"  )

◆ STATISTIC() [4/4]

STATISTIC ( VersionedScops ,
"Number of SCoPs that required versioning."  )

Variable Documentation

◆ PollyVectorizeMetadata

llvm::cl::opt<bool> PollyVectorizeMetadata
extern