summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2016-05-10 12:19:47 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2016-05-10 12:19:47 +0000
commit2640454d1ccdaf5ad788ffb0ee9f359fcaa84e74 (patch)
tree0bd7b524c457e393a81375600bee1b668a52b376
parenta60ad845c07e050120c919e0e3cbb68c8650cb2c (diff)
downloadbcm5719-llvm-2640454d1ccdaf5ad788ffb0ee9f359fcaa84e74.tar.gz
bcm5719-llvm-2640454d1ccdaf5ad788ffb0ee9f359fcaa84e74.zip
Refactor simplifySCoP [NFC]
Remove obsolete code and decrease the indention in the Scop::simplifySCoP() function. llvm-svn: 269049
-rw-r--r--polly/include/polly/ScopInfo.h23
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp67
-rw-r--r--polly/test/Isl/CodeGen/only_non_affine_error_region.ll31
3 files changed, 49 insertions, 72 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index ba086f8facf..75eb2547f85 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -1156,10 +1156,6 @@ public:
/// statements, return its entry block.
BasicBlock *getEntryBlock() const;
- /// @brief Return RegionInfo's RegionNode for this statements' BB or
- /// subregion.
- RegionNode *getRegionNode() const;
-
/// @brief Return true if this statement does not contain any accesses.
bool isEmpty() const { return MemAccs.empty(); }
@@ -1614,28 +1610,11 @@ private:
bool buildDomains(Region *R, ScopDetection &SD, DominatorTree &DT,
LoopInfo &LI);
- /// @brief Check if a region part should be represented in the SCoP or not.
- ///
- /// If @p RN does not contain any useful calculation or is only reachable
- /// via error blocks we do not model it in the polyhedral representation.
- ///
- /// @param RN The region part to check.
- /// @param DT The DominatorTree for the current function.
- /// @param LI The LoopInfo for the current function.
- ///
- /// @return True if the part should be ignored, otherwise false.
- bool isIgnored(RegionNode *RN, DominatorTree &DT, LoopInfo &LI);
-
/// @brief Add parameter constraints to @p C that imply a non-empty domain.
__isl_give isl_set *addNonEmptyDomainConstraints(__isl_take isl_set *C) const;
/// @brief Simplify the SCoP representation
- ///
- /// At the moment we perform the following simplifications:
- /// - removal of no-op statements
- /// @param RemoveIgnoredStmts If true, also removed ignored statments.
- /// @see isIgnored()
- void simplifySCoP(bool RemoveIgnoredStmts, DominatorTree &DT, LoopInfo &LI);
+ void simplifySCoP(bool AfterHoisting, DominatorTree &DT, LoopInfo &LI);
/// @brief Create equivalence classes for required invariant accesses.
///
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 72f4e25c539..cb192f8e966 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -1657,12 +1657,6 @@ BasicBlock *ScopStmt::getEntryBlock() const {
return getRegion()->getEntry();
}
-RegionNode *ScopStmt::getRegionNode() const {
- if (isRegionStmt())
- return getRegion()->getNode();
- return getParent()->getRegion().getBBNode(getBasicBlock());
-}
-
unsigned ScopStmt::getNumParams() const { return Parent.getNumParams(); }
unsigned ScopStmt::getNumIterators() const { return NestLoops.size(); }
@@ -2274,7 +2268,7 @@ bool Scop::buildDomains(Region *R, ScopDetection &SD, DominatorTree &DT,
DomainMap[EntryBB] = S;
if (IsOnlyNonAffineRegion)
- return true;
+ return !containsErrorBlock(R->getNode(), *R, LI, DT);
if (!buildDomainsWithBranchConstraints(R, SD, DT, LI))
return false;
@@ -3087,9 +3081,9 @@ void Scop::init(AliasAnalysis &AA, AssumptionCache &AC, ScopDetection &SD,
addUserAssumptions(AC, DT, LI);
- // Remove empty and ignored statements.
+ // Remove empty statements.
// Exit early in case there are no executable statements left in this scop.
- simplifySCoP(true, DT, LI);
+ simplifySCoP(false, DT, LI);
if (Stmts.empty())
return;
@@ -3116,7 +3110,7 @@ void Scop::init(AliasAnalysis &AA, AssumptionCache &AC, ScopDetection &SD,
hoistInvariantLoads(SD);
verifyInvariantLoads(SD);
- simplifySCoP(false, DT, LI);
+ simplifySCoP(true, DT, LI);
}
Scop::~Scop() {
@@ -3180,20 +3174,16 @@ void Scop::updateAccessDimensionality() {
Access->updateDimensionality();
}
-void Scop::simplifySCoP(bool RemoveIgnoredStmts, DominatorTree &DT,
- LoopInfo &LI) {
+void Scop::simplifySCoP(bool AfterHoisting, DominatorTree &DT, LoopInfo &LI) {
for (auto StmtIt = Stmts.begin(), StmtEnd = Stmts.end(); StmtIt != StmtEnd;) {
ScopStmt &Stmt = *StmtIt;
- RegionNode *RN = Stmt.getRegionNode();
- bool RemoveStmt = StmtIt->isEmpty();
+ bool RemoveStmt = Stmt.isEmpty();
if (!RemoveStmt)
RemoveStmt = isl_set_is_empty(DomainMap[Stmt.getEntryBlock()]);
- if (!RemoveStmt)
- RemoveStmt = (RemoveIgnoredStmts && isIgnored(RN, DT, LI));
// Remove read only statements only after invariant loop hoisting.
- if (!RemoveStmt && !RemoveIgnoredStmts) {
+ if (!RemoveStmt && AfterHoisting) {
bool OnlyRead = true;
for (MemoryAccess *MA : Stmt) {
if (MA->isRead())
@@ -3206,19 +3196,19 @@ void Scop::simplifySCoP(bool RemoveIgnoredStmts, DominatorTree &DT,
RemoveStmt = OnlyRead;
}
- if (RemoveStmt) {
- // Remove the statement because it is unnecessary.
- if (Stmt.isRegionStmt())
- for (BasicBlock *BB : Stmt.getRegion()->blocks())
- StmtMap.erase(BB);
- else
- StmtMap.erase(Stmt.getBasicBlock());
-
- StmtIt = Stmts.erase(StmtIt);
+ if (!RemoveStmt) {
+ StmtIt++;
continue;
}
- StmtIt++;
+ // Remove the statement because it is unnecessary.
+ if (Stmt.isRegionStmt())
+ for (BasicBlock *BB : Stmt.getRegion()->blocks())
+ StmtMap.erase(BB);
+ else
+ StmtMap.erase(Stmt.getBasicBlock());
+
+ StmtIt = Stmts.erase(StmtIt);
}
}
@@ -3922,29 +3912,6 @@ bool Scop::restrictDomains(__isl_take isl_union_set *Domain) {
ScalarEvolution *Scop::getSE() const { return SE; }
-bool Scop::isIgnored(RegionNode *RN, DominatorTree &DT, LoopInfo &LI) {
- BasicBlock *BB = getRegionNodeBasicBlock(RN);
- ScopStmt *Stmt = getStmtFor(RN);
-
- // If there is no stmt, then it already has been removed.
- if (!Stmt)
- return true;
-
- // Check if there are accesses contained.
- if (Stmt->isEmpty())
- return true;
-
- // Check for reachability via non-error blocks.
- if (!DomainMap.count(BB))
- return true;
-
- // Check if error blocks are contained.
- if (containsErrorBlock(RN, getRegion(), LI, DT))
- return true;
-
- return false;
-}
-
struct MapToDimensionDataTy {
int N;
isl_union_pw_multi_aff *Res;
diff --git a/polly/test/Isl/CodeGen/only_non_affine_error_region.ll b/polly/test/Isl/CodeGen/only_non_affine_error_region.ll
new file mode 100644
index 00000000000..e8ba7686343
--- /dev/null
+++ b/polly/test/Isl/CodeGen/only_non_affine_error_region.ll
@@ -0,0 +1,31 @@
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+;
+; CHECK-NOT: polly.start
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: nounwind uwtable
+define void @f(i32 %argc, i32* %A) #0 {
+entry:
+ br i1 undef, label %for.end, label %for.body
+
+for.body: ; preds = %entry
+ br label %for.end
+
+for.end: ; preds = %for.body, %entry
+ %i.2 = phi i32 [ 1, %entry ], [ 1, %for.body ]
+ %cmp170 = icmp eq i32 %i.2, %argc
+ br i1 %cmp170, label %if.then172, label %if.end174
+
+if.then172: ; preds = %for.end
+ %0 = load i32, i32* %A
+ tail call void @usage()
+ br label %if.end174
+
+if.end174: ; preds = %if.then172, %for.end
+ %idxprom175 = sext i32 %i.2 to i64
+ ret void
+}
+
+; Function Attrs: nounwind uwtable
+declare void @usage()
OpenPOWER on IntegriCloud