LowerSwitch: Fix producing invalid IR on unreachable code
If a switch was in an unreachable block that branched to a block with a phi, it would leave phis with missing predecessors. llvm-svn: 301064
This commit is contained in:
parent
8150355498
commit
01d17e7c5f
|
@ -403,6 +403,14 @@ void LowerSwitch::processSwitchInst(SwitchInst *SI,
|
||||||
Value *Val = SI->getCondition(); // The value we are switching on...
|
Value *Val = SI->getCondition(); // The value we are switching on...
|
||||||
BasicBlock* Default = SI->getDefaultDest();
|
BasicBlock* Default = SI->getDefaultDest();
|
||||||
|
|
||||||
|
// Don't handle unreachable blocks. If there are successors with phis, this
|
||||||
|
// would leave them behind with missing predecessors.
|
||||||
|
if ((CurBlock != &F->getEntryBlock() && pred_empty(CurBlock)) ||
|
||||||
|
CurBlock->getSinglePredecessor() == CurBlock) {
|
||||||
|
DeleteList.insert(CurBlock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If there is only the default destination, just branch.
|
// If there is only the default destination, just branch.
|
||||||
if (!SI->getNumCases()) {
|
if (!SI->getNumCases()) {
|
||||||
BranchInst::Create(Default, CurBlock);
|
BranchInst::Create(Default, CurBlock);
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
; RUN: opt -S -lowerswitch %s | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK-LABEL: @phi_in_dead_block(
|
||||||
|
; CHECK-NOT: switch
|
||||||
|
define void @phi_in_dead_block() {
|
||||||
|
bb:
|
||||||
|
br i1 undef, label %bb2, label %bb3
|
||||||
|
|
||||||
|
bb1: ; No predecessors!
|
||||||
|
switch i32 undef, label %bb2 [
|
||||||
|
i32 9, label %bb3
|
||||||
|
]
|
||||||
|
|
||||||
|
bb2: ; preds = %bb1, %bb
|
||||||
|
%tmp = phi i64 [ undef, %bb1 ], [ undef, %bb ]
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
bb3: ; preds = %bb1, %bb
|
||||||
|
unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: @phi_in_dead_block_br_to_self(
|
||||||
|
; CHECK-NOT: switch
|
||||||
|
define void @phi_in_dead_block_br_to_self() {
|
||||||
|
bb:
|
||||||
|
br i1 undef, label %bb2, label %bb3
|
||||||
|
|
||||||
|
bb1: ; No predecessors!
|
||||||
|
switch i32 undef, label %bb2 [
|
||||||
|
i32 9, label %bb3
|
||||||
|
i32 10, label %bb1
|
||||||
|
]
|
||||||
|
|
||||||
|
bb2: ; preds = %bb1, %bb
|
||||||
|
%tmp = phi i64 [ undef, %bb1 ], [ undef, %bb ]
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
bb3: ; preds = %bb1, %bb
|
||||||
|
unreachable
|
||||||
|
}
|
Loading…
Reference in New Issue