LowerSwitch: replace unreachable default with popular case destination
[oota-llvm.git] / test / Transforms / LowerSwitch / fold-popular-case-to-unreachable-default.ll
1 ; RUN: opt %s -lowerswitch -S | FileCheck %s
2
3 define void @foo(i32 %x, i32* %p) {
4 ; Cases 2 and 4 are removed and become the new default case.
5 ; It is now enough to use two icmps to lower the switch.
6 ;
7 ; CHECK-LABEL: @foo
8 ; CHECK:       icmp slt i32 %x, 5
9 ; CHECK:       icmp eq i32 %x, 1
10 ; CHECK-NOT:   icmp
11 ;
12 entry:
13   switch i32 %x, label %default [
14     i32 1, label %bb0
15     i32 2, label %popular
16     i32 4, label %popular
17     i32 5, label %bb1
18   ]
19 bb0:
20   store i32 0, i32* %p
21   br label %exit
22 bb1:
23   store i32 1, i32* %p
24   br label %exit
25 popular:
26   store i32 2, i32* %p
27   br label %exit
28 exit:
29   ret void
30 default:
31   unreachable
32 }
33
34 define void @unreachable_gap(i64 %x, i32* %p) {
35 ; Cases 6 and INT64_MAX become the new default, but we still exploit the fact
36 ; that 3-4 is unreachable, so four icmps is enough.
37
38 ; CHECK-LABEL: @unreachable_gap
39 ; CHECK:       icmp slt i64 %x, 2
40 ; CHECK:       icmp slt i64 %x, 5
41 ; CHECK:       icmp eq  i64 %x, 5
42 ; CHECK:       icmp slt i64 %x, 1
43 ; CHECK-NOT:   icmp
44
45 entry:
46   switch i64 %x, label %default [
47     i64 -9223372036854775808, label %bb0
48     i64 1, label %bb1
49     i64 2, label %bb2
50     i64 5, label %bb3
51     i64 6, label %bb4
52     i64 9223372036854775807, label %bb4
53   ]
54 bb0:
55   store i32 0, i32* %p
56   br label %exit
57 bb1:
58   store i32 1, i32* %p
59   br label %exit
60 bb2:
61   store i32 2, i32* %p
62   br label %exit
63 bb3:
64   store i32 3, i32* %p
65   br label %exit
66 bb4:
67   store i32 4, i32* %p
68   br label %exit
69 exit:
70   ret void
71 default:
72   unreachable
73 }
74
75
76
77 define void @nocases(i32 %x, i32* %p) {
78 ; Don't fall over when there are no cases.
79 ;
80 ; CHECK-LABEL: @nocases
81 ; CHECK-LABEL: entry
82 ; CHECK-NEXT:  br label %default
83 ;
84 entry:
85   switch i32 %x, label %default [
86   ]
87 default:
88   unreachable
89 }
90
91 define void @nocasesleft(i32 %x, i32* %p) {
92 ; Cases 2 and 4 are removed and we are left with no cases.
93 ;
94 ; CHECK-LABEL: @nocasesleft
95 ; CHECK-LABEL: entry
96 ; CHECK-NEXT:  br label %popular
97 ;
98 entry:
99   switch i32 %x, label %default [
100     i32 2, label %popular
101     i32 4, label %popular
102   ]
103 popular:
104   store i32 2, i32* %p
105   br label %exit
106 exit:
107   ret void
108 default:
109   unreachable
110 }