[SLP] Add cost model for `llvm.powi.*` intrinsics
[llvm-project.git] / llvm / test / Transforms / SCCP / switch-constantfold-crash.ll
blob4aa167931054270152f9eb151724eceb5f39e684
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2 ; RUN: opt -passes=ipsccp < %s -S | FileCheck --check-prefixes=CHECK,ONCE %s
3 ; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck --check-prefixes=CHECK,TWICE %s
5 define void @barney() {
6 ; CHECK-LABEL: define {{[^@]+}}@barney() {
7 ; CHECK-NEXT:  bb:
8 ; CHECK-NEXT:    br label [[BB9:%.*]]
9 ; CHECK:       bb6:
10 ; CHECK-NEXT:    unreachable
11 ; CHECK:       bb9:
12 ; CHECK-NEXT:    br label [[BB6:%.*]]
14 bb:
15   br label %bb9
17 bb6:                                              ; preds = %bb9
18   unreachable
20 bb7:                                              ; preds = %bb9
21   unreachable
23 bb9:                                              ; preds = %bb
24   switch i16 0, label %bb6 [
25   i16 61, label %bb7
26   ]
29 define void @blam() {
30 ; CHECK-LABEL: define {{[^@]+}}@blam() {
31 ; CHECK-NEXT:  bb:
32 ; CHECK-NEXT:    br label [[BB16:%.*]]
33 ; CHECK:       bb16:
34 ; CHECK-NEXT:    br label [[BB38:%.*]]
35 ; CHECK:       bb38:
36 ; CHECK-NEXT:    unreachable
38 bb:
39   br label %bb16
41 bb16:                                             ; preds = %bb
42   switch i32 0, label %bb38 [
43   i32 66, label %bb17
44   i32 63, label %bb18
45   i32 86, label %bb19
46   ]
48 bb17:                                             ; preds = %bb16
49   unreachable
51 bb18:                                             ; preds = %bb16
52   unreachable
54 bb19:                                             ; preds = %bb16
55   unreachable
57 bb38:                                             ; preds = %bb16
58   unreachable
62 define void @hoge() {
63 ; CHECK-LABEL: define {{[^@]+}}@hoge() {
64 ; CHECK-NEXT:  bb:
65 ; CHECK-NEXT:    br label [[BB2:%.*]]
66 ; CHECK:       bb2:
67 ; CHECK-NEXT:    br label [[BB3:%.*]]
68 ; CHECK:       bb3:
69 ; CHECK-NEXT:    unreachable
71 bb:
72   switch i16 undef, label %bb1 [
73   i16 135, label %bb2
74   i16 66, label %bb2
75   ]
77 bb1:                                              ; preds = %bb
78   ret void
80 bb2:                                              ; preds = %bb, %bb
81   switch i16 0, label %bb3 [
82   i16 61, label %bb4
83   i16 54, label %bb4
84   i16 49, label %bb4
85   ]
87 bb3:                                              ; preds = %bb2
88   unreachable
90 bb4:                                              ; preds = %bb2, %bb2, %bb2
91   unreachable
94 ; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced
95 ; by an unreachable block.
96 define void @pr49573_main() {
97 ; ONCE-LABEL: define {{[^@]+}}@pr49573_main() {
98 ; ONCE-NEXT:  entry:
99 ; ONCE-NEXT:    [[TGT:%.*]] = call i16 @pr49573_fn()
100 ; ONCE-NEXT:    switch i16 2, label [[DEFAULT_UNREACHABLE:%.*]] [
101 ; ONCE-NEXT:    i16 0, label [[CASE_0:%.*]]
102 ; ONCE-NEXT:    i16 2, label [[CASE_2:%.*]]
103 ; ONCE-NEXT:    ]
104 ; ONCE:       case.0:
105 ; ONCE-NEXT:    unreachable
106 ; ONCE:       default.unreachable:
107 ; ONCE-NEXT:    unreachable
108 ; ONCE:       case.2:
109 ; ONCE-NEXT:    br label [[NEXT:%.*]]
110 ; ONCE:       next:
111 ; ONCE-NEXT:    [[TGT_2:%.*]] = call i16 @pr49573_fn_2()
112 ; ONCE-NEXT:    switch i16 2, label [[DEFAULT_UNREACHABLE]] [
113 ; ONCE-NEXT:    i16 0, label [[CASE_0]]
114 ; ONCE-NEXT:    i16 2, label [[CASE_2]]
115 ; ONCE-NEXT:    ]
117 ; TWICE-LABEL: define {{[^@]+}}@pr49573_main() {
118 ; TWICE-NEXT:  entry:
119 ; TWICE-NEXT:    [[TGT:%.*]] = call i16 @pr49573_fn()
120 ; TWICE-NEXT:    br label [[CASE_2:%.*]]
121 ; TWICE:       case.2:
122 ; TWICE-NEXT:    br label [[NEXT:%.*]]
123 ; TWICE:       next:
124 ; TWICE-NEXT:    [[TGT_2:%.*]] = call i16 @pr49573_fn_2()
125 ; TWICE-NEXT:    br label [[CASE_2]]
127 entry:
128   %tgt = call i16 @pr49573_fn()
129   switch i16 %tgt, label %default.bb [
130   i16 0, label %case.0
131   i16 1, label %case.1
132   i16 2, label %case.2
133   ]
135 case.0:
136   unreachable
138 default.bb:
139   ret void
141 case.1:
142   ret void
144 case.2:
145   br label %next
147 next:
148   %tgt.2 = call i16 @pr49573_fn_2()
149   switch i16 %tgt.2, label %default.bb [
150   i16 0, label %case.0
151   i16 2, label %case.2
152   ]
155 ; Make sure a new unreachable BB is created.
156 define void @pr49573_main_2() {
157 ; ONCE-LABEL: define {{[^@]+}}@pr49573_main_2() {
158 ; ONCE-NEXT:  entry:
159 ; ONCE-NEXT:    [[TGT:%.*]] = call i16 @pr49573_fn()
160 ; ONCE-NEXT:    switch i16 2, label [[DEFAULT_UNREACHABLE:%.*]] [
161 ; ONCE-NEXT:    i16 0, label [[CASE_0:%.*]]
162 ; ONCE-NEXT:    i16 2, label [[CASE_2:%.*]]
163 ; ONCE-NEXT:    ]
164 ; ONCE:       case.0:
165 ; ONCE-NEXT:    unreachable
166 ; ONCE:       default.unreachable:
167 ; ONCE-NEXT:    unreachable
168 ; ONCE:       case.2:
169 ; ONCE-NEXT:    ret void
171 ; TWICE-LABEL: define {{[^@]+}}@pr49573_main_2() {
172 ; TWICE-NEXT:  entry:
173 ; TWICE-NEXT:    [[TGT:%.*]] = call i16 @pr49573_fn()
174 ; TWICE-NEXT:    br label [[CASE_2:%.*]]
175 ; TWICE:       case.2:
176 ; TWICE-NEXT:    ret void
178 entry:
179   %tgt = call i16 @pr49573_fn()
180   switch i16 %tgt, label %default.bb [
181   i16 0, label %case.0
182   i16 1, label %case.1
183   i16 2, label %case.2
184   ]
186 case.0:
187   unreachable
189 default.bb:
190   ret void
192 case.1:
193   ret void
195 case.2:
196   ret void
199 define internal i16 @pr49573_fn() {
200 ; CHECK-LABEL: define {{[^@]+}}@pr49573_fn() {
201 ; CHECK-NEXT:  entry:
202 ; CHECK-NEXT:    br label [[ELSE:%.*]]
203 ; CHECK:       else:
204 ; CHECK-NEXT:    ret i16 undef
206 entry:
207   br i1 undef, label %then, label %else
209 then:
210   ret i16 0
212 else:
213   ret i16 2
216 define internal i16 @pr49573_fn_2() {
217 ; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2() {
218 ; CHECK-NEXT:  entry:
219 ; CHECK-NEXT:    br label [[ELSE:%.*]]
220 ; CHECK:       else:
221 ; CHECK-NEXT:    ret i16 undef
223 entry:
224   br i1 undef, label %then, label %else
226 then:
227   ret i16 0
229 else:
230   ret i16 2