diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 083f87436acd..8d59fdff9236 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -32,6 +32,7 @@ #include "llvm/Transforms/Scalar/LoopPassManager.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/LoopUtils.h" +#include <optional> using namespace llvm; #define DEBUG_TYPE "loop-simplifycfg" @@ -371,6 +372,7 @@ private: DeadInstructions.emplace_back(LandingPad); for (Instruction *I : DeadInstructions) { + SE.forgetBlockAndLoopDispositions(I); I->replaceAllUsesWith(PoisonValue::get(I->getType())); I->eraseFromParent(); } @@ -416,6 +418,7 @@ private: DTU.applyUpdates(DTUpdates); DTUpdates.clear(); formLCSSARecursively(*FixLCSSALoop, DT, &LI, &SE); + SE.forgetBlockAndLoopDispositions(); } } @@ -474,7 +477,7 @@ private: NumLoopBlocksDeleted += DeadLoopBlocks.size(); } - /// Constant-fold terminators of blocks acculumated in FoldCandidates into the + /// Constant-fold terminators of blocks accumulated in FoldCandidates into the /// unconditional branches. void foldTerminators() { for (BasicBlock *BB : FoldCandidates) { @@ -595,6 +598,9 @@ public: LLVM_DEBUG(dbgs() << "Constant-folding " << FoldCandidates.size() << " terminators in loop " << Header->getName() << "\n"); + if (!DeadLoopBlocks.empty()) + SE.forgetBlockAndLoopDispositions(); + // Make the actual transforms. handleDeadExits(); foldTerminators(); @@ -655,7 +661,8 @@ static bool constantFoldTerminators(Loop &L, DominatorTree &DT, LoopInfo &LI, } static bool mergeBlocksIntoPredecessors(Loop &L, DominatorTree &DT, - LoopInfo &LI, MemorySSAUpdater *MSSAU) { + LoopInfo &LI, MemorySSAUpdater *MSSAU, + ScalarEvolution &SE) { bool Changed = false; DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager); // Copy blocks into a temporary array to avoid iterator invalidation issues @@ -682,6 +689,9 @@ static bool mergeBlocksIntoPredecessors(Loop &L, DominatorTree &DT, Changed = true; } + if (Changed) + SE.forgetBlockAndLoopDispositions(); + return Changed; } @@ -697,7 +707,7 @@ static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, return true; // Eliminate unconditional branches by merging blocks into their predecessors. - Changed |= mergeBlocksIntoPredecessors(L, DT, LI, MSSAU); + Changed |= mergeBlocksIntoPredecessors(L, DT, LI, MSSAU, SE); if (Changed) SE.forgetTopmostLoop(&L); @@ -708,12 +718,12 @@ static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &LPMU) { - Optional<MemorySSAUpdater> MSSAU; + std::optional<MemorySSAUpdater> MSSAU; if (AR.MSSA) MSSAU = MemorySSAUpdater(AR.MSSA); bool DeleteCurrentLoop = false; - if (!simplifyLoopCFG(L, AR.DT, AR.LI, AR.SE, - MSSAU ? MSSAU.getPointer() : nullptr, DeleteCurrentLoop)) + if (!simplifyLoopCFG(L, AR.DT, AR.LI, AR.SE, MSSAU ? &*MSSAU : nullptr, + DeleteCurrentLoop)) return PreservedAnalyses::all(); if (DeleteCurrentLoop) @@ -741,15 +751,14 @@ public: LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); auto *MSSAA = getAnalysisIfAvailable<MemorySSAWrapperPass>(); - Optional<MemorySSAUpdater> MSSAU; + std::optional<MemorySSAUpdater> MSSAU; if (MSSAA) MSSAU = MemorySSAUpdater(&MSSAA->getMSSA()); if (MSSAA && VerifyMemorySSA) MSSAU->getMemorySSA()->verifyMemorySSA(); bool DeleteCurrentLoop = false; - bool Changed = - simplifyLoopCFG(*L, DT, LI, SE, MSSAU ? MSSAU.getPointer() : nullptr, - DeleteCurrentLoop); + bool Changed = simplifyLoopCFG(*L, DT, LI, SE, MSSAU ? &*MSSAU : nullptr, + DeleteCurrentLoop); if (DeleteCurrentLoop) LPM.markLoopAsDeleted(*L); return Changed; |
