mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 14:46:53 +00:00
d5c2318adc
An unreachable default destination can be exploited by other optimizations and allows for more efficient lowering. Both the SDag switch lowering and LowerSwitch can exploit unreachable defaults. Also make TurnSwitchRangeICmp handle switches with unreachable default. This is kind of separate change, but it cannot be tested without the change above, and I don't want to land the change above without this since that would regress other tests. Differential Revision: http://reviews.llvm.org/D6471 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227125 91177308-0d34-0410-b5e6-96231b3b80d8
78 lines
1.4 KiB
LLVM
78 lines
1.4 KiB
LLVM
; RUN: opt %s -simplifycfg -S | FileCheck %s
|
|
|
|
declare i32 @f(i32)
|
|
|
|
define i32 @basic(i32 %x) {
|
|
; CHECK-LABEL: @basic
|
|
; CHECK: x.off = add i32 %x, -5
|
|
; CHECK: %switch = icmp ult i32 %x.off, 3
|
|
; CHECK: br i1 %switch, label %a, label %default
|
|
|
|
entry:
|
|
switch i32 %x, label %default [
|
|
i32 5, label %a
|
|
i32 6, label %a
|
|
i32 7, label %a
|
|
]
|
|
default:
|
|
%0 = call i32 @f(i32 0)
|
|
ret i32 %0
|
|
a:
|
|
%1 = call i32 @f(i32 1)
|
|
ret i32 %1
|
|
}
|
|
|
|
|
|
define i32 @unreachable(i32 %x) {
|
|
; CHECK-LABEL: @unreachable
|
|
; CHECK: x.off = add i32 %x, -5
|
|
; CHECK: %switch = icmp ult i32 %x.off, 3
|
|
; CHECK: br i1 %switch, label %a, label %b
|
|
|
|
entry:
|
|
switch i32 %x, label %unreachable [
|
|
i32 5, label %a
|
|
i32 6, label %a
|
|
i32 7, label %a
|
|
i32 10, label %b
|
|
i32 20, label %b
|
|
i32 30, label %b
|
|
i32 40, label %b
|
|
]
|
|
unreachable:
|
|
unreachable
|
|
a:
|
|
%0 = call i32 @f(i32 0)
|
|
ret i32 %0
|
|
b:
|
|
%1 = call i32 @f(i32 1)
|
|
ret i32 %1
|
|
}
|
|
|
|
|
|
define i32 @unreachable2(i32 %x) {
|
|
; CHECK-LABEL: @unreachable2
|
|
; CHECK: x.off = add i32 %x, -5
|
|
; CHECK: %switch = icmp ult i32 %x.off, 3
|
|
; CHECK: br i1 %switch, label %a, label %b
|
|
|
|
entry:
|
|
; Note: folding the most popular case destination into the default
|
|
; would prevent switch-to-icmp here.
|
|
switch i32 %x, label %unreachable [
|
|
i32 5, label %a
|
|
i32 6, label %a
|
|
i32 7, label %a
|
|
i32 10, label %b
|
|
i32 20, label %b
|
|
]
|
|
unreachable:
|
|
unreachable
|
|
a:
|
|
%0 = call i32 @f(i32 0)
|
|
ret i32 %0
|
|
b:
|
|
%1 = call i32 @f(i32 1)
|
|
ret i32 %1
|
|
}
|