[WinEH] Emit state stores for SEH scopes (#116546)
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / ARM / branch-on-zero.ll
blob25dfb3c53a077bf17d02c8c65af7458c44e88b69
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' < %s | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5 target triple = "thumbv8.1m.main-none-eabi"
7 define i32 @lshr3_then(i32 %a) {
8 ; CHECK-LABEL: @lshr3_then(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 3
11 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
12 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
13 ; CHECK:       then:
14 ; CHECK-NEXT:    ret i32 0
15 ; CHECK:       else:
16 ; CHECK-NEXT:    ret i32 [[L]]
18 entry:
19   %c = icmp ult i32 %a, 8
20   br i1 %c, label %then, label %else
22 then:
23   ret i32 0
25 else:
26   %l = lshr i32 %a, 3
27   ret i32 %l
30 define i32 @lshr5_else(i32 %a) {
31 ; CHECK-LABEL: @lshr5_else(
32 ; CHECK-NEXT:  entry:
33 ; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 5
34 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
35 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
36 ; CHECK:       then:
37 ; CHECK-NEXT:    ret i32 [[L]]
38 ; CHECK:       else:
39 ; CHECK-NEXT:    ret i32 0
41 entry:
42   %c = icmp ult i32 %a, 32
43   br i1 %c, label %then, label %else
45 then:
46   %l = lshr i32 %a, 5
47   ret i32 %l
49 else:
50   ret i32 0
53 define i32 @lshr2_entry(i32 %a) {
54 ; CHECK-LABEL: @lshr2_entry(
55 ; CHECK-NEXT:  entry:
56 ; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A:%.*]], 1
57 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
58 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
59 ; CHECK:       then:
60 ; CHECK-NEXT:    ret i32 [[L]]
61 ; CHECK:       else:
62 ; CHECK-NEXT:    ret i32 0
64 entry:
65   %l = lshr i32 %a, 1
66   %c = icmp ult i32 %a, 2
67   br i1 %c, label %then, label %else
69 then:
70   ret i32 %l
72 else:
73   ret i32 0
76 define i32 @lshr5mismatch(i32 %a) {
77 ; CHECK-LABEL: @lshr5mismatch(
78 ; CHECK-NEXT:  entry:
79 ; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[A:%.*]], 17
80 ; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
81 ; CHECK:       then:
82 ; CHECK-NEXT:    [[L:%.*]] = lshr i32 [[A]], 5
83 ; CHECK-NEXT:    ret i32 [[L]]
84 ; CHECK:       else:
85 ; CHECK-NEXT:    ret i32 0
87 entry:
88   %c = icmp ult i32 %a, 17
89   br i1 %c, label %then, label %else
91 then:
92   %l = lshr i32 %a, 5
93   ret i32 %l
95 else:
96   ret i32 0
99 define i32 @ashr5_else(i32 %a) {
100 ; CHECK-LABEL: @ashr5_else(
101 ; CHECK-NEXT:  entry:
102 ; CHECK-NEXT:    [[L:%.*]] = ashr i32 [[A:%.*]], 5
103 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
104 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
105 ; CHECK:       then:
106 ; CHECK-NEXT:    ret i32 [[L]]
107 ; CHECK:       else:
108 ; CHECK-NEXT:    ret i32 0
110 entry:
111   %c = icmp ult i32 %a, 32
112   br i1 %c, label %then, label %else
114 then:
115   %l = ashr i32 %a, 5
116   ret i32 %l
118 else:
119   ret i32 0
122 define i32 @add10_else(i32 %a) {
123 ; CHECK-LABEL: @add10_else(
124 ; CHECK-NEXT:  entry:
125 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A:%.*]], 10
126 ; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
127 ; CHECK:       then:
128 ; CHECK-NEXT:    ret i32 0
129 ; CHECK:       else:
130 ; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 10
131 ; CHECK-NEXT:    ret i32 [[L]]
133 entry:
134   %c = icmp eq i32 %a, 10
135   br i1 %c, label %then, label %else
137 then:
138   ret i32 0
140 else:
141   %l = add i32 %a, 10
142   ret i32 %l
145 define i32 @addm10_then(i32 %a) {
146 ; CHECK-LABEL: @addm10_then(
147 ; CHECK-NEXT:  entry:
148 ; CHECK-NEXT:    [[L:%.*]] = add i32 [[A:%.*]], -10
149 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
150 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
151 ; CHECK:       then:
152 ; CHECK-NEXT:    ret i32 [[L]]
153 ; CHECK:       else:
154 ; CHECK-NEXT:    ret i32 0
156 entry:
157   %c = icmp eq i32 %a, 10
158   br i1 %c, label %then, label %else
160 then:
161   %l = add i32 %a, -10
162   ret i32 %l
164 else:
165   ret i32 0
168 define i32 @add_missmatch(i32 %a) {
169 ; CHECK-LABEL: @add_missmatch(
170 ; CHECK-NEXT:  entry:
171 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A:%.*]], 10
172 ; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
173 ; CHECK:       then:
174 ; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 10
175 ; CHECK-NEXT:    ret i32 [[L]]
176 ; CHECK:       else:
177 ; CHECK-NEXT:    ret i32 0
179 entry:
180   %c = icmp eq i32 %a, 10
181   br i1 %c, label %then, label %else
183 then:
184   %l = add i32 %a, 10
185   ret i32 %l
187 else:
188   ret i32 0
191 define i32 @sub10_else(i32 %a) {
192 ; CHECK-LABEL: @sub10_else(
193 ; CHECK-NEXT:  entry:
194 ; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], 10
195 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
196 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
197 ; CHECK:       then:
198 ; CHECK-NEXT:    ret i32 0
199 ; CHECK:       else:
200 ; CHECK-NEXT:    ret i32 [[L]]
202 entry:
203   %c = icmp eq i32 %a, 10
204   br i1 %c, label %then, label %else
206 then:
207   ret i32 0
209 else:
210   %l = sub i32 %a, 10
211   ret i32 %l
214 define i32 @sub10_else_drop_nuw(i32 %a) {
215 ; CHECK-LABEL: @sub10_else_drop_nuw(
216 ; CHECK-NEXT:  entry:
217 ; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], 10
218 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
219 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
220 ; CHECK:       then:
221 ; CHECK-NEXT:    ret i32 0
222 ; CHECK:       else:
223 ; CHECK-NEXT:    ret i32 [[L]]
225 entry:
226   %c = icmp eq i32 %a, 10
227   br i1 %c, label %then, label %else
229 then:
230   ret i32 0
232 else:
233   %l = sub nuw i32 %a, 10
234   ret i32 %l
237 define i32 @subm10_then(i32 %a) {
238 ; CHECK-LABEL: @subm10_then(
239 ; CHECK-NEXT:  entry:
240 ; CHECK-NEXT:    [[L:%.*]] = sub i32 [[A:%.*]], -10
241 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[L]], 0
242 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
243 ; CHECK:       then:
244 ; CHECK-NEXT:    ret i32 [[L]]
245 ; CHECK:       else:
246 ; CHECK-NEXT:    ret i32 0
248 entry:
249   %c = icmp eq i32 %a, -10
250   br i1 %c, label %then, label %else
252 then:
253   %l = sub i32 %a, -10
254   ret i32 %l
256 else:
257   ret i32 0
260 define i64 @lshr64(i64 %a) {
261 ; CHECK-LABEL: @lshr64(
262 ; CHECK-NEXT:  entry:
263 ; CHECK-NEXT:    [[L:%.*]] = lshr i64 [[A:%.*]], 40
264 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[L]], 0
265 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
266 ; CHECK:       then:
267 ; CHECK-NEXT:    ret i64 0
268 ; CHECK:       else:
269 ; CHECK-NEXT:    ret i64 [[L]]
271 entry:
272   %c = icmp ult i64 %a, 1099511627776
273   br i1 %c, label %then, label %else
275 then:
276   ret i64 0
278 else:
279   %l = lshr i64 %a, 40
280   ret i64 %l
283 define i128 @lshr128(i128 %a) {
284 ; CHECK-LABEL: @lshr128(
285 ; CHECK-NEXT:  entry:
286 ; CHECK-NEXT:    [[L:%.*]] = lshr i128 [[A:%.*]], 65
287 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i128 [[L]], 0
288 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
289 ; CHECK:       then:
290 ; CHECK-NEXT:    ret i128 0
291 ; CHECK:       else:
292 ; CHECK-NEXT:    ret i128 [[L]]
294 entry:
295   %c = icmp ult i128 %a, 36893488147419103232
296   br i1 %c, label %then, label %else
298 then:
299   ret i128 0
301 else:
302   %l = lshr i128 %a, 65
303   ret i128 %l
306 define i32 @addm1_dom(i32 %a) {
307 ; CHECK-LABEL: @addm1_dom(
308 ; CHECK-NEXT:  entry:
309 ; CHECK-NEXT:    [[C1:%.*]] = icmp eq i32 [[A:%.*]], 100
310 ; CHECK-NEXT:    br i1 [[C1]], label [[IF:%.*]], label [[ELSE:%.*]]
311 ; CHECK:       if:
312 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[A]], -1
313 ; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE]]
314 ; CHECK:       then:
315 ; CHECK-NEXT:    ret i32 0
316 ; CHECK:       else:
317 ; CHECK-NEXT:    [[L:%.*]] = add i32 [[A]], 1
318 ; CHECK-NEXT:    ret i32 [[L]]
320 entry:
321   %c1 = icmp eq i32 %a, 100
322   br i1 %c1, label %if, label %else
325   %c = icmp eq i32 %a, -1
326   br i1 %c, label %then, label %else
328 then:
329   ret i32 0
331 else:
332   %l = add i32 %a, 1
333   ret i32 %l
336 declare void @other()