From 5c6c5e23bd4282928c83d17aca95b5d31e7c2d0b Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Sat, 29 Nov 2014 21:17:05 +0000 Subject: [PATCH] Switch lowering: Fix broken 'Figure out which block is next' code This doesn't seem to have worked in a long time, but other optimizations would clean it up. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222961 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 3 +++ test/CodeGen/X86/switch-default-only.ll | 14 ++++++++++++++ test/DebugInfo/unconditional-branch.ll | 5 +++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/switch-default-only.ll diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 8f582f1aeb6..196d26d50ed 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2694,6 +2694,9 @@ void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) { // Figure out which block is immediately after the current one. MachineBasicBlock *NextBlock = nullptr; + if (SwitchMBB + 1 != FuncInfo.MF->end()) + NextBlock = SwitchMBB + 1; + MachineBasicBlock *Default = FuncInfo.MBBMap[SI.getDefaultDest()]; // If there is only the default destination, branch to it if it is not the diff --git a/test/CodeGen/X86/switch-default-only.ll b/test/CodeGen/X86/switch-default-only.ll new file mode 100644 index 00000000000..360ace5b787 --- /dev/null +++ b/test/CodeGen/X86/switch-default-only.ll @@ -0,0 +1,14 @@ +; RUN: llc -O0 -fast-isel=false -march=x86 < %s | FileCheck %s + +; No need for branching when the default and only destination follows +; immediately after the switch. +; CHECK-LABEL: no_branch: +; CHECK-NOT: jmp +; CHECK: ret + +define void @no_branch(i32 %x) { +entry: + switch i32 %x, label %exit [ ] +exit: + ret void +} diff --git a/test/DebugInfo/unconditional-branch.ll b/test/DebugInfo/unconditional-branch.ll index 95f5f9ef1c2..f7998d207f4 100644 --- a/test/DebugInfo/unconditional-branch.ll +++ b/test/DebugInfo/unconditional-branch.ll @@ -27,11 +27,12 @@ entry: switch i32 %0, label %sw.default [ ], !dbg !14 +sw.epilog: ; preds = %sw.default + ret void, !dbg !17 + sw.default: ; preds = %entry br label %sw.epilog, !dbg !15 -sw.epilog: ; preds = %sw.default - ret void, !dbg !17 } ; Function Attrs: nounwind readnone -- 2.34.1