Index: polly/trunk/include/polly/CodeGen/IslNodeBuilder.h =================================================================== --- polly/trunk/include/polly/CodeGen/IslNodeBuilder.h +++ polly/trunk/include/polly/CodeGen/IslNodeBuilder.h @@ -60,7 +60,7 @@ class IslNodeBuilder { public: - IslNodeBuilder(PollyIRBuilder &Builder, ScopAnnotator &Annotator, Pass *P, + IslNodeBuilder(PollyIRBuilder &Builder, ScopAnnotator &Annotator, const DataLayout &DL, LoopInfo &LI, ScalarEvolution &SE, DominatorTree &DT, Scop &S, BasicBlock *StartBlock) : S(S), Builder(Builder), Annotator(Annotator), @@ -68,7 +68,7 @@ StartBlock), BlockGen(Builder, LI, SE, DT, ScalarMap, EscapeMap, ValueMap, &ExprBuilder, StartBlock), - RegionGen(BlockGen), P(P), DL(DL), LI(LI), SE(SE), DT(DT), + RegionGen(BlockGen), DL(DL), LI(LI), SE(SE), DT(DT), StartBlock(StartBlock) {} virtual ~IslNodeBuilder() = default; @@ -138,7 +138,6 @@ /// The generator used to copy a non-affine region. RegionGenerator RegionGen; - Pass *const P; const DataLayout &DL; LoopInfo &LI; ScalarEvolution &SE; Index: polly/trunk/include/polly/CodeGen/LoopGenerators.h =================================================================== --- polly/trunk/include/polly/CodeGen/LoopGenerators.h +++ polly/trunk/include/polly/CodeGen/LoopGenerators.h @@ -50,9 +50,8 @@ /// /// @return Value* The newly created induction variable for this loop. Value *createLoop(Value *LowerBound, Value *UpperBound, Value *Stride, - PollyIRBuilder &Builder, Pass *P, LoopInfo &LI, - DominatorTree &DT, BasicBlock *&ExitBlock, - ICmpInst::Predicate Predicate, + PollyIRBuilder &Builder, LoopInfo &LI, DominatorTree &DT, + BasicBlock *&ExitBlock, ICmpInst::Predicate Predicate, ScopAnnotator *Annotator = NULL, bool Parallel = false, bool UseGuard = true); @@ -99,9 +98,9 @@ class ParallelLoopGenerator { public: /// Create a parallel loop generator for the current function. - ParallelLoopGenerator(PollyIRBuilder &Builder, Pass *P, LoopInfo &LI, + ParallelLoopGenerator(PollyIRBuilder &Builder, LoopInfo &LI, DominatorTree &DT, const DataLayout &DL) - : Builder(Builder), P(P), LI(LI), DT(DT), + : Builder(Builder), LI(LI), DT(DT), LongType( Type::getIntNTy(Builder.getContext(), DL.getPointerSizeInBits())), M(Builder.GetInsertBlock()->getParent()->getParent()) {} @@ -131,9 +130,6 @@ /// The IR builder we use to create instructions. PollyIRBuilder &Builder; - /// A pass pointer to update analysis information. - Pass *P; - /// The loop info of the current function we need to update. LoopInfo &LI; Index: polly/trunk/include/polly/CodeGen/Utils.h =================================================================== --- polly/trunk/include/polly/CodeGen/Utils.h +++ polly/trunk/include/polly/CodeGen/Utils.h @@ -17,6 +17,9 @@ class Pass; class Value; class BasicBlock; +class DominatorTree; +class RegionInfo; +class LoopInfo; } // namespace llvm namespace polly { @@ -55,7 +58,9 @@ /// @param RTC The runtime condition checked before executing the new SCoP. /// /// @return The 'StartBlock' to which new code can be added. -llvm::BasicBlock *executeScopConditionally(Scop &S, llvm::Pass *P, - llvm::Value *RTC); +llvm::BasicBlock *executeScopConditionally(Scop &S, llvm::Value *RTC, + llvm::DominatorTree &DT, + llvm::RegionInfo &RI, + llvm::LoopInfo &LI); } // namespace polly #endif Index: polly/trunk/lib/CodeGen/CodeGeneration.cpp =================================================================== --- polly/trunk/lib/CodeGen/CodeGeneration.cpp +++ polly/trunk/lib/CodeGen/CodeGeneration.cpp @@ -145,10 +145,10 @@ // which may introduce scalar dependences that prevent us from correctly // code generating this scop. BasicBlock *StartBlock = - executeScopConditionally(S, this, Builder.getTrue()); + executeScopConditionally(S, Builder.getTrue(), *DT, *RI, *LI); auto *SplitBlock = StartBlock->getSinglePredecessor(); - IslNodeBuilder NodeBuilder(Builder, Annotator, this, *DL, *LI, *SE, *DT, S, + IslNodeBuilder NodeBuilder(Builder, Annotator, *DL, *LI, *SE, *DT, S, StartBlock); if (PerfMonitoring) { Index: polly/trunk/lib/CodeGen/IslNodeBuilder.cpp =================================================================== --- polly/trunk/lib/CodeGen/IslNodeBuilder.cpp +++ polly/trunk/lib/CodeGen/IslNodeBuilder.cpp @@ -498,7 +498,7 @@ // omit the GuardBB in front of the loop. bool UseGuardBB = !SE.isKnownPredicate(Predicate, SE.getSCEV(ValueLB), SE.getSCEV(ValueUB)); - IV = createLoop(ValueLB, ValueUB, ValueInc, Builder, P, LI, DT, ExitBlock, + IV = createLoop(ValueLB, ValueUB, ValueInc, Builder, LI, DT, ExitBlock, Predicate, &Annotator, Parallel, UseGuardBB); IDToValue[IteratorID] = IV; @@ -625,7 +625,7 @@ } ValueMapT NewValues; - ParallelLoopGenerator ParallelLoopGen(Builder, P, LI, DT, DL); + ParallelLoopGenerator ParallelLoopGen(Builder, LI, DT, DL); IV = ParallelLoopGen.createParallelLoop(ValueLB, ValueUB, ValueInc, SubtreeValues, NewValues, &LoopBody); Index: polly/trunk/lib/CodeGen/LoopGenerators.cpp =================================================================== --- polly/trunk/lib/CodeGen/LoopGenerators.cpp +++ polly/trunk/lib/CodeGen/LoopGenerators.cpp @@ -50,7 +50,7 @@ // 'polly.indvar_next' as well as the condition to check if we execute another // iteration of the loop. After the loop has finished, we branch to ExitBB. Value *polly::createLoop(Value *LB, Value *UB, Value *Stride, - PollyIRBuilder &Builder, Pass *P, LoopInfo &LI, + PollyIRBuilder &Builder, LoopInfo &LI, DominatorTree &DT, BasicBlock *&ExitBB, ICmpInst::Predicate Predicate, ScopAnnotator *Annotator, bool Parallel, @@ -360,7 +360,7 @@ Builder.CreateBr(CheckNextBB); Builder.SetInsertPoint(&*--Builder.GetInsertPoint()); - IV = createLoop(LB, UB, Stride, Builder, P, LI, DT, AfterBB, + IV = createLoop(LB, UB, Stride, Builder, LI, DT, AfterBB, ICmpInst::ICMP_SLE, nullptr, true, /* UseGuard */ false); BasicBlock::iterator LoopBody = Builder.GetInsertPoint(); Index: polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp =================================================================== --- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp +++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp @@ -143,11 +143,11 @@ /// @see GPUNodeBuilder::createUser class GPUNodeBuilder : public IslNodeBuilder { public: - GPUNodeBuilder(PollyIRBuilder &Builder, ScopAnnotator &Annotator, Pass *P, + GPUNodeBuilder(PollyIRBuilder &Builder, ScopAnnotator &Annotator, const DataLayout &DL, LoopInfo &LI, ScalarEvolution &SE, DominatorTree &DT, Scop &S, BasicBlock *StartBlock, gpu_prog *Prog) - : IslNodeBuilder(Builder, Annotator, P, DL, LI, SE, DT, S, StartBlock), + : IslNodeBuilder(Builder, Annotator, DL, LI, SE, DT, S, StartBlock), Prog(Prog) { getExprBuilder().setIDToSAI(&IDToSAI); } @@ -1543,7 +1543,6 @@ BasicBlock *PrevBlock = Builder.GetInsertBlock(); auto EntryBlock = BasicBlock::Create(Builder.getContext(), "entry", FN); - DominatorTree &DT = P->getAnalysis().getDomTree(); DT.addNewBlock(EntryBlock, PrevBlock); Builder.SetInsertPoint(EntryBlock); @@ -2403,9 +2402,9 @@ // which may introduce scalar dependences that prevent us from correctly // code generating this scop. BasicBlock *StartBlock = - executeScopConditionally(*S, this, Builder.getTrue()); + executeScopConditionally(*S, Builder.getTrue(), *DT, *RI, *LI); - GPUNodeBuilder NodeBuilder(Builder, Annotator, this, *DL, *LI, *SE, *DT, *S, + GPUNodeBuilder NodeBuilder(Builder, Annotator, *DL, *LI, *SE, *DT, *S, StartBlock, Prog); // TODO: Handle LICM Index: polly/trunk/lib/CodeGen/Utils.cpp =================================================================== --- polly/trunk/lib/CodeGen/Utils.cpp +++ polly/trunk/lib/CodeGen/Utils.cpp @@ -76,12 +76,11 @@ return MiddleBlock; } -BasicBlock *polly::executeScopConditionally(Scop &S, Pass *P, Value *RTC) { +BasicBlock *polly::executeScopConditionally(Scop &S, Value *RTC, + DominatorTree &DT, RegionInfo &RI, + LoopInfo &LI) { Region &R = S.getRegion(); PollyIRBuilder Builder(S.getEntry()); - DominatorTree &DT = P->getAnalysis().getDomTree(); - RegionInfo &RI = P->getAnalysis().getRegionInfo(); - LoopInfo &LI = P->getAnalysis().getLoopInfo(); // Before: //