aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp29
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;