@@ -36,13 +36,16 @@ define void @test_01(i32 %n) {
36
36
;
37
37
; CHECK-LABEL: @test_01(
38
38
; CHECK-NEXT: entry:
39
- ; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[N:%.*]] to i64
39
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], 0
40
+ ; CHECK-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 0
41
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i32 [[SMAX]], 1
42
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[TMP1]] to i64
40
43
; CHECK-NEXT: br label [[LOOP:%.*]]
41
44
; CHECK: loop:
42
45
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
43
46
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
44
- ; CHECK-NEXT: [[TMP0 :%.*]] = icmp slt i64 [[IV ]], [[SEXT ]]
45
- ; CHECK-NEXT: br i1 [[TMP0 ]], label [[LOOP]], label [[EXIT:%.*]]
47
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[IV_NEXT ]], [[WIDE_TRIP_COUNT ]]
48
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label [[LOOP]], label [[EXIT:%.*]]
46
49
; CHECK: exit:
47
50
; CHECK-NEXT: ret void
48
51
;
@@ -63,13 +66,16 @@ define void @test_02(i32 %n) {
63
66
;
64
67
; CHECK-LABEL: @test_02(
65
68
; CHECK-NEXT: entry:
66
- ; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[N:%.*]] to i64
69
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], 2147483646
70
+ ; CHECK-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 2147483646
71
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i32 [[SMAX]], 1
72
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[TMP1]] to i64
67
73
; CHECK-NEXT: br label [[LOOP:%.*]]
68
74
; CHECK: loop:
69
75
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 2147483646, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
70
76
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
71
- ; CHECK-NEXT: [[TMP0 :%.*]] = icmp slt i64 [[IV ]], [[SEXT ]]
72
- ; CHECK-NEXT: br i1 [[TMP0 ]], label [[LOOP]], label [[EXIT:%.*]]
77
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[IV_NEXT ]], [[WIDE_TRIP_COUNT ]]
78
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label [[LOOP]], label [[EXIT:%.*]]
73
79
; CHECK: exit:
74
80
; CHECK-NEXT: ret void
75
81
;
@@ -113,13 +119,16 @@ define void @test_04(i32 %n) {
113
119
;
114
120
; CHECK-LABEL: @test_04(
115
121
; CHECK-NEXT: entry:
116
- ; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[N:%.*]] to i64
122
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], -2147483647
123
+ ; CHECK-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 -2147483647
124
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[SMAX]], 1
117
125
; CHECK-NEXT: br label [[LOOP:%.*]]
118
126
; CHECK: loop:
119
127
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -2147483647, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
120
128
; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 1
121
- ; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i64 [[IV]], [[SEXT]]
122
- ; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
129
+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[IV_NEXT]] to i32
130
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[TMP1]]
131
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
123
132
; CHECK: exit:
124
133
; CHECK-NEXT: ret void
125
134
;
@@ -243,13 +252,16 @@ exit:
243
252
define void @test_02_unsigned (i32 %n ) {
244
253
; CHECK-LABEL: @test_02_unsigned(
245
254
; CHECK-NEXT: entry:
246
- ; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[N:%.*]] to i64
255
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt i32 [[N:%.*]], -2
256
+ ; CHECK-NEXT: [[UMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 -2
257
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[UMAX]], 1
247
258
; CHECK-NEXT: br label [[LOOP:%.*]]
248
259
; CHECK: loop:
249
260
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 4294967294, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
250
261
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
251
- ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], [[ZEXT]]
252
- ; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
262
+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[IV_NEXT]] to i32
263
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[TMP1]]
264
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
253
265
; CHECK: exit:
254
266
; CHECK-NEXT: ret void
255
267
;
@@ -318,13 +330,16 @@ exit:
318
330
define void @test_05_unsigned (i32 %n ) {
319
331
; CHECK-LABEL: @test_05_unsigned(
320
332
; CHECK-NEXT: entry:
321
- ; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[N:%.*]] to i64
333
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt i32 [[N:%.*]], 1
334
+ ; CHECK-NEXT: [[UMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 1
335
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[UMAX]], 1
322
336
; CHECK-NEXT: br label [[LOOP:%.*]]
323
337
; CHECK: loop:
324
338
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
325
339
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
326
- ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], [[ZEXT]]
327
- ; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
340
+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[IV_NEXT]] to i32
341
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[TMP1]]
342
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
328
343
; CHECK: exit:
329
344
; CHECK-NEXT: ret void
330
345
;
@@ -366,14 +381,18 @@ exit:
366
381
define void @test_07 (i32* %p , i32 %n ) {
367
382
; CHECK-LABEL: @test_07(
368
383
; CHECK-NEXT: entry:
384
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N:%.*]], 0
385
+ ; CHECK-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 0
386
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i32 [[SMAX]], 1
387
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[TMP1]] to i64
369
388
; CHECK-NEXT: br label [[LOOP:%.*]]
370
389
; CHECK: loop:
371
390
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
372
391
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
373
392
; CHECK-NEXT: [[NARROW_IV:%.*]] = trunc i64 [[IV]] to i32
374
393
; CHECK-NEXT: store i32 [[NARROW_IV]], i32* [[P:%.*]]
375
- ; CHECK-NEXT: [[CMP :%.*]] = icmp slt i32 [[NARROW_IV ]], [[N:%.* ]]
376
- ; CHECK-NEXT: br i1 [[CMP ]], label [[LOOP]], label [[EXIT:%.*]]
394
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[IV_NEXT ]], [[WIDE_TRIP_COUNT ]]
395
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label [[LOOP]], label [[EXIT:%.*]]
377
396
; CHECK: exit:
378
397
; CHECK-NEXT: ret void
379
398
;
@@ -451,15 +470,17 @@ exit:
451
470
define void @test_10 (i32 %n ) {
452
471
; CHECK-LABEL: @test_10(
453
472
; CHECK-NEXT: entry:
454
- ; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[N:%.*]] to i64
473
+ ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[N:%.*]], 100
474
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
475
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 90
476
+ ; CHECK-NEXT: [[UMIN:%.*]] = select i1 [[TMP2]], i64 [[TMP1]], i64 90
477
+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[UMIN]], -99
455
478
; CHECK-NEXT: br label [[LOOP:%.*]]
456
479
; CHECK: loop:
457
480
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -100, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
458
481
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
459
- ; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV]], [[SEXT]]
460
- ; CHECK-NEXT: [[NEGCMP:%.*]] = icmp slt i64 [[IV]], -10
461
- ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP0]], [[NEGCMP]]
462
- ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]
482
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[TMP3]]
483
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
463
484
; CHECK: exit:
464
485
; CHECK-NEXT: ret void
465
486
;
@@ -530,13 +551,15 @@ define void @test_12(i32* %p) {
530
551
; CHECK-LABEL: @test_12(
531
552
; CHECK-NEXT: entry:
532
553
; CHECK-NEXT: [[N:%.*]] = load i32, i32* [[P:%.*]], !range !0
533
- ; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[N]] to i64
554
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N]], 1
555
+ ; CHECK-NEXT: [[SMAX:%.*]] = select i1 [[TMP0]], i32 [[N]], i32 1
556
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[SMAX]] to i64
534
557
; CHECK-NEXT: br label [[LOOP:%.*]]
535
558
; CHECK: loop:
536
559
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
537
560
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
538
- ; CHECK-NEXT: [[TMP0 :%.*]] = icmp ult i64 [[IV_NEXT]], [[ZEXT ]]
539
- ; CHECK-NEXT: br i1 [[TMP0 ]], label [[LOOP]], label [[EXIT:%.*]]
561
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[IV_NEXT]], [[WIDE_TRIP_COUNT ]]
562
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label [[LOOP]], label [[EXIT:%.*]]
540
563
; CHECK: exit:
541
564
; CHECK-NEXT: ret void
542
565
;
0 commit comments