diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
| commit | b60736ec1405bb0a8dd40989f67ef4c93da068ab (patch) | |
| tree | 5c43fbb7c9fc45f0f87e0e6795a86267dbd12f9d /llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | |
| parent | cfca06d7963fa0909f90483b42a6d7d194d01e08 (diff) | |
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 031e5b9c1d2c..cc6d11220807 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -16,7 +16,6 @@ #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" -#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/BasicAliasAnalysis.h" #include "llvm/Analysis/DependenceAnalysis.h" @@ -366,15 +365,20 @@ private: unsigned DummyIdx = 1; for (BasicBlock *BB : DeadExitBlocks) { - SmallVector<Instruction *, 4> DeadPhis; + // Eliminate all Phis and LandingPads from dead exits. + // TODO: Consider removing all instructions in this dead block. + SmallVector<Instruction *, 4> DeadInstructions; for (auto &PN : BB->phis()) - DeadPhis.push_back(&PN); + DeadInstructions.push_back(&PN); - // Eliminate all Phis from dead exits. - for (Instruction *PN : DeadPhis) { - PN->replaceAllUsesWith(UndefValue::get(PN->getType())); - PN->eraseFromParent(); + if (auto *LandingPad = dyn_cast<LandingPadInst>(BB->getFirstNonPHI())) + DeadInstructions.emplace_back(LandingPad); + + for (Instruction *I : DeadInstructions) { + I->replaceAllUsesWith(UndefValue::get(I->getType())); + I->eraseFromParent(); } + assert(DummyIdx != 0 && "Too many dead exits!"); DummySwitch->addCase(Builder.getInt32(DummyIdx++), BB); DTUpdates.push_back({DominatorTree::Insert, Preheader, BB}); @@ -410,9 +414,10 @@ private: FixLCSSALoop = FixLCSSALoop->getParentLoop(); assert(FixLCSSALoop && "Should be a loop!"); // We need all DT updates to be done before forming LCSSA. - DTU.applyUpdates(DTUpdates); if (MSSAU) - MSSAU->applyUpdates(DTUpdates, DT); + MSSAU->applyUpdates(DTUpdates, DT, /*UpdateDT=*/true); + else + DTU.applyUpdates(DTUpdates); DTUpdates.clear(); formLCSSARecursively(*FixLCSSALoop, DT, &LI, &SE); } @@ -420,8 +425,7 @@ private: if (MSSAU) { // Clear all updates now. Facilitates deletes that follow. - DTU.applyUpdates(DTUpdates); - MSSAU->applyUpdates(DTUpdates, DT); + MSSAU->applyUpdates(DTUpdates, DT, /*UpdateDT=*/true); DTUpdates.clear(); if (VerifyMemorySSA) MSSAU->getMemorySSA()->verifyMemorySSA(); @@ -447,7 +451,7 @@ private: if (LI.isLoopHeader(BB)) { assert(LI.getLoopFor(BB) != &L && "Attempt to remove current loop!"); Loop *DL = LI.getLoopFor(BB); - if (DL->getParentLoop()) { + if (!DL->isOutermost()) { for (auto *PL = DL->getParentLoop(); PL; PL = PL->getParentLoop()) for (auto *BB : DL->getBlocks()) PL->removeBlockFromLoop(BB); |
