@@ -115,7 +115,8 @@ define void @test_range_metadata(ptr %array_length_ptr, ptr %base,
115115; CHECK-LABEL: @test_range_metadata(
116116; CHECK-NEXT: for.body.lr.ph:
117117; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
118- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
118+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
119+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
119120; CHECK-NEXT: br label [[FOR_BODY:%.*]]
120121; CHECK: for.body:
121122; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -127,7 +128,8 @@ define void @test_range_metadata(ptr %array_length_ptr, ptr %base,
127128; CHECK-NEXT: br label [[FOR_INC]]
128129; CHECK: for.inc:
129130; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
130- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
131+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
132+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
131133; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]
132134; CHECK: for.end:
133135; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -221,10 +223,11 @@ define void @test_transitive_use(ptr %base, i32 %limit, i32 %start) {
221223; CHECK-LABEL: @test_transitive_use(
222224; CHECK-NEXT: for.body.lr.ph:
223225; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
224- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
225- ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[LIMIT]] to i64
226+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[LIMIT:%.*]] to i64
226227; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[START]], i32 64)
227228; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[UMAX]] to i64
229+ ; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[START]], 1
230+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT]], i32 [[TMP5]])
228231; CHECK-NEXT: br label [[FOR_BODY:%.*]]
229232; CHECK: for.body:
230233; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -236,13 +239,14 @@ define void @test_transitive_use(ptr %base, i32 %limit, i32 %start) {
236239; CHECK-NEXT: br i1 [[MUL_WITHIN]], label [[GUARDED:%.*]], label [[CONTINUE_2:%.*]]
237240; CHECK: guarded:
238241; CHECK-NEXT: [[TMP4:%.*]] = add nuw nsw i64 [[TMP3]], 1
239- ; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i64 [[TMP4]], [[TMP1 ]]
242+ ; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i64 [[TMP4]], [[TMP2 ]]
240243; CHECK-NEXT: br i1 [[RESULT]], label [[CONTINUE_2]], label [[FOR_END]]
241244; CHECK: continue.2:
242245; CHECK-NEXT: br label [[FOR_INC]]
243246; CHECK: for.inc:
244247; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
245- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP2]]
248+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
249+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
246250; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]
247251; CHECK: for.end:
248252; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -293,14 +297,16 @@ define void @test_guard_one_bb(ptr %base, i32 %limit, i32 %start) {
293297; CHECK-LABEL: @test_guard_one_bb(
294298; CHECK-NEXT: for.body.lr.ph:
295299; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
296- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
300+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
301+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
297302; CHECK-NEXT: br label [[FOR_BODY:%.*]]
298303; CHECK: for.body:
299304; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
300305; CHECK-NEXT: [[WITHIN_LIMITS:%.*]] = icmp ult i64 [[INDVARS_IV]], 64
301306; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS]]) [ "deopt"() ]
302307; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
303- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
308+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
309+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
304310; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
305311; CHECK: for.end:
306312; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -333,7 +339,8 @@ define void @test_guard_in_the_same_bb(ptr %base, i32 %limit, i32 %start) {
333339; CHECK-LABEL: @test_guard_in_the_same_bb(
334340; CHECK-NEXT: for.body.lr.ph:
335341; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
336- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
342+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
343+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
337344; CHECK-NEXT: br label [[FOR_BODY:%.*]]
338345; CHECK: for.body:
339346; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -342,7 +349,8 @@ define void @test_guard_in_the_same_bb(ptr %base, i32 %limit, i32 %start) {
342349; CHECK: for.inc:
343350; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS]]) [ "deopt"() ]
344351; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
345- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
352+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
353+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
346354; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
347355; CHECK: for.end:
348356; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -378,7 +386,8 @@ define void @test_guard_in_idom(ptr %base, i32 %limit, i32 %start) {
378386; CHECK-LABEL: @test_guard_in_idom(
379387; CHECK-NEXT: for.body.lr.ph:
380388; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
381- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
389+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
390+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
382391; CHECK-NEXT: br label [[FOR_BODY:%.*]]
383392; CHECK: for.body:
384393; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -387,7 +396,8 @@ define void @test_guard_in_idom(ptr %base, i32 %limit, i32 %start) {
387396; CHECK-NEXT: br label [[FOR_INC]]
388397; CHECK: for.inc:
389398; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
390- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
399+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
400+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
391401; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
392402; CHECK: for.end:
393403; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -423,7 +433,8 @@ define void @test_guard_merge_ranges(ptr %base, i32 %limit, i32 %start) {
423433; CHECK-LABEL: @test_guard_merge_ranges(
424434; CHECK-NEXT: for.body.lr.ph:
425435; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
426- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
436+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
437+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
427438; CHECK-NEXT: br label [[FOR_BODY:%.*]]
428439; CHECK: for.body:
429440; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -432,7 +443,8 @@ define void @test_guard_merge_ranges(ptr %base, i32 %limit, i32 %start) {
432443; CHECK-NEXT: [[WITHIN_LIMITS_2:%.*]] = icmp ult i64 [[INDVARS_IV]], 2147483647
433444; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS_2]]) [ "deopt"() ]
434445; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
435- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
446+ ; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
447+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
436448; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
437449; CHECK: for.end:
438450; CHECK-NEXT: br label [[EXIT:%.*]]
0 commit comments