diff options
author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-05-10 12:19:47 +0000 |
---|---|---|
committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-05-10 12:19:47 +0000 |
commit | 2640454d1ccdaf5ad788ffb0ee9f359fcaa84e74 (patch) | |
tree | 0bd7b524c457e393a81375600bee1b668a52b376 | |
parent | a60ad845c07e050120c919e0e3cbb68c8650cb2c (diff) | |
download | bcm5719-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.h | 23 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 67 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/only_non_affine_error_region.ll | 31 |
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() |