[llvm] 5d4f37e - [NFCI][SimplifyCFG] Rewrite `createUnreachableSwitchDefault()`
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 20 09:40:02 PDT 2021
Is it possible the unreachable block has instructions that are used by its
original successors?
~Craig
On Fri, Aug 20, 2021 at 3:28 AM Roman Lebedev via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
>
> Author: Roman Lebedev
> Date: 2021-08-20T13:28:08+03:00
> New Revision: 5d4f37e895487408e61498ec42e545ec5f778b5b
>
> URL:
> https://github.com/llvm/llvm-project/commit/5d4f37e895487408e61498ec42e545ec5f778b5b
> DIFF:
> https://github.com/llvm/llvm-project/commit/5d4f37e895487408e61498ec42e545ec5f778b5b.diff
>
> LOG: [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.
>
> Added:
>
>
> Modified:
> llvm/lib/Transforms/Utils/SimplifyCFG.cpp
> llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
> b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
> index 847fdd760d2fe..ba3129f5581fe 100644
> --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
> +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
> @@ -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
>
> diff --git a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
> b/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
> index b42024ee48995..154ecb2166310 100644
> --- a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
> +++ b/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
> @@ -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
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210820/5366de1b/attachment.html>
More information about the llvm-commits
mailing list