diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LCSSA.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Utils/LCSSA.cpp b/llvm/lib/Transforms/Utils/LCSSA.cpp index a6895cc..5f1c98c 100644 --- a/llvm/lib/Transforms/Utils/LCSSA.cpp +++ b/llvm/lib/Transforms/Utils/LCSSA.cpp @@ -76,6 +76,7 @@ static bool isExitBlock(BasicBlock *BB, /// rewrite the uses. bool llvm::formLCSSAForInstructions(SmallVectorImpl<Instruction *> &Worklist, const DominatorTree &DT, const LoopInfo &LI, + ScalarEvolution *Se, SmallVectorImpl<PHINode *> *PHIsToRemove, SmallVectorImpl<PHINode *> *InsertedPHIs) { SmallVector<Use *, 16> UsesToRewrite; @@ -333,7 +334,8 @@ static void computeBlocksDominatingExits( } } -bool llvm::formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI) { +bool llvm::formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI, + ScalarEvolution *SE) { bool Changed = false; #ifdef EXPENSIVE_CHECKS @@ -386,7 +388,7 @@ bool llvm::formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI) { } } - Changed = formLCSSAForInstructions(Worklist, DT, *LI); + Changed = formLCSSAForInstructions(Worklist, DT, *LI, SE); assert(L.isLCSSAForm(DT)); @@ -395,22 +397,23 @@ bool llvm::formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI) { /// Process a loop nest depth first. bool llvm::formLCSSARecursively(Loop &L, const DominatorTree &DT, - const LoopInfo *LI) { + const LoopInfo *LI, ScalarEvolution *SE) { bool Changed = false; // Recurse depth-first through inner loops. for (Loop *SubLoop : L.getSubLoops()) - Changed |= formLCSSARecursively(*SubLoop, DT, LI); + Changed |= formLCSSARecursively(*SubLoop, DT, LI, SE); - Changed |= formLCSSA(L, DT, LI); + Changed |= formLCSSA(L, DT, LI, SE); return Changed; } /// Process all loops in the function, inner-most out. -static bool formLCSSAOnAllLoops(const LoopInfo *LI, const DominatorTree &DT) { +static bool formLCSSAOnAllLoops(const LoopInfo *LI, const DominatorTree &DT, + ScalarEvolution *SE) { bool Changed = false; for (const auto &L : *LI) - Changed |= formLCSSARecursively(*L, DT, LI); + Changed |= formLCSSARecursively(*L, DT, LI, SE); return Changed; } @@ -424,6 +427,7 @@ struct LCSSAWrapperPass : public FunctionPass { // Cached analysis information for the current function. DominatorTree *DT; LoopInfo *LI; + ScalarEvolution *SE; bool runOnFunction(Function &F) override; void verifyAnalysis() const override { @@ -480,13 +484,17 @@ char &llvm::LCSSAID = LCSSAWrapperPass::ID; bool LCSSAWrapperPass::runOnFunction(Function &F) { LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); - return formLCSSAOnAllLoops(LI, *DT); + auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>(); + SE = SEWP ? &SEWP->getSE() : nullptr; + + return formLCSSAOnAllLoops(LI, *DT, SE); } PreservedAnalyses LCSSAPass::run(Function &F, FunctionAnalysisManager &AM) { auto &LI = AM.getResult<LoopAnalysis>(F); auto &DT = AM.getResult<DominatorTreeAnalysis>(F); - if (!formLCSSAOnAllLoops(&LI, DT)) + auto *SE = AM.getCachedResult<ScalarEvolutionAnalysis>(F); + if (!formLCSSAOnAllLoops(&LI, DT, SE)) return PreservedAnalyses::all(); PreservedAnalyses PA; |