Index: include/polly/ScopInfo.h =================================================================== --- include/polly/ScopInfo.h +++ include/polly/ScopInfo.h @@ -888,6 +888,20 @@ const Region &CurRegion, SmallVectorImpl &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 &NestLoops); + /// @brief Build Scop and ScopStmts from a given TempScop. /// /// @param TempScop The temporary scop that is translated into an actual Index: lib/Analysis/ScopInfo.cpp =================================================================== --- lib/Analysis/ScopInfo.cpp +++ lib/Analysis/ScopInfo.cpp @@ -76,6 +76,20 @@ 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 { public: @@ -2088,6 +2102,18 @@ return Stmt; } +__isl_give isl_schedule * +Scop::buildBBScopStmt(BasicBlock *BB, TempScop &tempScop, + const Region &CurRegion, + SmallVectorImpl &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 &NestLoops, @@ -2115,21 +2141,10 @@ StmtSchedule = buildScop(tempScop, *I->getNodeAs(), NestLoops, LI, SD); } else { - BasicBlock *BB = I->getNodeAs(); - - 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(), tempScop, + CurRegion, NestLoops); } - - if (!Schedule) - Schedule = StmtSchedule; - else if (StmtSchedule) - Schedule = isl_schedule_sequence(Schedule, StmtSchedule); + Schedule = combineInSequence(Schedule, StmtSchedule); } if (!L)