forked from OSchip/llvm-project
[NFCI][SimplifyCFG] Rewrite `createUnreachableSwitchDefault()`
The only thing that function should do as per it's semantic, is to ensure that the switch's default is a block consisting only of an `unreachable` terminator. So let's just create such a block and update switch's default to point to it. There should be no need for all this weird dance around predecessors/successors.
This commit is contained in:
parent
94c4952951
commit
5d4f37e895
|
@ -4747,23 +4747,20 @@ static void createUnreachableSwitchDefault(SwitchInst *Switch,
|
|||
DomTreeUpdater *DTU) {
|
||||
LLVM_DEBUG(dbgs() << "SimplifyCFG: switch default is dead.\n");
|
||||
auto *BB = Switch->getParent();
|
||||
BasicBlock *NewDefaultBlock = SplitBlockPredecessors(
|
||||
Switch->getDefaultDest(), Switch->getParent(), "", DTU);
|
||||
auto *OrigDefaultBlock = Switch->getDefaultDest();
|
||||
OrigDefaultBlock->removePredecessor(BB);
|
||||
BasicBlock *NewDefaultBlock = BasicBlock::Create(
|
||||
BB->getContext(), BB->getName() + ".unreachabledefault", BB->getParent(),
|
||||
OrigDefaultBlock);
|
||||
new UnreachableInst(Switch->getContext(), NewDefaultBlock);
|
||||
Switch->setDefaultDest(&*NewDefaultBlock);
|
||||
if (DTU)
|
||||
DTU->applyUpdates({{DominatorTree::Insert, BB, &*NewDefaultBlock},
|
||||
{DominatorTree::Delete, BB, OrigDefaultBlock}});
|
||||
SplitBlock(&*NewDefaultBlock, &NewDefaultBlock->front(), DTU);
|
||||
SmallVector<DominatorTree::UpdateType, 2> Updates;
|
||||
if (DTU)
|
||||
for (auto *Successor : successors(NewDefaultBlock))
|
||||
Updates.push_back({DominatorTree::Delete, NewDefaultBlock, Successor});
|
||||
auto *NewTerminator = NewDefaultBlock->getTerminator();
|
||||
new UnreachableInst(Switch->getContext(), NewTerminator);
|
||||
EraseTerminatorAndDCECond(NewTerminator);
|
||||
if (DTU)
|
||||
if (DTU) {
|
||||
SmallVector<DominatorTree::UpdateType, 2> Updates;
|
||||
Updates.push_back({DominatorTree::Insert, BB, &*NewDefaultBlock});
|
||||
if (!is_contained(successors(BB), OrigDefaultBlock))
|
||||
Updates.push_back({DominatorTree::Delete, BB, &*OrigDefaultBlock});
|
||||
DTU->applyUpdates(Updates);
|
||||
}
|
||||
}
|
||||
|
||||
/// Turn a switch with two reachable destinations into an integer range
|
||||
|
|
|
@ -33,7 +33,7 @@ default:
|
|||
|
||||
define void @test2(i2 %a) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK-NEXT: switch i2 [[A:%.*]], label [[DEFAULT1:%.*]] [
|
||||
; CHECK-NEXT: switch i2 [[A:%.*]], label [[DOTUNREACHABLEDEFAULT:%.*]] [
|
||||
; CHECK-NEXT: i2 0, label [[CASE0:%.*]]
|
||||
; CHECK-NEXT: i2 1, label [[CASE1:%.*]]
|
||||
; CHECK-NEXT: i2 -2, label [[CASE2:%.*]]
|
||||
|
@ -53,7 +53,7 @@ define void @test2(i2 %a) {
|
|||
; CHECK: case3:
|
||||
; CHECK-NEXT: call void @foo(i32 3)
|
||||
; CHECK-NEXT: br label [[COMMON_RET]]
|
||||
; CHECK: default1:
|
||||
; CHECK: .unreachabledefault:
|
||||
; CHECK-NEXT: unreachable
|
||||
;
|
||||
switch i2 %a, label %default [i2 0, label %case0
|
||||
|
|
Loading…
Reference in New Issue