[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / tbz-tbnz.ll
blob5d6b3903fbbba977538ee55881f26ab620fb7f43
1 ; RUN: llc < %s -O1 -mtriple=aarch64-eabi -aarch64-enable-cond-br-tune=false | FileCheck %s
3 declare void @t()
5 define void @test1(i32 %a) {
6 ; CHECK-LABEL: @test1
7 entry:
8   %sub = add nsw i32 %a, -12
9   %cmp = icmp slt i32 %sub, 0
10   br i1 %cmp, label %if.then, label %if.end
12 ; CHECK: sub [[CMP:w[0-9]+]], w0, #12
13 ; CHECK: tbnz [[CMP]], #31
15 if.then:
16   call void @t()
17   br label %if.end
19 if.end:
20   ret void
23 define void @test2(i64 %a) {
24 ; CHECK-LABEL: @test2
25 entry:
26   %sub = add nsw i64 %a, -12
27   %cmp = icmp slt i64 %sub, 0
28   br i1 %cmp, label %if.then, label %if.end
30 ; CHECK: sub [[CMP:x[0-9]+]], x0, #12
31 ; CHECK: tbnz [[CMP]], #63
33 if.then:
34   call void @t()
35   br label %if.end
37 if.end:
38   ret void
41 define void @test3(i32 %a) {
42 ; CHECK-LABEL: @test3
43 entry:
44   %sub = add nsw i32 %a, -12
45   %cmp = icmp sgt i32 %sub, -1
46   br i1 %cmp, label %if.then, label %if.end
48 ; CHECK: sub [[CMP:w[0-9]+]], w0, #12
49 ; CHECK: tbnz [[CMP]], #31
51 if.then:
52   call void @t()
53   br label %if.end
55 if.end:
56   ret void
59 define void @test4(i64 %a) {
60 ; CHECK-LABEL: @test4
61 entry:
62   %sub = add nsw i64 %a, -12
63   %cmp = icmp sgt i64 %sub, -1
64   br i1 %cmp, label %if.then, label %if.end
66 ; CHECK: sub [[CMP:x[0-9]+]], x0, #12
67 ; CHECK: tbnz [[CMP]], #63
69 if.then:
70   call void @t()
71   br label %if.end
73 if.end:
74   ret void
77 define void @test5(i32 %a) {
78 ; CHECK-LABEL: @test5
79 entry:
80   %sub = add nsw i32 %a, -12
81   %cmp = icmp sge i32 %sub, 0
82   br i1 %cmp, label %if.then, label %if.end
84 ; CHECK: sub [[CMP:w[0-9]+]], w0, #12
85 ; CHECK: tbnz [[CMP]], #31
87 if.then:
88   call void @t()
89   br label %if.end
91 if.end:
92   ret void
95 define void @test6(i64 %a) {
96 ; CHECK-LABEL: @test6
97 entry:
98   %sub = add nsw i64 %a, -12
99   %cmp = icmp sge i64 %sub, 0
100   br i1 %cmp, label %if.then, label %if.end
102 ; CHECK: sub [[CMP:x[0-9]+]], x0, #12
103 ; CHECK: tbnz [[CMP]], #63
105 if.then:
106   call void @t()
107   br label %if.end
109 if.end:
110   ret void
113 define void @test7(i32 %a) {
114 ; CHECK-LABEL: @test7
115 entry:
116   %sub = sub nsw i32 %a, 12
117   %cmp = icmp slt i32 %sub, 0
118   br i1 %cmp, label %if.then, label %if.end
120 ; CHECK: sub [[CMP:w[0-9]+]], w0, #12
121 ; CHECK: tbnz [[CMP]], #31
123 if.then:
124   call void @t()
125   br label %if.end
127 if.end:
128   ret void
131 define void @test8(i64 %val1, i64 %val2, i64 %val3) {
132 ; CHECK-LABEL: @test8
133   %and1 = and i64 %val1, %val2
134   %tst1 = icmp slt i64 %and1, 0
135   br i1 %tst1, label %if.then1, label %if.end
137 ; CHECK: tst x0, x1
138 ; CHECK-NEXT: b.ge
140 if.then1:
141   %and2 = and i64 %val2, %val3
142   %tst2 = icmp sge i64 %and2, 0
143   br i1 %tst2, label %if.then2, label %if.end
145 ; CHECK: and [[CMP:x[0-9]+]], x1, x2
146 ; CHECK-NOT: cmp
147 ; CHECK: tbnz [[CMP]], #63
149 if.then2:
150   %shifted_op1 = shl i64 %val2, 63
151   %shifted_and1 = and i64 %val1, %shifted_op1
152   %tst3 = icmp slt i64 %shifted_and1, 0
153   br i1 %tst3, label %if.then3, label %if.end
155 ; CHECK: tst x0, x1, lsl #63
156 ; CHECK: b.ge
158 if.then3:
159   %shifted_op2 = shl i64 %val2, 62
160   %shifted_and2 = and i64 %val1, %shifted_op2
161   %tst4 = icmp sge i64 %shifted_and2, 0
162   br i1 %tst4, label %if.then4, label %if.end
164 ; CHECK: tst x0, x1, lsl #62
165 ; CHECK: b.lt
167 if.then4:
168   call void @t()
169   br label %if.end
171 if.end:
172   ret void
175 define void @test9(i64 %val1) {
176 ; CHECK-LABEL: @test9
177   %tst = icmp slt i64 %val1, 0
178   br i1 %tst, label %if.then, label %if.end
180 ; CHECK-NOT: cmp
181 ; CHECK: tbnz x0, #63
183 if.then:
184   call void @t()
185   br label %if.end
187 if.end:
188   ret void
191 define void @test10(i64 %val1) {
192 ; CHECK-LABEL: @test10
193   %tst = icmp slt i64 %val1, 0
194   br i1 %tst, label %if.then, label %if.end
196 ; CHECK-NOT: cmp
197 ; CHECK: tbnz x0, #63
199 if.then:
200   call void @t()
201   br label %if.end
203 if.end:
204   ret void
207 define void @test11(i64 %val1, i64* %ptr) {
208 ; CHECK-LABEL: @test11
210 ; CHECK: ldr [[CMP:x[0-9]+]], [x1]
211 ; CHECK-NOT: cmp
212 ; CHECK: tbnz [[CMP]], #63
214   %val = load i64, i64* %ptr
215   %tst = icmp slt i64 %val, 0
216   br i1 %tst, label %if.then, label %if.end
218 if.then:
219   call void @t()
220   br label %if.end
222 if.end:
223   ret void
226 define void @test12(i64 %val1) {
227 ; CHECK-LABEL: @test12
228   %tst = icmp slt i64 %val1, 0
229   br i1 %tst, label %if.then, label %if.end
231 ; CHECK-NOT: cmp
232 ; CHECK: tbnz x0, #63
234 if.then:
235   call void @t()
236   br label %if.end
238 if.end:
239   ret void
242 define void @test13(i64 %val1, i64 %val2) {
243 ; CHECK-LABEL: @test13
244   %or = or i64 %val1, %val2
245   %tst = icmp slt i64 %or, 0
246   br i1 %tst, label %if.then, label %if.end
248 ; CHECK: orr [[CMP:x[0-9]+]], x0, x1
249 ; CHECK-NOT: cmp
250 ; CHECK: tbnz [[CMP]], #63
252 if.then:
253   call void @t()
254   br label %if.end
256 if.end:
257   ret void
260 define void @test14(i1 %cond) {
261 ; CHECK-LABEL: @test14
262   br i1 %cond, label %if.end, label %if.then
264 ; CHECK-NOT: and
265 ; CHECK: tbnz w0, #0
267 if.then:
268   call void @t()
269   br label %if.end
271 if.end:
272   ret void
275 define void @test15(i1 %cond) {
276 ; CHECK-LABEL: @test15
277   %cond1 = xor i1 %cond, -1
278   br i1 %cond1, label %if.then, label %if.end
280 ; CHECK-NOT: movn
281 ; CHECK: tbnz w0, #0
283 if.then:
284   call void @t()
285   br label %if.end
287 if.end:
288   ret void
291 define void @test16(i64 %in) {
292 ; CHECK-LABEL: @test16
293   %shl = shl i64 %in, 3
294   %and = and i64 %shl, 32
295   %cond = icmp eq i64 %and, 0
296   br i1 %cond, label %then, label %end
298 ; CHECK-NOT: lsl
299 ; CHECK: tbnz w0, #2
301 then:
302   call void @t()
303   br label %end
305 end:
306   ret void
309 define void @test17(i64 %in) {
310 ; CHECK-LABEL: @test17
311   %shr = ashr i64 %in, 3
312   %and = and i64 %shr, 1
313   %cond = icmp eq i64 %and, 0
314   br i1 %cond, label %then, label %end
316 ; CHECK-NOT: lsr
317 ; CHECK: tbnz w0, #3
319 then:
320   call void @t()
321   br label %end
323 end:
324   ret void
327 define void @test18(i32 %in) {
328 ; CHECK-LABEL: @test18
329   %shr = ashr i32 %in, 2
330   %cond = icmp sge i32 %shr, 0
331   br i1 %cond, label %then, label %end
333 ; CHECK-NOT: asr
334 ; CHECK: tbnz w0, #31
336 then:
337   call void @t()
338   br label %end
340 end:
341   ret void
344 define void @test19(i64 %in) {
345 ; CHECK-LABEL: @test19
346   %shl = lshr i64 %in, 3
347   %trunc = trunc i64 %shl to i32
348   %and = and i32 %trunc, 1
349   %cond = icmp eq i32 %and, 0
350   br i1 %cond, label %then, label %end
352 ; CHECK-NOT: ubfx
353 ; CHECK: tbnz w0, #3
355 then:
356   call void @t()
357   br label %end
359 end:
360   ret void
363 define void @test20(i32 %in) nounwind {
364 ; CHECK-LABEL: test20:
365 ; CHECK:       // %bb.0:
366 ; CHECK-NEXT:    tbnz w0, #2, .LBB19_2
367 ; CHECK-NEXT:  // %bb.1: // %then
368 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
369 ; CHECK-NEXT:    bl t
370 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
371 ; CHECK-NEXT:  .LBB19_2: // %end
372 ; CHECK-NEXT:    ret
373   %shl = shl i32 %in, 3
374   %zext = zext i32 %shl to i64
375   %and = and i64 %zext, 32
376   %cond = icmp eq i64 %and, 0
377   br i1 %cond, label %then, label %end
380 then:
381   call void @t()
382   br label %end
384 end:
385   ret void