[lldb] Make sure Blocks always have a parent (#117683)
[llvm-project.git] / llvm / test / CodeGen / SystemZ / int-cmp-47.ll
blobe59c1a7c852ee331d8951605af860b5cfe30f04b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; Test the use of TEST UNDER MASK for 64-bit operations.
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
7 @g = global i32 0
9 ; Check the lowest useful TMLL value.
10 define void @f1(i64 %a) {
11 ; CHECK-LABEL: f1:
12 ; CHECK:       # %bb.0: # %entry
13 ; CHECK-NEXT:    tmll %r2, 1
14 ; CHECK-NEXT:    ber %r14
15 ; CHECK-NEXT:  .LBB0_1: # %store
16 ; CHECK-NEXT:    lgrl %r1, g@GOT
17 ; CHECK-NEXT:    mvhi 0(%r1), 1
18 ; CHECK-NEXT:    br %r14
19 entry:
20   %and = and i64 %a, 1
21   %cmp = icmp eq i64 %and, 0
22   br i1 %cmp, label %exit, label %store
24 store:
25   store i32 1, ptr@g
26   br label %exit
28 exit:
29   ret void
32 ; Check the high end of the TMLL range.
33 define void @f2(i64 %a) {
34 ; CHECK-LABEL: f2:
35 ; CHECK:       # %bb.0: # %entry
36 ; CHECK-NEXT:    tmll %r2, 65535
37 ; CHECK-NEXT:    bner %r14
38 ; CHECK-NEXT:  .LBB1_1: # %store
39 ; CHECK-NEXT:    lgrl %r1, g@GOT
40 ; CHECK-NEXT:    mvhi 0(%r1), 1
41 ; CHECK-NEXT:    br %r14
42 entry:
43   %and = and i64 %a, 65535
44   %cmp = icmp ne i64 %and, 0
45   br i1 %cmp, label %exit, label %store
47 store:
48   store i32 1, ptr@g
49   br label %exit
51 exit:
52   ret void
55 ; Check the lowest useful TMLH value, which is the next value up.
56 define void @f3(i64 %a) {
57 ; CHECK-LABEL: f3:
58 ; CHECK:       # %bb.0: # %entry
59 ; CHECK-NEXT:    tmlh %r2, 1
60 ; CHECK-NEXT:    bner %r14
61 ; CHECK-NEXT:  .LBB2_1: # %store
62 ; CHECK-NEXT:    lgrl %r1, g@GOT
63 ; CHECK-NEXT:    mvhi 0(%r1), 1
64 ; CHECK-NEXT:    br %r14
65 entry:
66   %and = and i64 %a, 65536
67   %cmp = icmp ne i64 %and, 0
68   br i1 %cmp, label %exit, label %store
70 store:
71   store i32 1, ptr@g
72   br label %exit
74 exit:
75   ret void
78 ; Check the next value up again, which cannot use TM.
79 define void @f4(i64 %a) {
80 ; CHECK-LABEL: f4:
81 ; CHECK:       # %bb.0: # %entry
82 ; CHECK-NEXT:    llilf %r0, 4294901759
83 ; CHECK-NEXT:    ngr %r0, %r2
84 ; CHECK-NEXT:    ber %r14
85 ; CHECK-NEXT:  .LBB3_1: # %store
86 ; CHECK-NEXT:    lgrl %r1, g@GOT
87 ; CHECK-NEXT:    mvhi 0(%r1), 1
88 ; CHECK-NEXT:    br %r14
89 entry:
90   %and = and i64 %a, 4294901759
91   %cmp = icmp eq i64 %and, 0
92   br i1 %cmp, label %exit, label %store
94 store:
95   store i32 1, ptr@g
96   br label %exit
98 exit:
99   ret void
102 ; Check the high end of the TMLH range.
103 define void @f5(i64 %a) {
104 ; CHECK-LABEL: f5:
105 ; CHECK:       # %bb.0: # %entry
106 ; CHECK-NEXT:    tmlh %r2, 65535
107 ; CHECK-NEXT:    ber %r14
108 ; CHECK-NEXT:  .LBB4_1: # %store
109 ; CHECK-NEXT:    lgrl %r1, g@GOT
110 ; CHECK-NEXT:    mvhi 0(%r1), 1
111 ; CHECK-NEXT:    br %r14
112 entry:
113   %and = and i64 %a, 4294901760
114   %cmp = icmp eq i64 %and, 0
115   br i1 %cmp, label %exit, label %store
117 store:
118   store i32 1, ptr@g
119   br label %exit
121 exit:
122   ret void
125 ; Check the lowest useful TMHL value.
126 define void @f6(i64 %a) {
127 ; CHECK-LABEL: f6:
128 ; CHECK:       # %bb.0: # %entry
129 ; CHECK-NEXT:    tmhl %r2, 1
130 ; CHECK-NEXT:    ber %r14
131 ; CHECK-NEXT:  .LBB5_1: # %store
132 ; CHECK-NEXT:    lgrl %r1, g@GOT
133 ; CHECK-NEXT:    mvhi 0(%r1), 1
134 ; CHECK-NEXT:    br %r14
135 entry:
136   %and = and i64 %a, 4294967296
137   %cmp = icmp eq i64 %and, 0
138   br i1 %cmp, label %exit, label %store
140 store:
141   store i32 1, ptr@g
142   br label %exit
144 exit:
145   ret void
148 ; Check the next value up again, which cannot use TM.
149 define void @f7(i64 %a) {
150 ; CHECK-LABEL: f7:
151 ; CHECK:       # %bb.0: # %entry
152 ; CHECK-NEXT:    llihl %r0, 1
153 ; CHECK-NEXT:    oill %r0, 1
154 ; CHECK-NEXT:    ngr %r0, %r2
155 ; CHECK-NEXT:    blr %r14
156 ; CHECK-NEXT:  .LBB6_1: # %store
157 ; CHECK-NEXT:    lgrl %r1, g@GOT
158 ; CHECK-NEXT:    mvhi 0(%r1), 1
159 ; CHECK-NEXT:    br %r14
160 entry:
161   %and = and i64 %a, 4294967297
162   %cmp = icmp ne i64 %and, 0
163   br i1 %cmp, label %exit, label %store
165 store:
166   store i32 1, ptr@g
167   br label %exit
169 exit:
170   ret void
173 ; Check the high end of the TMHL range.
174 define void @f8(i64 %a) {
175 ; CHECK-LABEL: f8:
176 ; CHECK:       # %bb.0: # %entry
177 ; CHECK-NEXT:    tmhl %r2, 65535
178 ; CHECK-NEXT:    bner %r14
179 ; CHECK-NEXT:  .LBB7_1: # %store
180 ; CHECK-NEXT:    lgrl %r1, g@GOT
181 ; CHECK-NEXT:    mvhi 0(%r1), 1
182 ; CHECK-NEXT:    br %r14
183 entry:
184   %and = and i64 %a, 281470681743360
185   %cmp = icmp ne i64 %and, 0
186   br i1 %cmp, label %exit, label %store
188 store:
189   store i32 1, ptr@g
190   br label %exit
192 exit:
193   ret void
196 ; Check the lowest useful TMHH value.
197 define void @f9(i64 %a) {
198 ; CHECK-LABEL: f9:
199 ; CHECK:       # %bb.0: # %entry
200 ; CHECK-NEXT:    tmhh %r2, 1
201 ; CHECK-NEXT:    bner %r14
202 ; CHECK-NEXT:  .LBB8_1: # %store
203 ; CHECK-NEXT:    lgrl %r1, g@GOT
204 ; CHECK-NEXT:    mvhi 0(%r1), 1
205 ; CHECK-NEXT:    br %r14
206 entry:
207   %and = and i64 %a, 281474976710656
208   %cmp = icmp ne i64 %and, 0
209   br i1 %cmp, label %exit, label %store
211 store:
212   store i32 1, ptr@g
213   br label %exit
215 exit:
216   ret void
219 ; Check the high end of the TMHH range.
220 define void @f10(i64 %a) {
221 ; CHECK-LABEL: f10:
222 ; CHECK:       # %bb.0: # %entry
223 ; CHECK-NEXT:    tmhh %r2, 65535
224 ; CHECK-NEXT:    ber %r14
225 ; CHECK-NEXT:  .LBB9_1: # %store
226 ; CHECK-NEXT:    lgrl %r1, g@GOT
227 ; CHECK-NEXT:    mvhi 0(%r1), 1
228 ; CHECK-NEXT:    br %r14
229 entry:
230   %and = and i64 %a, 18446462598732840960
231   %cmp = icmp eq i64 %and, 0
232   br i1 %cmp, label %exit, label %store
234 store:
235   store i32 1, ptr@g
236   br label %exit
238 exit:
239   ret void
242 ; Check that we can fold an SHL into a TMxx mask.
243 define void @f11(i64 %a) {
244 ; CHECK-LABEL: f11:
245 ; CHECK:       # %bb.0: # %entry
246 ; CHECK-NEXT:    tmhl %r2, 32768
247 ; CHECK-NEXT:    bner %r14
248 ; CHECK-NEXT:  .LBB10_1: # %store
249 ; CHECK-NEXT:    lgrl %r1, g@GOT
250 ; CHECK-NEXT:    mvhi 0(%r1), 1
251 ; CHECK-NEXT:    br %r14
252 entry:
253   %shl = shl i64 %a, 1
254   %and = and i64 %shl, 281474976710656
255   %cmp = icmp ne i64 %and, 0
256   br i1 %cmp, label %exit, label %store
258 store:
259   store i32 1, ptr@g
260   br label %exit
262 exit:
263   ret void
266 ; Check that we can fold an SHR into a TMxx mask.
267 define void @f12(i64 %a) {
268 ; CHECK-LABEL: f12:
269 ; CHECK:       # %bb.0: # %entry
270 ; CHECK-NEXT:    tmhh %r2, 256
271 ; CHECK-NEXT:    bner %r14
272 ; CHECK-NEXT:  .LBB11_1: # %store
273 ; CHECK-NEXT:    lgrl %r1, g@GOT
274 ; CHECK-NEXT:    mvhi 0(%r1), 1
275 ; CHECK-NEXT:    br %r14
276 entry:
277   %shr = lshr i64 %a, 56
278   %and = and i64 %shr, 1
279   %cmp = icmp ne i64 %and, 0
280   br i1 %cmp, label %exit, label %store
282 store:
283   store i32 1, ptr@g
284   br label %exit
286 exit:
287   ret void
290 ; Check a case where TMHH can be used to implement a ult comparison.
291 define void @f13(i64 %a) {
292 ; CHECK-LABEL: f13:
293 ; CHECK:       # %bb.0: # %entry
294 ; CHECK-NEXT:    tmhh %r2, 49152
295 ; CHECK-NEXT:    bnor %r14
296 ; CHECK-NEXT:  .LBB12_1: # %store
297 ; CHECK-NEXT:    lgrl %r1, g@GOT
298 ; CHECK-NEXT:    mvhi 0(%r1), 1
299 ; CHECK-NEXT:    br %r14
300 entry:
301   %cmp = icmp ult i64 %a, 13835058055282163712
302   br i1 %cmp, label %exit, label %store
304 store:
305   store i32 1, ptr@g
306   br label %exit
308 exit:
309   ret void
312 ; And again with ule.
313 define void @f14(i64 %a) {
314 ; CHECK-LABEL: f14:
315 ; CHECK:       # %bb.0: # %entry
316 ; CHECK-NEXT:    tmhh %r2, 49152
317 ; CHECK-NEXT:    bnor %r14
318 ; CHECK-NEXT:  .LBB13_1: # %store
319 ; CHECK-NEXT:    lgrl %r1, g@GOT
320 ; CHECK-NEXT:    mvhi 0(%r1), 1
321 ; CHECK-NEXT:    br %r14
322 entry:
323   %cmp = icmp ule i64 %a, 13835058055282163711
324   br i1 %cmp, label %exit, label %store
326 store:
327   store i32 1, ptr@g
328   br label %exit
330 exit:
331   ret void
334 ; And again with ugt.
335 define void @f15(i64 %a) {
336 ; CHECK-LABEL: f15:
337 ; CHECK:       # %bb.0: # %entry
338 ; CHECK-NEXT:    tmhh %r2, 49152
339 ; CHECK-NEXT:    bor %r14
340 ; CHECK-NEXT:  .LBB14_1: # %store
341 ; CHECK-NEXT:    lgrl %r1, g@GOT
342 ; CHECK-NEXT:    mvhi 0(%r1), 1
343 ; CHECK-NEXT:    br %r14
344 entry:
345   %cmp = icmp ugt i64 %a, 13835058055282163711
346   br i1 %cmp, label %exit, label %store
348 store:
349   store i32 1, ptr@g
350   br label %exit
352 exit:
353   ret void
356 ; And again with uge.
357 define void @f16(i64 %a) {
358 ; CHECK-LABEL: f16:
359 ; CHECK:       # %bb.0: # %entry
360 ; CHECK-NEXT:    tmhh %r2, 49152
361 ; CHECK-NEXT:    bor %r14
362 ; CHECK-NEXT:  .LBB15_1: # %store
363 ; CHECK-NEXT:    lgrl %r1, g@GOT
364 ; CHECK-NEXT:    mvhi 0(%r1), 1
365 ; CHECK-NEXT:    br %r14
366 entry:
367   %cmp = icmp uge i64 %a, 13835058055282163712
368   br i1 %cmp, label %exit, label %store
370 store:
371   store i32 1, ptr@g
372   br label %exit
374 exit:
375   ret void
378 ; Decrease the constant from f13 to make TMHH invalid.
379 define void @f17(i64 %a) {
380 ; CHECK-LABEL: f17:
381 ; CHECK:       # %bb.0: # %entry
382 ; CHECK-NEXT:    srlg %r0, %r2, 48
383 ; CHECK-NEXT:    cgfi %r0, 49151
384 ; CHECK-NEXT:    blr %r14
385 ; CHECK-NEXT:  .LBB16_1: # %store
386 ; CHECK-NEXT:    lgrl %r1, g@GOT
387 ; CHECK-NEXT:    mvhi 0(%r1), 1
388 ; CHECK-NEXT:    br %r14
389 entry:
390   %cmp = icmp ult i64 %a, 13834776580305453056
391   br i1 %cmp, label %exit, label %store
393 store:
394   store i32 1, ptr@g
395   br label %exit
397 exit:
398   ret void
401 ; Check that we don't use TMHH just to test the top bit.
402 define void @f18(i64 %a) {
403 ; CHECK-LABEL: f18:
404 ; CHECK:       # %bb.0: # %entry
405 ; CHECK-NEXT:    cgibhe %r2, 0, 0(%r14)
406 ; CHECK-NEXT:  .LBB17_1: # %store
407 ; CHECK-NEXT:    lgrl %r1, g@GOT
408 ; CHECK-NEXT:    mvhi 0(%r1), 1
409 ; CHECK-NEXT:    br %r14
410 entry:
411   %cmp = icmp ult i64 %a, 9223372036854775808
412   br i1 %cmp, label %exit, label %store
414 store:
415   store i32 1, ptr@g
416   br label %exit
418 exit:
419   ret void
422 ; Check that we don't fold a shift if the comparison value
423 ; would need to be shifted out of range
424 define void @f19(i64 %a) {
425 ; CHECK-LABEL: f19:
426 ; CHECK:       # %bb.0: # %entry
427 ; CHECK-NEXT:    srlg %r0, %r2, 63
428 ; CHECK-NEXT:    cgibl %r0, 3, 0(%r14)
429 ; CHECK-NEXT:  .LBB18_1: # %store
430 ; CHECK-NEXT:    lgrl %r1, g@GOT
431 ; CHECK-NEXT:    mvhi 0(%r1), 1
432 ; CHECK-NEXT:    br %r14
433 entry:
434   %shr = lshr i64 %a, 63
435   %cmp = icmp ult i64 %shr, 3
436   br i1 %cmp, label %exit, label %store
438 store:
439   store i32 1, ptr@g
440   br label %exit
442 exit:
443   ret void