summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/CodeGen/CodeGeneration.h9
-rw-r--r--polly/include/polly/ScopDetection.h3
-rw-r--r--polly/include/polly/ScopInfo.h42
-rw-r--r--polly/include/polly/Support/GICHelper.h6
-rw-r--r--polly/lib/Analysis/ScopDetection.cpp35
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp129
-rw-r--r--polly/lib/CodeGen/IslAst.cpp28
-rw-r--r--polly/lib/CodeGen/IslCodeGeneration.cpp4
-rw-r--r--polly/lib/CodeGen/IslExprBuilder.cpp6
-rw-r--r--polly/lib/Support/RegisterPasses.cpp17
-rw-r--r--polly/test/Isl/CodeGen/MemAccess/simple_analyze.ll4
-rw-r--r--polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll2
-rw-r--r--polly/test/ScopInfo/Alias-0.ll6
-rw-r--r--polly/test/ScopInfo/Alias-1.ll6
-rw-r--r--polly/test/ScopInfo/Alias-2.ll6
-rw-r--r--polly/test/ScopInfo/Alias-3.ll6
-rw-r--r--polly/test/ScopInfo/Alias-4.ll6
17 files changed, 283 insertions, 32 deletions
diff --git a/polly/include/polly/CodeGen/CodeGeneration.h b/polly/include/polly/CodeGen/CodeGeneration.h
index f5be3739132..f8273c36669 100644
--- a/polly/include/polly/CodeGen/CodeGeneration.h
+++ b/polly/include/polly/CodeGen/CodeGeneration.h
@@ -27,6 +27,15 @@ enum VectorizerChoice {
};
extern VectorizerChoice PollyVectorizerChoice;
+enum CodeGenChoice {
+#ifdef CLOOG_FOUND
+ CODEGEN_CLOOG,
+#endif
+ CODEGEN_ISL,
+ CODEGEN_NONE
+};
+extern CodeGenChoice PollyCodeGenChoice;
+
static inline int getNumberOfIterations(__isl_take isl_set *Domain) {
int Dim = isl_set_dim(Domain, isl_dim_set);
diff --git a/polly/include/polly/ScopDetection.h b/polly/include/polly/ScopDetection.h
index af72eabd573..c04b2c22523 100644
--- a/polly/include/polly/ScopDetection.h
+++ b/polly/include/polly/ScopDetection.h
@@ -109,6 +109,7 @@ typedef std::map<const SCEVUnknown *, const SCEV *> BaseToElSize;
extern bool PollyTrackFailures;
extern bool PollyDelinearize;
+extern bool PollyUseRuntimeAliasChecks;
/// @brief A function attribute which will cause Polly to skip the function
extern llvm::StringRef PollySkipFnAttr;
@@ -278,7 +279,7 @@ class ScopDetection : public FunctionPass {
public:
static char ID;
- explicit ScopDetection() : FunctionPass(ID) {}
+ explicit ScopDetection();
/// @brief Get the RegionInfo stored in this pass.
///
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index bf8ecef19cb..0f2913c1f0c 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -47,6 +47,7 @@ struct isl_union_set;
struct isl_union_map;
struct isl_space;
struct isl_constraint;
+struct isl_pw_multi_aff;
namespace polly {
@@ -493,7 +494,17 @@ static inline raw_ostream &operator<<(raw_ostream &O, const ScopStmt &S) {
/// This context contains information about the values the parameters
/// can take and relations between different parameters.
class Scop {
- //===-------------------------------------------------------------------===//
+public:
+ /// @brief Type to represent a pair of minimal/maximal access to an array.
+ using MinMaxAccessTy = std::pair<isl_pw_multi_aff *, isl_pw_multi_aff *>;
+
+ /// @brief Vector of minimal/maximal accesses to different arrays.
+ using MinMaxVectorTy = SmallVector<MinMaxAccessTy, 4>;
+
+ /// @brief Vector of minimal/maximal access vectors one for each alias group.
+ using MinMaxVectorVectorTy = SmallVector<MinMaxVectorTy *, 4>;
+
+private:
Scop(const Scop &) LLVM_DELETED_FUNCTION;
const Scop &operator=(const Scop &) LLVM_DELETED_FUNCTION;
@@ -532,6 +543,21 @@ class Scop {
/// this scop and that need to be code generated as a run-time test.
isl_set *AssumedContext;
+ /// @brief The set of minimal/maximal accesses for each alias group.
+ ///
+ /// When building runtime alias checks we look at all memory instructions and
+ /// build so called alias groups. Each group contains a set of accesses to
+ /// different base arrays which might alias with each other. However, between
+ /// alias groups there is no aliasing possible.
+ ///
+ /// In a program with int and float pointers annotated with tbaa information
+ /// we would probably generate two alias groups, one for the int pointers and
+ /// one for the float pointers.
+ ///
+ /// During code generation we will create a runtime alias check for each alias
+ /// group to ensure the SCoP is executed in an alias free environment.
+ MinMaxVectorVectorTy MinMaxAliasGroups;
+
/// Create the static control part with a region, max loop depth of this
/// region and parameters used in this region.
Scop(TempScop &TempScop, LoopInfo &LI, ScalarEvolution &SE, isl_ctx *ctx);
@@ -563,9 +589,13 @@ class Scop {
// The scattering numbers
SmallVectorImpl<unsigned> &Scatter, LoopInfo &LI);
- /// Helper function for printing the Scop.
+ /// @name Helper function for printing the Scop.
+ ///
+ ///{
void printContext(raw_ostream &OS) const;
void printStatements(raw_ostream &OS) const;
+ void printAliasAssumptions(raw_ostream &OS) const;
+ ///}
friend class ScopInfo;
@@ -661,6 +691,14 @@ public:
/// to hold.
void addAssumption(__isl_take isl_set *Set);
+ /// @brief Build all alias groups for this SCoP.
+ void buildAliasGroups(AliasAnalysis &AA);
+
+ /// @brief Return all alias groups for this SCoP.
+ const MinMaxVectorVectorTy &getAliasGroups() const {
+ return MinMaxAliasGroups;
+ }
+
/// @brief Get an isl string representing the context.
std::string getContextStr() const;
diff --git a/polly/include/polly/Support/GICHelper.h b/polly/include/polly/Support/GICHelper.h
index 39c2336ae15..c5fb4a10f79 100644
--- a/polly/include/polly/Support/GICHelper.h
+++ b/polly/include/polly/Support/GICHelper.h
@@ -65,6 +65,12 @@ inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
return OS;
}
+inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
+ __isl_keep isl_pw_multi_aff *PMA) {
+ OS << polly::stringFromIslObj(PMA);
+ return OS;
+}
+
/// @brief Return @p Prefix + @p Val->getName() + @p Suffix but Isl compatible.
std::string getIslCompatibleName(std::string Prefix, const llvm::Value *Val,
std::string Suffix);
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index 1adca2e08de..11edd13bf1a 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -51,6 +51,7 @@
#include "polly/ScopDetection.h"
#include "polly/Support/SCEVValidator.h"
#include "polly/Support/ScopHelper.h"
+#include "polly/CodeGen/CodeGeneration.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
@@ -101,6 +102,13 @@ static cl::opt<bool>
cl::Hidden, cl::init(false), cl::ZeroOrMore,
cl::cat(PollyCategory));
+bool polly::PollyUseRuntimeAliasChecks;
+static cl::opt<bool, true> XPollyUseRuntimeAliasChecks(
+ "polly-use-runtime-alias-checks",
+ cl::desc("Use runtime alias checks to resolve possible aliasing."),
+ cl::location(PollyUseRuntimeAliasChecks), cl::Hidden, cl::ZeroOrMore,
+ cl::init(true), cl::cat(PollyCategory));
+
static cl::opt<bool>
ReportLevel("polly-report",
cl::desc("Print information about the activities of Polly"),
@@ -184,6 +192,31 @@ void DiagnosticScopFound::print(DiagnosticPrinter &DP) const {
//===----------------------------------------------------------------------===//
// ScopDetection.
+ScopDetection::ScopDetection() : FunctionPass(ID) {
+ if (!PollyUseRuntimeAliasChecks)
+ return;
+
+ if (PollyDelinearize) {
+ DEBUG(errs() << "WARNING: We disable runtime alias checks as "
+ "delinearization is enabled.\n");
+ PollyUseRuntimeAliasChecks = false;
+ }
+
+ if (AllowNonAffine) {
+ DEBUG(errs() << "WARNING: We disable runtime alias checks as non affine "
+ "accesses are enabled.\n");
+ PollyUseRuntimeAliasChecks = false;
+ }
+
+#ifdef CLOOG_FOUND
+ if (PollyCodeGenChoice == CODEGEN_CLOOG) {
+ DEBUG(errs() << "WARNING: We disable runtime alias checks as the cloog "
+ "code generation cannot emit them.\n");
+ PollyUseRuntimeAliasChecks = false;
+ }
+#endif
+}
+
template <class RR, typename... Args>
inline bool ScopDetection::invalid(DetectionContext &Context, bool Assert,
Args &&... Arguments) const {
@@ -499,7 +532,7 @@ bool ScopDetection::isValidMemoryAccess(Instruction &Inst,
if (IntToPtrInst *Inst = dyn_cast<IntToPtrInst>(BaseValue))
return invalid<ReportIntToPtr>(Context, /*Assert=*/true, Inst);
- if (IgnoreAliasing)
+ if (PollyUseRuntimeAliasChecks || IgnoreAliasing)
return true;
// Check if the base pointer of the memory access does alias with
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 3d7428bc406..b1f18961e95 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -29,6 +29,7 @@
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/RegionIterator.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/Support/Debug.h"
@@ -1128,6 +1129,104 @@ void Scop::simplifyAssumedContext() {
isl_set_gist_params(AssumedContext, isl_union_set_params(getDomains()));
}
+/// @brief Add the minimal/maximal access in @p Set to @p User.
+static int buildMinMaxAccess(__isl_take isl_set *Set, void *User) {
+ Scop::MinMaxVectorTy *MinMaxAccesses = (Scop::MinMaxVectorTy *)User;
+ isl_pw_multi_aff *MinPMA, *MaxPMA;
+ isl_pw_aff *LastDimAff;
+ isl_aff *OneAff;
+ unsigned Pos;
+
+ MinPMA = isl_set_lexmin_pw_multi_aff(isl_set_copy(Set));
+ MaxPMA = isl_set_lexmax_pw_multi_aff(isl_set_copy(Set));
+
+ // Adjust the last dimension of the maximal access by one as we want to
+ // enclose the accessed memory region by MinPMA and MaxPMA. The pointer
+ // we test during code generation might now point after the end of the
+ // allocated array but we will never dereference it anyway.
+ assert(isl_pw_multi_aff_dim(MaxPMA, isl_dim_out) &&
+ "Assumed at least one output dimension");
+ Pos = isl_pw_multi_aff_dim(MaxPMA, isl_dim_out) - 1;
+ LastDimAff = isl_pw_multi_aff_get_pw_aff(MaxPMA, Pos);
+ OneAff = isl_aff_zero_on_domain(
+ isl_local_space_from_space(isl_pw_aff_get_domain_space(LastDimAff)));
+ OneAff = isl_aff_add_constant_si(OneAff, 1);
+ LastDimAff = isl_pw_aff_add(LastDimAff, isl_pw_aff_from_aff(OneAff));
+ MaxPMA = isl_pw_multi_aff_set_pw_aff(MaxPMA, Pos, LastDimAff);
+
+ MinMaxAccesses->push_back(std::make_pair(MinPMA, MaxPMA));
+
+ isl_set_free(Set);
+ return 0;
+}
+
+void Scop::buildAliasGroups(AliasAnalysis &AA) {
+ // To create sound alias checks we perform the following steps:
+ // o) Use the alias analysis and an alias set tracker to build alias sets
+ // for all memory accesses inside the SCoP.
+ // o) For each alias set we then map the aliasing pointers back to the
+ // memory accesses we know, thus obtain groups of memory accesses which
+ // might alias.
+ // o) For each group with more then one base pointer we then compute minimal
+ // and maximal accesses to each array in this group.
+ using AliasGroupTy = SmallVector<MemoryAccess *, 4>;
+
+ AliasSetTracker AST(AA);
+
+ DenseMap<Value *, MemoryAccess *> PtrToAcc;
+ for (ScopStmt *Stmt : *this) {
+ for (MemoryAccess *MA : *Stmt) {
+ if (MA->isScalar())
+ continue;
+ Instruction *Acc = MA->getAccessInstruction();
+ PtrToAcc[getPointerOperand(*Acc)] = MA;
+ AST.add(Acc);
+ }
+ }
+
+ SmallVector<AliasGroupTy, 4> AliasGroups;
+ for (AliasSet &AS : AST) {
+ if (AS.isMustAlias())
+ continue;
+ AliasGroupTy AG;
+ for (auto PR : AS)
+ AG.push_back(PtrToAcc[PR.getValue()]);
+ assert(AG.size() > 1 &&
+ "Alias groups should contain at least two accesses");
+ AliasGroups.push_back(std::move(AG));
+ }
+
+ SmallPtrSet<const Value *, 4> BaseValues;
+ for (auto I = AliasGroups.begin(); I != AliasGroups.end();) {
+ BaseValues.clear();
+ for (MemoryAccess *MA : *I)
+ BaseValues.insert(MA->getBaseAddr());
+ if (BaseValues.size() > 1)
+ I++;
+ else
+ I = AliasGroups.erase(I);
+ }
+
+ for (AliasGroupTy &AG : AliasGroups) {
+ MinMaxVectorTy *MinMaxAccesses = new MinMaxVectorTy();
+ MinMaxAccesses->reserve(AG.size());
+
+ isl_union_map *Accesses = isl_union_map_empty(getParamSpace());
+ for (MemoryAccess *MA : AG)
+ Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation());
+ Accesses = isl_union_map_intersect_domain(Accesses, getDomains());
+
+ isl_union_set *Locations = isl_union_map_range(Accesses);
+ Locations = isl_union_set_intersect_params(Locations, getAssumedContext());
+ Locations = isl_union_set_coalesce(Locations);
+ Locations = isl_union_set_detect_equalities(Locations);
+ isl_union_set_foreach_set(Locations, buildMinMaxAccess, MinMaxAccesses);
+ isl_union_set_free(Locations);
+
+ MinMaxAliasGroups.push_back(MinMaxAccesses);
+ }
+}
+
Scop::Scop(TempScop &tempScop, LoopInfo &LI, ScalarEvolution &ScalarEvolution,
isl_ctx *Context)
: SE(&ScalarEvolution), R(tempScop.getMaxRegion()),
@@ -1158,6 +1257,15 @@ Scop::~Scop() {
// Free the statements;
for (ScopStmt *Stmt : *this)
delete Stmt;
+
+ // Free the alias groups
+ for (MinMaxVectorTy *MinMaxAccesses : MinMaxAliasGroups) {
+ for (MinMaxAccessTy &MMA : *MinMaxAccesses) {
+ isl_pw_multi_aff_free(MMA.first);
+ isl_pw_multi_aff_free(MMA.second);
+ }
+ delete MinMaxAccesses;
+ }
}
std::string Scop::getContextStr() const { return stringFromIslObj(Context); }
@@ -1219,6 +1327,20 @@ void Scop::printContext(raw_ostream &OS) const {
}
}
+void Scop::printAliasAssumptions(raw_ostream &OS) const {
+ OS.indent(4) << "Alias Groups (" << MinMaxAliasGroups.size() << "):\n";
+ if (MinMaxAliasGroups.empty()) {
+ OS.indent(8) << "n/a\n";
+ return;
+ }
+ for (MinMaxVectorTy *MinMaxAccesses : MinMaxAliasGroups) {
+ OS.indent(8) << "[[";
+ for (MinMaxAccessTy &MinMacAccess : *MinMaxAccesses)
+ OS << " <" << MinMacAccess.first << ", " << MinMacAccess.second << ">";
+ OS << " ]]\n";
+ }
+}
+
void Scop::printStatements(raw_ostream &OS) const {
OS << "Statements {\n";
@@ -1233,6 +1355,7 @@ void Scop::print(raw_ostream &OS) const {
<< "\n";
OS.indent(4) << "Region: " << getNameStr() << "\n";
printContext(OS.indent(4));
+ printAliasAssumptions(OS);
printStatements(OS.indent(4));
}
@@ -1419,11 +1542,13 @@ void ScopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<RegionInfoPass>();
AU.addRequired<ScalarEvolution>();
AU.addRequired<TempScopInfo>();
+ AU.addRequired<AliasAnalysis>();
AU.setPreservesAll();
}
bool ScopInfo::runOnRegion(Region *R, RGPassManager &RGM) {
LoopInfo &LI = getAnalysis<LoopInfo>();
+ AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
ScalarEvolution &SE = getAnalysis<ScalarEvolution>();
TempScop *tempScop = getAnalysis<TempScopInfo>().getTempScop(R);
@@ -1441,6 +1566,9 @@ bool ScopInfo::runOnRegion(Region *R, RGPassManager &RGM) {
scop = new Scop(*tempScop, LI, SE, ctx);
+ if (PollyUseRuntimeAliasChecks)
+ scop->buildAliasGroups(AA);
+
return false;
}
@@ -1451,6 +1579,7 @@ Pass *polly::createScopInfoPass() { return new ScopInfo(); }
INITIALIZE_PASS_BEGIN(ScopInfo, "polly-scops",
"Polly - Create polyhedral description of Scops", false,
false);
+INITIALIZE_AG_DEPENDENCY(AliasAnalysis);
INITIALIZE_PASS_DEPENDENCY(LoopInfo);
INITIALIZE_PASS_DEPENDENCY(RegionInfoPass);
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution);
diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp
index 81fb8d74362..9c5070ecd6e 100644
--- a/polly/lib/CodeGen/IslAst.cpp
+++ b/polly/lib/CodeGen/IslAst.cpp
@@ -310,6 +310,34 @@ void IslAst::buildRunCondition(__isl_keep isl_ast_build *Build) {
isl_pw_aff *Cond = isl_pw_aff_union_max(PwOne, PwZero);
RunCondition = isl_ast_build_expr_from_pw_aff(Build, Cond);
+
+ // Create the alias checks from the minimal/maximal accesses in each alias
+ // group. This operation is by construction quadratic in the number of
+ // elements in each alias group.
+ isl_ast_expr *NonAliasGroup, *MinExpr, *MaxExpr;
+ for (const Scop::MinMaxVectorTy *MinMaxAccesses : S->getAliasGroups()) {
+ auto AccEnd = MinMaxAccesses->end();
+ for (auto AccIt0 = MinMaxAccesses->begin(); AccIt0 != AccEnd; ++AccIt0) {
+ for (auto AccIt1 = AccIt0 + 1; AccIt1 != AccEnd; ++AccIt1) {
+ MinExpr =
+ isl_ast_expr_address_of(isl_ast_build_access_from_pw_multi_aff(
+ Build, isl_pw_multi_aff_copy(AccIt0->first)));
+ MaxExpr =
+ isl_ast_expr_address_of(isl_ast_build_access_from_pw_multi_aff(
+ Build, isl_pw_multi_aff_copy(AccIt1->second)));
+ NonAliasGroup = isl_ast_expr_le(MaxExpr, MinExpr);
+ MinExpr =
+ isl_ast_expr_address_of(isl_ast_build_access_from_pw_multi_aff(
+ Build, isl_pw_multi_aff_copy(AccIt1->first)));
+ MaxExpr =
+ isl_ast_expr_address_of(isl_ast_build_access_from_pw_multi_aff(
+ Build, isl_pw_multi_aff_copy(AccIt0->second)));
+ NonAliasGroup =
+ isl_ast_expr_or(NonAliasGroup, isl_ast_expr_le(MaxExpr, MinExpr));
+ RunCondition = isl_ast_expr_and(RunCondition, NonAliasGroup);
+ }
+ }
+ }
}
IslAst::IslAst(Scop *Scop, Dependences &D) : S(Scop) {
diff --git a/polly/lib/CodeGen/IslCodeGeneration.cpp b/polly/lib/CodeGen/IslCodeGeneration.cpp
index 0d9a798de04..22a8fe51abf 100644
--- a/polly/lib/CodeGen/IslCodeGeneration.cpp
+++ b/polly/lib/CodeGen/IslCodeGeneration.cpp
@@ -591,7 +591,9 @@ public:
Value *buildRTC(PollyIRBuilder &Builder, IslExprBuilder &ExprBuilder) {
Builder.SetInsertPoint(Builder.GetInsertBlock()->getTerminator());
Value *RTC = ExprBuilder.create(AI->getRunCondition());
- return Builder.CreateIsNotNull(RTC);
+ if (!RTC->getType()->isIntegerTy(1))
+ RTC = Builder.CreateIsNotNull(RTC);
+ return RTC;
}
bool runOnScop(Scop &S) {
diff --git a/polly/lib/CodeGen/IslExprBuilder.cpp b/polly/lib/CodeGen/IslExprBuilder.cpp
index fe4be5dc2a8..18ba170dab9 100644
--- a/polly/lib/CodeGen/IslExprBuilder.cpp
+++ b/polly/lib/CodeGen/IslExprBuilder.cpp
@@ -333,8 +333,10 @@ Value *IslExprBuilder::createOpBoolean(__isl_take isl_ast_expr *Expr) {
//
// TODO: Document in isl itself, that the unconditionally evaluating the
// second part of '||' or '&&' expressions is safe.
- assert(LHS->getType() == Builder.getInt1Ty() && "Expected i1 type");
- assert(RHS->getType() == Builder.getInt1Ty() && "Expected i1 type");
+ if (!LHS->getType()->isIntegerTy(1))
+ LHS = Builder.CreateIsNotNull(LHS);
+ if (!RHS->getType()->isIntegerTy(1))
+ RHS = Builder.CreateIsNotNull(RHS);
switch (OpType) {
default:
diff --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp
index cf1a52b5c2a..7bc5973ff75 100644
--- a/polly/lib/Support/RegisterPasses.cpp
+++ b/polly/lib/Support/RegisterPasses.cpp
@@ -66,21 +66,14 @@ static cl::opt<OptimizerChoice> Optimizer(
cl::Hidden, cl::init(OPTIMIZER_ISL), cl::ZeroOrMore,
cl::cat(PollyCategory));
-enum CodeGenChoice {
-#ifdef CLOOG_FOUND
- CODEGEN_CLOOG,
-#endif
- CODEGEN_ISL,
- CODEGEN_NONE
-};
-
#ifdef CLOOG_FOUND
enum CodeGenChoice DefaultCodeGen = CODEGEN_CLOOG;
#else
enum CodeGenChoice DefaultCodeGen = CODEGEN_ISL;
#endif
-static cl::opt<CodeGenChoice> CodeGenerator(
+CodeGenChoice polly::PollyCodeGenChoice;
+static cl::opt<CodeGenChoice, true> XCodeGenerator(
"polly-code-generator", cl::desc("Select the code generator"),
cl::values(
#ifdef CLOOG_FOUND
@@ -88,8 +81,8 @@ static cl::opt<CodeGenChoice> CodeGenerator(
#endif
clEnumValN(CODEGEN_ISL, "isl", "isl code generator"),
clEnumValN(CODEGEN_NONE, "none", "no code generation"), clEnumValEnd),
- cl::Hidden, cl::init(DefaultCodeGen), cl::ZeroOrMore,
- cl::cat(PollyCategory));
+ cl::Hidden, cl::location(PollyCodeGenChoice), cl::init(DefaultCodeGen),
+ cl::ZeroOrMore, cl::cat(PollyCategory));
VectorizerChoice polly::PollyVectorizerChoice;
static cl::opt<polly::VectorizerChoice, true> Vectorizer(
@@ -238,7 +231,7 @@ static void registerPollyPasses(llvm::PassManagerBase &PM) {
if (ExportJScop)
PM.add(polly::createJSONExporterPass());
- switch (CodeGenerator) {
+ switch (PollyCodeGenChoice) {
#ifdef CLOOG_FOUND
case CODEGEN_CLOOG:
PM.add(polly::createCodeGenerationPass());
diff --git a/polly/test/Isl/CodeGen/MemAccess/simple_analyze.ll b/polly/test/Isl/CodeGen/MemAccess/simple_analyze.ll
index f217ff6ef50..637eb8defc8 100644
--- a/polly/test/Isl/CodeGen/MemAccess/simple_analyze.ll
+++ b/polly/test/Isl/CodeGen/MemAccess/simple_analyze.ll
@@ -43,5 +43,5 @@ for.inc11: ; preds = %for.body7
for.end14: ; preds = %for.cond4
ret i32 0
}
-; CHECK: New access function '{ Stmt_for_body7[i0] -> MemRef_B[0] }'detected in JSCOP file
-; CHECK: New access function '{ Stmt_for_body[i0] -> MemRef_A[0] }'detected in JSCOP file
+; CHECK-DAG: New access function '{ Stmt_for_body7[i0] -> MemRef_B[0] }'detected in JSCOP file
+; CHECK-DAG: New access function '{ Stmt_for_body[i0] -> MemRef_A[0] }'detected in JSCOP file
diff --git a/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll b/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll
index 2c8df670f7a..1e959a599c1 100644
--- a/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll
+++ b/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -pass-remarks-missed="polly-detect" -polly-detect-track-failures -polly-detect -analyze < %s 2>&1| FileCheck %s
+; RUN: opt %loadPolly -polly-use-runtime-alias-checks=false -pass-remarks-missed="polly-detect" -polly-detect-track-failures -polly-detect -analyze < %s 2>&1| FileCheck %s
;void f(int A[], int B[]) {
; for (int i=0; i<42; i++)
diff --git a/polly/test/ScopInfo/Alias-0.ll b/polly/test/ScopInfo/Alias-0.ll
index 84741314258..5faa9b67a76 100644
--- a/polly/test/ScopInfo/Alias-0.ll
+++ b/polly/test/ScopInfo/Alias-0.ll
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -polly-use-runtime-alias-checks=false -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA
; REQUIRES: asserts
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -32,4 +33,5 @@ return: ; preds = %bb3
declare i32 @rnd(...)
-; CHECK: 1 polly-detect - Number of bad regions for Scop: Found base address alias
+; RTA: 1 polly-detect - Number of regions that a valid part of Scop
+; NORTA: 1 polly-detect - Number of bad regions for Scop: Found base address alias
diff --git a/polly/test/ScopInfo/Alias-1.ll b/polly/test/ScopInfo/Alias-1.ll
index c8f0093bb25..aeb0c156fe1 100644
--- a/polly/test/ScopInfo/Alias-1.ll
+++ b/polly/test/ScopInfo/Alias-1.ll
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -polly-use-runtime-alias-checks=false -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA
; REQUIRES: asserts
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -33,4 +34,5 @@ return: ; preds = %bb3
declare i32 @rnd(...)
-; CHECK: 1 polly-detect - Number of bad regions for Scop: Found base address alias
+; RTA: 1 polly-detect - Number of regions that a valid part of Scop
+; NORTA: 1 polly-detect - Number of bad regions for Scop: Found base address alias
diff --git a/polly/test/ScopInfo/Alias-2.ll b/polly/test/ScopInfo/Alias-2.ll
index 3a70bf49f27..cd27ebfc01a 100644
--- a/polly/test/ScopInfo/Alias-2.ll
+++ b/polly/test/ScopInfo/Alias-2.ll
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -polly-use-runtime-alias-checks=false -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA
; REQUIRES: asserts
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -31,4 +32,5 @@ return: ; preds = %bb
ret void
}
-; CHECK: 1 polly-detect - Number of bad regions for Scop: Found base address alias
+; RTA: 1 polly-detect - Number of regions that a valid part of Scop
+; NORTA: 1 polly-detect - Number of bad regions for Scop: Found base address alias
diff --git a/polly/test/ScopInfo/Alias-3.ll b/polly/test/ScopInfo/Alias-3.ll
index 7ad9ad63067..440ea55864c 100644
--- a/polly/test/ScopInfo/Alias-3.ll
+++ b/polly/test/ScopInfo/Alias-3.ll
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -polly-use-runtime-alias-checks=false -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA
; REQUIRES: asserts
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -24,4 +25,5 @@ return: ; preds = %bb
}
-; CHECK: 1 polly-detect - Number of bad regions for Scop: Found base address alias
+; RTA: 1 polly-detect - Number of regions that a valid part of Scop
+; NORTA: 1 polly-detect - Number of bad regions for Scop: Found base address alias
diff --git a/polly/test/ScopInfo/Alias-4.ll b/polly/test/ScopInfo/Alias-4.ll
index a47f7994245..85a61585d69 100644
--- a/polly/test/ScopInfo/Alias-4.ll
+++ b/polly/test/ScopInfo/Alias-4.ll
@@ -1,4 +1,5 @@
-; RUN: opt %loadPolly -basicaa -polly-analyze-ir -analyze < %s -stats 2>&1 | not FileCheck %s
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA
+; RUN: opt %loadPolly -polly-code-generator=isl -polly-analyze-ir -polly-use-runtime-alias-checks=false -analyze < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA
; REQUIRES: asserts
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -24,4 +25,5 @@ return: ; preds = %bb
}
-; CHECK: Found base address alias
+; RTA: 1 polly-detect - Number of regions that a valid part of Scop
+; NORTA: 1 polly-detect - Number of bad regions for Scop: Found base address alias
OpenPOWER on IntegriCloud