Index: lib/Transforms/Utils/LowerSwitch.cpp =================================================================== --- lib/Transforms/Utils/LowerSwitch.cpp +++ lib/Transforms/Utils/LowerSwitch.cpp @@ -403,6 +403,12 @@ Value *Val = SI->getCondition(); // The value we are switching on... BasicBlock* Default = SI->getDefaultDest(); + if ((CurBlock != &F->getEntryBlock() && pred_empty(CurBlock)) || + CurBlock->getSinglePredecessor() == CurBlock) { + DeleteList.insert(CurBlock); + return; + } + // If there is only the default destination, just branch. if (!SI->getNumCases()) { BranchInst::Create(Default, CurBlock); Index: test/Transforms/LowerSwitch/phi-in-dead-block.ll =================================================================== --- /dev/null +++ test/Transforms/LowerSwitch/phi-in-dead-block.ll @@ -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 +}