diff options
author | Ayonam Ray <ayonam@rrlogic.co.in> | 2019-01-01 06:37:50 +0000 |
---|---|---|
committer | Ayonam Ray <ayonam@rrlogic.co.in> | 2019-01-01 06:37:50 +0000 |
commit | c471bb2e673a916e5daa5ba643eabbd30a20fc4a (patch) | |
tree | c33fdd5e2188aee6ae523ba2358ff757966e46c8 /llvm/test/CodeGen/AArch64/switch-unreachable-default.ll | |
parent | 4952e668f8e525820bb59ea78c1e5eeea3da68fe (diff) | |
download | bcm5719-llvm-c471bb2e673a916e5daa5ba643eabbd30a20fc4a.tar.gz bcm5719-llvm-c471bb2e673a916e5daa5ba643eabbd30a20fc4a.zip |
Omit range checks from jump tables when lowering switches with unreachable
default
During the lowering of a switch that would result in the generation of a jump
table, a range check is performed before indexing into the jump table, for the
switch value being outside the jump table range and a conditional branch is
inserted to jump to the default block. In case the default block is
unreachable, this conditional jump can be omitted. This patch implements
omitting this conditional branch for unreachable defaults.
Review Reference: D52002
llvm-svn: 350186
Diffstat (limited to 'llvm/test/CodeGen/AArch64/switch-unreachable-default.ll')
-rw-r--r-- | llvm/test/CodeGen/AArch64/switch-unreachable-default.ll | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/switch-unreachable-default.ll b/llvm/test/CodeGen/AArch64/switch-unreachable-default.ll new file mode 100644 index 00000000000..7ddcd51cc02 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/switch-unreachable-default.ll @@ -0,0 +1,62 @@ +; RUN: llc -O3 -o - %s | FileCheck %s + +; Test that the output in the presence of an unreachable default does not have +; a compare and branch at the top of the switch to handle the default case. + +target triple = "aarch64-unknown-linux-gnu" + +; Function Attrs: nounwind +define void @fn(i4) { + switch i4 %0, label %default [ + i4 0, label %case_0 + i4 1, label %case_1 + i4 2, label %case_2 + i4 3, label %case_3 + i4 4, label %case_4 + i4 5, label %case_5 + ] + +; CHECK-LABEL: fn: +; CHECK-NOT: sub +; CHECK-NOT: cmp +; CHECK-NOT: b.hi +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #3] +; CHECK: br {{x[0-9]+}} + +default: + unreachable + +case_0: + tail call void @handle_case_00(i4 %0) #2 + br label %return_label + +case_1: + tail call void @handle_case_01(i4 %0) #2 + br label %return_label + +case_2: + tail call void @handle_case_02(i4 %0) #2 + br label %return_label + +case_3: + tail call void @handle_case_03(i4 %0) #2 + br label %return_label + +case_4: + tail call void @handle_case_04(i4 %0) #2 + br label %return_label + +case_5: + tail call void @handle_case_05(i4 %0) #2 + br label %return_label + +return_label: + ret void +} + +declare void @handle_case_00(i4) +declare void @handle_case_01(i4) +declare void @handle_case_02(i4) +declare void @handle_case_03(i4) +declare void @handle_case_04(i4) +declare void @handle_case_05(i4) |