[llvm] 5d6cd61 - [LoopSimplifyCFG] Delete landing pads in dead exit blocks
Yevgeny Rouban via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 29 04:37:20 PDT 2020
Author: Yevgeny Rouban
Date: 2020-07-29T18:36:51+07:00
New Revision: 5d6cd61904aa03df6db4a5a33445d9af60cab0d5
URL: https://github.com/llvm/llvm-project/commit/5d6cd61904aa03df6db4a5a33445d9af60cab0d5
DIFF: https://github.com/llvm/llvm-project/commit/5d6cd61904aa03df6db4a5a33445d9af60cab0d5.diff
LOG: [LoopSimplifyCFG] Delete landing pads in dead exit blocks
In addition to removing phi nodes this patch removes any
landing pad that the dead exit block might have. Without
this fix Verifier complains about a new switch instruction
jumps to a block with a landing pad.
Differential Revision: https://reviews.llvm.org/D84320
Added:
llvm/test/Transforms/LoopSimplifyCFG/handle_dead_exits.ll
Modified:
llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
index 031e5b9c1d2c..8ab3c2ca118d 100644
--- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
@@ -366,15 +366,20 @@ class ConstantTerminatorFoldingImpl {
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});
diff --git a/llvm/test/Transforms/LoopSimplifyCFG/handle_dead_exits.ll b/llvm/test/Transforms/LoopSimplifyCFG/handle_dead_exits.ll
new file mode 100644
index 000000000000..1fb7fb4b1336
--- /dev/null
+++ b/llvm/test/Transforms/LoopSimplifyCFG/handle_dead_exits.ll
@@ -0,0 +1,88 @@
+; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg %s | FileCheck %s
+; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(simplify-cfg)' %s | FileCheck %s
+
+declare i32* @fake_personality_function()
+declare void @foo()
+
+define i32 @test_remove_lpad(i1 %exitcond) personality i32* ()* @fake_personality_function {
+; CHECK-LABEL: @test_remove_lpad(
+entry:
+ br label %for.body
+
+for.body:
+ br i1 0, label %never, label %next
+
+next:
+ br label %latch
+
+latch:
+ br i1 %exitcond, label %exit, label %for.body
+
+exit:
+ ret i32 0
+
+never:
+ invoke void @foo() to label %next unwind label %never-unwind
+
+never-unwind:
+; CHECK: never-unwind:
+; CHECK-NEXT: unreachable
+ %res = landingpad token cleanup
+ unreachable
+}
+
+define i32 @test_remove_phi_lpad(i1 %exitcond) personality i32* ()* @fake_personality_function {
+; CHECK-LABEL: @test_remove_phi_lpad(
+entry:
+ br label %for.body
+
+for.body:
+ br i1 0, label %never, label %next
+
+next:
+ br label %latch
+
+latch:
+ br i1 %exitcond, label %exit, label %for.body
+
+exit:
+ ret i32 0
+
+never:
+ invoke void @foo() to label %next unwind label %never-unwind
+
+never-unwind:
+; CHECK: never-unwind:
+; CHECK-NEXT: ret i32 undef
+ %p = phi i32 [1, %never]
+ %res = landingpad token cleanup
+ ret i32 %p
+}
+
+define i32 @test_split_remove_phi_lpad_(i1 %exitcond) personality i32* ()* @fake_personality_function {
+; CHECK-LABEL: @test_split_remove_phi_lpad_(
+entry:
+ invoke void @foo() to label %for.body unwind label %unwind-bb
+
+for.body:
+ br i1 0, label %never, label %next
+
+next:
+ br label %latch
+
+latch:
+ br i1 %exitcond, label %exit, label %for.body
+
+exit:
+ ret i32 0
+
+never:
+ invoke void @foo() to label %next unwind label %unwind-bb
+
+unwind-bb:
+; CHECK: unwind-bb.loopexit:
+; CHECK-NEXT: br label %unwind-bb
+ %p = phi i32 [1, %never], [2, %entry]
+ %res = landingpad token cleanup
+ ret i32 %p
+}
More information about the llvm-commits
mailing list