[Polly] Refactor buildScop
authorMichael Kruse <llvm@meinersbur.de>
Mon, 10 Aug 2015 13:01:57 +0000 (13:01 +0000)
committerMichael Kruse <llvm@meinersbur.de>
Mon, 10 Aug 2015 13:01:57 +0000 (13:01 +0000)
Summary: The extracted function buildBBScopStmt will be needed later to be invoked individually on the region's exit block.

Reviewers: grosser, jdoerfert

Subscribers: jdoerfert, llvm-commits, pollydev

Projects: #polly

Differential Revision: http://reviews.llvm.org/D11878

llvm-svn: 244443

polly/include/polly/ScopInfo.h
polly/lib/Analysis/ScopInfo.cpp

index 5dfbe4e..592ec55 100644 (file)
@@ -888,6 +888,20 @@ private:
                         const Region &CurRegion,
                         SmallVectorImpl<Loop *> &NestLoops);
 
+  /// @brief Create the ScopStmt for a BasicBlock and return its schedule.
+  ///
+  /// Returns null if the BB is trivial and no stmt has been created.
+  ///
+  /// @param BB         The basic block we build the statement for.
+  /// @param tempScop   The temp SCoP we use as model.
+  /// @param CurRegion  The SCoP region.
+  /// @param NestLoops  A vector of all surrounding loops.
+  ///
+  /// @return The ScopStmt's schedule.
+  __isl_give isl_schedule *buildBBScopStmt(BasicBlock *BB, TempScop &tempScop,
+                                           const Region &CurRegion,
+                                           SmallVectorImpl<Loop *> &NestLoops);
+
   /// @brief Build Scop and ScopStmts from a given TempScop.
   ///
   /// @param TempScop  The temporary scop that is translated into an actual
index 8f9c117..29b099c 100644 (file)
@@ -76,6 +76,20 @@ static cl::opt<unsigned> RunTimeChecksMaxArraysPerGroup(
     cl::desc("The maximal number of arrays to compare in each alias group."),
     cl::Hidden, cl::ZeroOrMore, cl::init(20), cl::cat(PollyCategory));
 
+// Create a sequence of two schedules. Either argument may be null and is
+// interpreted as the empty schedule. Can also return null if both schedules are
+// empty.
+static __isl_give isl_schedule *
+combineInSequence(__isl_take isl_schedule *Prev,
+                  __isl_take isl_schedule *Succ) {
+  if (!Prev)
+    return Succ;
+  if (!Succ)
+    return Prev;
+
+  return isl_schedule_sequence(Prev, Succ);
+}
+
 /// Translate a 'const SCEV *' expression in an isl_pw_aff.
 struct SCEVAffinator : public SCEVVisitor<SCEVAffinator, isl_pw_aff *> {
 public:
@@ -2088,6 +2102,18 @@ ScopStmt *Scop::addScopStmt(BasicBlock *BB, Region *R, TempScop &tempScop,
   return Stmt;
 }
 
+__isl_give isl_schedule *
+Scop::buildBBScopStmt(BasicBlock *BB, TempScop &tempScop,
+                      const Region &CurRegion,
+                      SmallVectorImpl<Loop *> &NestLoops) {
+  if (isTrivialBB(BB, tempScop))
+    return nullptr;
+
+  auto *Stmt = addScopStmt(BB, nullptr, tempScop, CurRegion, NestLoops);
+  auto *Domain = Stmt->getDomain();
+  return isl_schedule_from_domain(isl_union_set_from_set(Domain));
+}
+
 __isl_give isl_schedule *Scop::buildScop(TempScop &tempScop,
                                          const Region &CurRegion,
                                          SmallVectorImpl<Loop *> &NestLoops,
@@ -2115,21 +2141,10 @@ __isl_give isl_schedule *Scop::buildScop(TempScop &tempScop,
       StmtSchedule =
           buildScop(tempScop, *I->getNodeAs<Region>(), NestLoops, LI, SD);
     } else {
-      BasicBlock *BB = I->getNodeAs<BasicBlock>();
-
-      if (isTrivialBB(BB, tempScop)) {
-        continue;
-      } else {
-        auto *Stmt = addScopStmt(BB, nullptr, tempScop, CurRegion, NestLoops);
-        auto *Domain = Stmt->getDomain();
-        StmtSchedule = isl_schedule_from_domain(isl_union_set_from_set(Domain));
-      }
+      StmtSchedule = buildBBScopStmt(I->getNodeAs<BasicBlock>(), tempScop,
+                                     CurRegion, NestLoops);
     }
-
-    if (!Schedule)
-      Schedule = StmtSchedule;
-    else if (StmtSchedule)
-      Schedule = isl_schedule_sequence(Schedule, StmtSchedule);
+    Schedule = combineInSequence(Schedule, StmtSchedule);
   }
 
   if (!L)