@@ -68,28 +68,32 @@ define i32 @iv_zext_zext_gt_slt(i32 %iter.count, ptr %ptr) {
68
68
; CHECK-LABEL: define i32 @iv_zext_zext_gt_slt(
69
69
; CHECK-SAME: i32 [[ITER_COUNT:%.*]], ptr [[PTR:%.*]]) {
70
70
; CHECK-NEXT: [[ENTRY:.*]]:
71
- ; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[ITER_COUNT]] to i64
71
+ ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[ITER_COUNT]], -1
72
72
; CHECK-NEXT: br label %[[OUTER_LOOP:.*]]
73
73
; CHECK: [[PH_LOOPEXIT:.*]]:
74
74
; CHECK-NEXT: br label %[[PH:.*]]
75
75
; CHECK: [[PH]]:
76
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT3:%.*]] = add i32 [[INDVARS_IV1:%.*]], -1
76
77
; CHECK-NEXT: br label %[[OUTER_LOOP]]
77
78
; CHECK: [[OUTER_LOOP]]:
78
- ; CHECK-NEXT: [[INDVARS_IV1:%.*]] = phi i64 [ [[INDVARS_IV_NEXT2:%.*]], %[[PH]] ], [ [[TMP0]], %[[ENTRY]] ]
79
- ; CHECK-NEXT: [[INDVARS_IV_NEXT2]] = add nsw i64 [[INDVARS_IV1]], -1
79
+ ; CHECK-NEXT: [[INDVARS_IV1]] = phi i32 [ [[INDVARS_IV_NEXT3]], %[[PH]] ], [ [[TMP0]], %[[ENTRY]] ]
80
+ ; CHECK-NEXT: [[IV_OUTER:%.*]] = phi i32 [ [[IV_OUTER_1:%.*]], %[[PH]] ], [ [[ITER_COUNT]], %[[ENTRY]] ]
81
+ ; CHECK-NEXT: [[IV_OUTER_1]] = add nsw i32 [[IV_OUTER]], -1
82
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT2:%.*]] = zext nneg i32 [[IV_OUTER_1]] to i64
80
83
; CHECK-NEXT: [[GEP_OUTER:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[INDVARS_IV_NEXT2]]
81
84
; CHECK-NEXT: store i8 0, ptr [[GEP_OUTER]], align 1
82
- ; CHECK-NEXT: [[EXIT_COND_OUTER:%.*]] = icmp samesign ugt i64 [[INDVARS_IV1 ]], 1
85
+ ; CHECK-NEXT: [[EXIT_COND_OUTER:%.*]] = icmp samesign ugt i32 [[IV_OUTER ]], 1
83
86
; CHECK-NEXT: br i1 [[EXIT_COND_OUTER]], label %[[INNER_LOOP_PREHEADER:.*]], label %[[PH]]
84
87
; CHECK: [[INNER_LOOP_PREHEADER]]:
88
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[INDVARS_IV1]] to i64
85
89
; CHECK-NEXT: br label %[[INNER_LOOP:.*]]
86
90
; CHECK: [[INNER_LOOP]]:
87
91
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, %[[INNER_LOOP_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[INNER_LOOP]] ]
88
92
; CHECK-NEXT: [[GEP_INNER:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[INDVARS_IV]]
89
93
; CHECK-NEXT: store i8 0, ptr [[GEP_INNER]], align 1
90
94
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
91
- ; CHECK-NEXT: [[EXIT_COND_INNER :%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[INDVARS_IV_NEXT2 ]]
92
- ; CHECK-NEXT: br i1 [[EXIT_COND_INNER ]], label %[[INNER_LOOP]], label %[[PH_LOOPEXIT]]
95
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT ]]
96
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label %[[INNER_LOOP]], label %[[PH_LOOPEXIT]]
93
97
; CHECK: [[EXIT:.*:]]
94
98
; CHECK-NEXT: ret i32 0
95
99
;
@@ -424,28 +428,32 @@ define i32 @iv_sext_sext_gt_slt(i32 %iter.count, ptr %ptr) {
424
428
; CHECK-LABEL: define i32 @iv_sext_sext_gt_slt(
425
429
; CHECK-SAME: i32 [[ITER_COUNT:%.*]], ptr [[PTR:%.*]]) {
426
430
; CHECK-NEXT: [[ENTRY:.*]]:
431
+ ; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[ITER_COUNT]], -1
427
432
; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[ITER_COUNT]] to i64
428
433
; CHECK-NEXT: br label %[[OUTER_LOOP:.*]]
429
434
; CHECK: [[PH_LOOPEXIT:.*]]:
430
435
; CHECK-NEXT: br label %[[PH:.*]]
431
436
; CHECK: [[PH]]:
437
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT3:%.*]] = add i32 [[INDVARS_IV2:%.*]], -1
432
438
; CHECK-NEXT: br label %[[OUTER_LOOP]]
433
439
; CHECK: [[OUTER_LOOP]]:
434
440
; CHECK-NEXT: [[INDVARS_IV1:%.*]] = phi i64 [ [[INDVARS_IV_NEXT2:%.*]], %[[PH]] ], [ [[TMP0]], %[[ENTRY]] ]
441
+ ; CHECK-NEXT: [[INDVARS_IV2]] = phi i32 [ [[INDVARS_IV_NEXT3]], %[[PH]] ], [ [[TMP1]], %[[ENTRY]] ]
435
442
; CHECK-NEXT: [[INDVARS_IV_NEXT2]] = add nsw i64 [[INDVARS_IV1]], -1
436
443
; CHECK-NEXT: [[GEP_OUTER:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[INDVARS_IV_NEXT2]]
437
444
; CHECK-NEXT: store i8 0, ptr [[GEP_OUTER]], align 1
438
445
; CHECK-NEXT: [[EXIT_COND_OUTER:%.*]] = icmp samesign ugt i64 [[INDVARS_IV1]], 1
439
446
; CHECK-NEXT: br i1 [[EXIT_COND_OUTER]], label %[[INNER_LOOP_PREHEADER:.*]], label %[[PH]]
440
447
; CHECK: [[INNER_LOOP_PREHEADER]]:
448
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[INDVARS_IV2]] to i64
441
449
; CHECK-NEXT: br label %[[INNER_LOOP:.*]]
442
450
; CHECK: [[INNER_LOOP]]:
443
451
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, %[[INNER_LOOP_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[INNER_LOOP]] ]
444
452
; CHECK-NEXT: [[GEP_INNER:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[INDVARS_IV]]
445
453
; CHECK-NEXT: store i8 0, ptr [[GEP_INNER]], align 1
446
454
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
447
- ; CHECK-NEXT: [[EXIT_COND_INNER :%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[INDVARS_IV_NEXT2 ]]
448
- ; CHECK-NEXT: br i1 [[EXIT_COND_INNER ]], label %[[INNER_LOOP]], label %[[PH_LOOPEXIT]]
455
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT ]]
456
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label %[[INNER_LOOP]], label %[[PH_LOOPEXIT]]
449
457
; CHECK: [[EXIT:.*:]]
450
458
; CHECK-NEXT: ret i32 0
451
459
;
0 commit comments