[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / Transforms / CorrelatedValuePropagation / sub.ll
blob353b4b0977999b34849c5089ab3ce1fe239c9827
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
4 define void @test0(i32 %a) {
5 ; CHECK-LABEL: @test0(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 100
8 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
9 ; CHECK:       bb:
10 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
11 ; CHECK-NEXT:    br label [[EXIT]]
12 ; CHECK:       exit:
13 ; CHECK-NEXT:    ret void
15 entry:
16   %cmp = icmp sgt i32 %a, 100
17   br i1 %cmp, label %bb, label %exit
19 bb:
20   %sub = sub i32 %a, 1
21   br label %exit
23 exit:
24   ret void
27 define void @test1(i32 %a) {
28 ; CHECK-LABEL: @test1(
29 ; CHECK-NEXT:  entry:
30 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 100
31 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
32 ; CHECK:       bb:
33 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i32 [[A]], 1
34 ; CHECK-NEXT:    br label [[EXIT]]
35 ; CHECK:       exit:
36 ; CHECK-NEXT:    ret void
38 entry:
39   %cmp = icmp ugt i32 %a, 100
40   br i1 %cmp, label %bb, label %exit
42 bb:
43   %sub = sub i32 %a, 1
44   br label %exit
46 exit:
47   ret void
50 define void @test2(i32 %a) {
51 ; CHECK-LABEL: @test2(
52 ; CHECK-NEXT:  entry:
53 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], -1
54 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
55 ; CHECK:       bb:
56 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
57 ; CHECK-NEXT:    br label [[EXIT]]
58 ; CHECK:       exit:
59 ; CHECK-NEXT:    ret void
61 entry:
62   %cmp = icmp ugt i32 %a, -1
63   br i1 %cmp, label %bb, label %exit
65 bb:
66   %sub = sub i32 %a, 1
67   br label %exit
69 exit:
70   ret void
73 define void @test3(i32 %a) {
74 ; CHECK-LABEL: @test3(
75 ; CHECK-NEXT:  entry:
76 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], -1
77 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
78 ; CHECK:       bb:
79 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[A]], 1
80 ; CHECK-NEXT:    br label [[EXIT]]
81 ; CHECK:       exit:
82 ; CHECK-NEXT:    ret void
84 entry:
85   %cmp = icmp sgt i32 %a, -1
86   br i1 %cmp, label %bb, label %exit
88 bb:
89   %sub = sub i32 %a, 1
90   br label %exit
92 exit:
93   ret void
96 define void @test4(i32 %a) {
97 ; CHECK-LABEL: @test4(
98 ; CHECK-NEXT:  entry:
99 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 2147483647
100 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
101 ; CHECK:       bb:
102 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i32 [[A]], 1
103 ; CHECK-NEXT:    br label [[EXIT]]
104 ; CHECK:       exit:
105 ; CHECK-NEXT:    ret void
107 entry:
108   %cmp = icmp ugt i32 %a, 2147483647
109   br i1 %cmp, label %bb, label %exit
112   %sub = sub i32 %a, 1
113   br label %exit
115 exit:
116   ret void
119 define void @test5(i32 %a) {
120 ; CHECK-LABEL: @test5(
121 ; CHECK-NEXT:  entry:
122 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 2147483647
123 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
124 ; CHECK:       bb:
125 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A]], 1
126 ; CHECK-NEXT:    br label [[EXIT]]
127 ; CHECK:       exit:
128 ; CHECK-NEXT:    ret void
130 entry:
131   %cmp = icmp sle i32 %a, 2147483647
132   br i1 %cmp, label %bb, label %exit
135   %sub = sub i32 %a, 1
136   br label %exit
138 exit:
139   ret void
142 ; Check for a corner case where an integer value is represented with a constant
143 ; LVILatticeValue instead of constantrange. Check that we don't fail with an
144 ; assertion in this case.
145 @b = global i32 0, align 4
146 define void @test6(i32 %a) {
147 ; CHECK-LABEL: @test6(
148 ; CHECK-NEXT:  bb:
149 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A:%.*]], ptrtoint (ptr @b to i32)
150 ; CHECK-NEXT:    ret void
153   %sub = sub i32 %a, ptrtoint (ptr @b to i32)
154   ret void
157 ; Check that we can gather information for conditions in the form of
158 ;   and ( i s< 100, Unknown )
159 define void @test7(i32 %a, i1 %flag) {
160 ; CHECK-LABEL: @test7(
161 ; CHECK-NEXT:  entry:
162 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp ugt i32 [[A:%.*]], 100
163 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[CMP_1]], [[FLAG:%.*]]
164 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
165 ; CHECK:       bb:
166 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i32 [[A]], 1
167 ; CHECK-NEXT:    br label [[EXIT]]
168 ; CHECK:       exit:
169 ; CHECK-NEXT:    ret void
171 entry:
172   %cmp.1 = icmp ugt i32 %a, 100
173   %cmp = and i1 %cmp.1, %flag
174   br i1 %cmp, label %bb, label %exit
177   %sub = sub i32 %a, 1
178   br label %exit
180 exit:
181   ret void
184 ; Check that we can gather information for conditions in the form of
185 ;   and ( i s< 100, i s> 0 )
186 define void @test8(i32 %a) {
187 ; CHECK-LABEL: @test8(
188 ; CHECK-NEXT:  entry:
189 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp slt i32 [[A:%.*]], 100
190 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sgt i32 [[A]], 0
191 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
192 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
193 ; CHECK:       bb:
194 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
195 ; CHECK-NEXT:    br label [[EXIT]]
196 ; CHECK:       exit:
197 ; CHECK-NEXT:    ret void
199 entry:
200   %cmp.1 = icmp slt i32 %a, 100
201   %cmp.2 = icmp sgt i32 %a, 0
202   %cmp = and i1 %cmp.1, %cmp.2
203   br i1 %cmp, label %bb, label %exit
206   %sub = sub i32 %a, 1
207   br label %exit
209 exit:
210   ret void
213 ; Check that for conditions in the form of cond1 && cond2 we don't mistakenly
214 ; assume that !cond1 && !cond2 holds down to false path.
215 define void @test8_neg(i32 %a) {
216 ; CHECK-LABEL: @test8_neg(
217 ; CHECK-NEXT:  entry:
218 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sge i32 [[A:%.*]], 100
219 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sle i32 [[A]], 0
220 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
221 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]]
222 ; CHECK:       bb:
223 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A]], 1
224 ; CHECK-NEXT:    br label [[EXIT]]
225 ; CHECK:       exit:
226 ; CHECK-NEXT:    ret void
228 entry:
229   %cmp.1 = icmp sge i32 %a, 100
230   %cmp.2 = icmp sle i32 %a, 0
231   %cmp = and i1 %cmp.1, %cmp.2
232   br i1 %cmp, label %exit, label %bb
235   %sub = sub i32 %a, 1
236   br label %exit
238 exit:
239   ret void
242 ; Check that we can gather information for conditions in the form of
243 ;   and ( i s< 100, and (i s> 0, Unknown )
244 define void @test9(i32 %a, i1 %flag) {
245 ; CHECK-LABEL: @test9(
246 ; CHECK-NEXT:  entry:
247 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp slt i32 [[A:%.*]], 100
248 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sgt i32 [[A]], 0
249 ; CHECK-NEXT:    [[CMP_3:%.*]] = and i1 [[CMP_2]], [[FLAG:%.*]]
250 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[CMP_1]], [[CMP_3]]
251 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
252 ; CHECK:       bb:
253 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
254 ; CHECK-NEXT:    br label [[EXIT]]
255 ; CHECK:       exit:
256 ; CHECK-NEXT:    ret void
258 entry:
259   %cmp.1 = icmp slt i32 %a, 100
260   %cmp.2 = icmp sgt i32 %a, 0
261   %cmp.3 = and i1 %cmp.2, %flag
262   %cmp = and i1 %cmp.1, %cmp.3
263   br i1 %cmp, label %bb, label %exit
266   %sub = sub i32 %a, 1
267   br label %exit
269 exit:
270   ret void
273 ; Check that we can gather information for conditions in the form of
274 ;   and ( i s> Unknown, ... )
275 define void @test10(i32 %a, i32 %b, i1 %flag) {
276 ; CHECK-LABEL: @test10(
277 ; CHECK-NEXT:  entry:
278 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
279 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[CMP_1]], [[FLAG:%.*]]
280 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
281 ; CHECK:       bb:
282 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[A]], 1
283 ; CHECK-NEXT:    br label [[EXIT]]
284 ; CHECK:       exit:
285 ; CHECK-NEXT:    ret void
287 entry:
288   %cmp.1 = icmp sgt i32 %a, %b
289   %cmp = and i1 %cmp.1, %flag
290   br i1 %cmp, label %bb, label %exit
293   %sub = sub i32 %a, 1
294   br label %exit
296 exit:
297   ret void
300 @limit = external global i32
301 define i32 @test11(ptr %p, i32 %i) {
302 ; CHECK-LABEL: @test11(
303 ; CHECK-NEXT:    [[LIMIT:%.*]] = load i32, ptr [[P:%.*]], !range !0
304 ; CHECK-NEXT:    [[WITHIN_1:%.*]] = icmp slt i32 [[LIMIT]], [[I:%.*]]
305 ; CHECK-NEXT:    [[I_MINUS_7:%.*]] = add i32 [[I]], -7
306 ; CHECK-NEXT:    [[WITHIN_2:%.*]] = icmp slt i32 [[LIMIT]], [[I_MINUS_7]]
307 ; CHECK-NEXT:    [[WITHIN:%.*]] = and i1 [[WITHIN_1]], [[WITHIN_2]]
308 ; CHECK-NEXT:    br i1 [[WITHIN]], label [[THEN:%.*]], label [[ELSE:%.*]]
309 ; CHECK:       then:
310 ; CHECK-NEXT:    [[I_MINUS_6:%.*]] = sub nuw nsw i32 [[I]], 6
311 ; CHECK-NEXT:    ret i32 [[I_MINUS_6]]
312 ; CHECK:       else:
313 ; CHECK-NEXT:    ret i32 0
315   %limit = load i32, ptr %p, !range !{i32 0, i32 2147483647}
316   %within.1 = icmp slt i32 %limit, %i
317   %i.minus.7 = add i32 %i, -7
318   %within.2 = icmp slt i32 %limit, %i.minus.7
319   %within = and i1 %within.1, %within.2
320   br i1 %within, label %then, label %else
322 then:
323   %i.minus.6 = sub i32 %i, 6
324   ret i32 %i.minus.6
326 else:
327   ret i32 0
330 ; Check that we can gather information for conditions is the form of
331 ;   or ( i s<= -100, Unknown )
332 define void @test12(i32 %a, i1 %flag) {
333 ; CHECK-LABEL: @test12(
334 ; CHECK-NEXT:  entry:
335 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sle i32 [[A:%.*]], -100
336 ; CHECK-NEXT:    [[CMP:%.*]] = or i1 [[CMP_1]], [[FLAG:%.*]]
337 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]]
338 ; CHECK:       bb:
339 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[A]], 1
340 ; CHECK-NEXT:    br label [[EXIT]]
341 ; CHECK:       exit:
342 ; CHECK-NEXT:    ret void
344 entry:
345   %cmp.1 = icmp sle i32 %a, -100
346   %cmp = or i1 %cmp.1, %flag
347   br i1 %cmp, label %exit, label %bb
350   %sub = sub i32 %a, 1
351   br label %exit
353 exit:
354   ret void
357 ; Check that we can gather information for conditions is the form of
358 ;   or ( i s>= 100, i s<= 0 )
359 define void @test13(i32 %a) {
360 ; CHECK-LABEL: @test13(
361 ; CHECK-NEXT:  entry:
362 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sge i32 [[A:%.*]], 100
363 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sle i32 [[A]], 0
364 ; CHECK-NEXT:    [[CMP:%.*]] = or i1 [[CMP_1]], [[CMP_2]]
365 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]]
366 ; CHECK:       bb:
367 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
368 ; CHECK-NEXT:    br label [[EXIT]]
369 ; CHECK:       exit:
370 ; CHECK-NEXT:    ret void
372 entry:
373   %cmp.1 = icmp sge i32 %a, 100
374   %cmp.2 = icmp sle i32 %a, 0
375   %cmp = or i1 %cmp.1, %cmp.2
376   br i1 %cmp, label %exit, label %bb
379   %sub = sub i32 %a, 1
380   br label %exit
382 exit:
383   ret void
386 ; Check that for conditions is the form of cond1 || cond2 we don't mistakenly
387 ; assume that cond1 || cond2 holds down to true path.
388 define void @test13_neg(i32 %a) {
389 ; CHECK-LABEL: @test13_neg(
390 ; CHECK-NEXT:  entry:
391 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp slt i32 [[A:%.*]], 100
392 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sgt i32 [[A]], 0
393 ; CHECK-NEXT:    [[CMP:%.*]] = or i1 [[CMP_1]], [[CMP_2]]
394 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
395 ; CHECK:       bb:
396 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A]], 1
397 ; CHECK-NEXT:    br label [[EXIT]]
398 ; CHECK:       exit:
399 ; CHECK-NEXT:    ret void
401 entry:
402   %cmp.1 = icmp slt i32 %a, 100
403   %cmp.2 = icmp sgt i32 %a, 0
404   %cmp = or i1 %cmp.1, %cmp.2
405   br i1 %cmp, label %bb, label %exit
408   %sub = sub i32 %a, 1
409   br label %exit
411 exit:
412   ret void
415 ; Check that we can gather information for conditions is the form of
416 ;   or ( i s>=100, or (i s<= 0, Unknown )
417 define void @test14(i32 %a, i1 %flag) {
418 ; CHECK-LABEL: @test14(
419 ; CHECK-NEXT:  entry:
420 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sge i32 [[A:%.*]], 100
421 ; CHECK-NEXT:    [[CMP_2:%.*]] = icmp sle i32 [[A]], 0
422 ; CHECK-NEXT:    [[CMP_3:%.*]] = or i1 [[CMP_2]], [[FLAG:%.*]]
423 ; CHECK-NEXT:    [[CMP:%.*]] = or i1 [[CMP_1]], [[CMP_3]]
424 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]]
425 ; CHECK:       bb:
426 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
427 ; CHECK-NEXT:    br label [[EXIT]]
428 ; CHECK:       exit:
429 ; CHECK-NEXT:    ret void
431 entry:
432   %cmp.1 = icmp sge i32 %a, 100
433   %cmp.2 = icmp sle i32 %a, 0
434   %cmp.3 = or i1 %cmp.2, %flag
435   %cmp = or i1 %cmp.1, %cmp.3
436   br i1 %cmp, label %exit, label %bb
439   %sub = sub i32 %a, 1
440   br label %exit
442 exit:
443   ret void
446 ; Check that we can gather information for conditions is the form of
447 ;   or ( i s<= Unknown, ... )
448 define void @test15(i32 %a, i32 %b, i1 %flag) {
449 ; CHECK-LABEL: @test15(
450 ; CHECK-NEXT:  entry:
451 ; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sle i32 [[A:%.*]], [[B:%.*]]
452 ; CHECK-NEXT:    [[CMP:%.*]] = or i1 [[CMP_1]], [[FLAG:%.*]]
453 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]]
454 ; CHECK:       bb:
455 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[A]], 1
456 ; CHECK-NEXT:    br label [[EXIT]]
457 ; CHECK:       exit:
458 ; CHECK-NEXT:    ret void
460 entry:
461   %cmp.1 = icmp sle i32 %a, %b
462   %cmp = or i1 %cmp.1, %flag
463   br i1 %cmp, label %exit, label %bb
466   %sub = sub i32 %a, 1
467   br label %exit
469 exit:
470   ret void
473 ; single basic block loop
474 ; because the loop exit condition is SLT, we can supplement the iv sub
475 ; (iv.next def) with an nsw.
476 define i32 @test16(ptr %n, ptr %a) {
477 ; CHECK-LABEL: @test16(
478 ; CHECK-NEXT:  preheader:
479 ; CHECK-NEXT:    br label [[LOOP:%.*]]
480 ; CHECK:       loop:
481 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
482 ; CHECK-NEXT:    [[ACC:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[ACC_CURR:%.*]], [[LOOP]] ]
483 ; CHECK-NEXT:    [[X:%.*]] = load atomic i32, ptr [[A:%.*]] unordered, align 8
484 ; CHECK-NEXT:    fence acquire
485 ; CHECK-NEXT:    [[ACC_CURR]] = sub i32 [[ACC]], [[X]]
486 ; CHECK-NEXT:    [[IV_NEXT]] = sub nsw i32 [[IV]], -1
487 ; CHECK-NEXT:    [[NVAL:%.*]] = load atomic i32, ptr [[N:%.*]] unordered, align 8
488 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[IV_NEXT]], [[NVAL]]
489 ; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]
490 ; CHECK:       exit:
491 ; CHECK-NEXT:    ret i32 [[ACC_CURR]]
493 preheader:
494   br label %loop
496 loop:
497   %iv = phi i32 [ 0, %preheader ], [ %iv.next, %loop ]
498   %acc = phi i32 [ 0, %preheader ], [ %acc.curr, %loop ]
499   %x = load atomic i32, ptr %a unordered, align 8
500   fence acquire
501   %acc.curr = sub i32 %acc, %x
502   %iv.next = sub i32 %iv, -1
503   %nval = load atomic i32, ptr %n unordered, align 8
504   %cmp = icmp slt i32 %iv.next, %nval
505   br i1 %cmp, label %loop, label %exit
507 exit:
508   ret i32 %acc.curr
511 define void @test17(i32 %a) {
512 ; CHECK-LABEL: @test17(
513 ; CHECK-NEXT:  entry:
514 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 100
515 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
516 ; CHECK:       bb:
517 ; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 1, [[A]]
518 ; CHECK-NEXT:    br label [[EXIT]]
519 ; CHECK:       exit:
520 ; CHECK-NEXT:    ret void
522 entry:
523   %cmp = icmp sgt i32 %a, 100
524   br i1 %cmp, label %bb, label %exit
527   %sub = sub i32 1, %a
528   br label %exit
530 exit:
531   ret void
534 define void @test18(i32 %a) {
535 ; CHECK-LABEL: @test18(
536 ; CHECK-NEXT:  entry:
537 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 10000
538 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
539 ; CHECK:       bb:
540 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i32 -2, [[A]]
541 ; CHECK-NEXT:    br label [[EXIT]]
542 ; CHECK:       exit:
543 ; CHECK-NEXT:    ret void
545 entry:
546   %cmp = icmp sgt i32 %a, 10000
547   br i1 %cmp, label %bb, label %exit
550   %sub = sub i32 -2, %a
551   br label %exit
553 exit:
554   ret void
557 define void @test19(i32 %a) {
558 ; CHECK-LABEL: @test19(
559 ; CHECK-NEXT:  entry:
560 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 100
561 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
562 ; CHECK:       bb:
563 ; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i32 -1, [[A]]
564 ; CHECK-NEXT:    br label [[EXIT]]
565 ; CHECK:       exit:
566 ; CHECK-NEXT:    ret void
568 entry:
569   %cmp = icmp ult i32 %a, 100
570   br i1 %cmp, label %bb, label %exit
573   %sub = sub i32 -1, %a
574   br label %exit
576 exit:
577   ret void
580 define void @test20(i32 %a) {
581 ; CHECK-LABEL: @test20(
582 ; CHECK-NEXT:  entry:
583 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 2147483647
584 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
585 ; CHECK:       bb:
586 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 0, [[A]]
587 ; CHECK-NEXT:    br label [[EXIT]]
588 ; CHECK:       exit:
589 ; CHECK-NEXT:    ret void
591 entry:
592   %cmp = icmp ugt i32 %a, 2147483647
593   br i1 %cmp, label %bb, label %exit
596   %sub = sub i32 0, %a
597   br label %exit
599 exit:
600   ret void