Skip to content

Commit c91471b

Browse files
committed
IVS: avoid regression; don't high-cost-expand ExitCount
1 parent f21ca35 commit c91471b

File tree

3 files changed

+22
-32
lines changed

3 files changed

+22
-32
lines changed

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1992,7 +1992,11 @@ bool IndVarSimplify::run(Loop *L) {
19921992

19931993
// Avoid high cost expansions. Note: This heuristic is questionable in
19941994
// that our definition of "high cost" is not exactly principled.
1995-
if (Rewriter.isHighCostExpansion(IVLimit, L, SCEVCheapExpansionBudget,
1995+
// FIXME: ExitCount is not the expression actually being expanded, but we
1996+
// check it against high-cost expansions anyway to avoid regressions.
1997+
if (Rewriter.isHighCostExpansion(ExitCount, L, SCEVCheapExpansionBudget,
1998+
TTI, ExitingBB->getTerminator()) ||
1999+
Rewriter.isHighCostExpansion(IVLimit, L, SCEVCheapExpansionBudget,
19962000
TTI, ExitingBB->getTerminator()))
19972001
continue;
19982002

llvm/test/Transforms/IndVarSimplify/X86/loop-invariant-conditions.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,11 @@ for.end: ; preds = %if.end, %entry
521521
define void @test3_neg(i64 %start) {
522522
; CHECK-LABEL: @test3_neg(
523523
; CHECK-NEXT: entry:
524-
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[START:%.*]], i64 -1)
525-
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[SMAX]], 1
526524
; CHECK-NEXT: br label [[LOOP:%.*]]
527525
; CHECK: loop:
528-
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
529-
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1
530-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[TMP0]]
526+
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
527+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
528+
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i64 [[INDVARS_IV]], -1
531529
; CHECK-NEXT: br i1 [[CMP1]], label [[LOOP]], label [[FOR_END:%.*]]
532530
; CHECK: for.end:
533531
; CHECK-NEXT: ret void

llvm/test/Transforms/IndVarSimplify/post-inc-range.ll

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ 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:%.*]] = add i32 [[START]], 1
119-
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
118+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
120119
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
121120
; CHECK: for.body:
122121
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -128,8 +127,7 @@ define void @test_range_metadata(ptr %array_length_ptr, ptr %base,
128127
; CHECK-NEXT: br label [[FOR_INC]]
129128
; CHECK: for.inc:
130129
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
131-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
132-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
130+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
133131
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]
134132
; CHECK: for.end:
135133
; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -223,11 +221,10 @@ define void @test_transitive_use(ptr %base, i32 %limit, i32 %start) {
223221
; CHECK-LABEL: @test_transitive_use(
224222
; CHECK-NEXT: for.body.lr.ph:
225223
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
226-
; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[LIMIT:%.*]] to i64
224+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
225+
; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[LIMIT]] to i64
227226
; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[START]], i32 64)
228227
; 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]])
231228
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
232229
; CHECK: for.body:
233230
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -239,14 +236,13 @@ define void @test_transitive_use(ptr %base, i32 %limit, i32 %start) {
239236
; CHECK-NEXT: br i1 [[MUL_WITHIN]], label [[GUARDED:%.*]], label [[CONTINUE_2:%.*]]
240237
; CHECK: guarded:
241238
; CHECK-NEXT: [[TMP4:%.*]] = add nuw nsw i64 [[TMP3]], 1
242-
; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i64 [[TMP4]], [[TMP2]]
239+
; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i64 [[TMP4]], [[TMP1]]
243240
; CHECK-NEXT: br i1 [[RESULT]], label [[CONTINUE_2]], label [[FOR_END]]
244241
; CHECK: continue.2:
245242
; CHECK-NEXT: br label [[FOR_INC]]
246243
; CHECK: for.inc:
247244
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
248-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
249-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
245+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP2]]
250246
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]
251247
; CHECK: for.end:
252248
; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -297,16 +293,14 @@ define void @test_guard_one_bb(ptr %base, i32 %limit, i32 %start) {
297293
; CHECK-LABEL: @test_guard_one_bb(
298294
; CHECK-NEXT: for.body.lr.ph:
299295
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
300-
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
301-
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
296+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
302297
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
303298
; CHECK: for.body:
304299
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
305300
; CHECK-NEXT: [[WITHIN_LIMITS:%.*]] = icmp ult i64 [[INDVARS_IV]], 64
306301
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS]]) [ "deopt"() ]
307302
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
308-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
309-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
303+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
310304
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
311305
; CHECK: for.end:
312306
; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -339,8 +333,7 @@ define void @test_guard_in_the_same_bb(ptr %base, i32 %limit, i32 %start) {
339333
; CHECK-LABEL: @test_guard_in_the_same_bb(
340334
; CHECK-NEXT: for.body.lr.ph:
341335
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
342-
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
343-
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
336+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
344337
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
345338
; CHECK: for.body:
346339
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -349,8 +342,7 @@ define void @test_guard_in_the_same_bb(ptr %base, i32 %limit, i32 %start) {
349342
; CHECK: for.inc:
350343
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS]]) [ "deopt"() ]
351344
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
352-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
353-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
345+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
354346
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
355347
; CHECK: for.end:
356348
; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -386,8 +378,7 @@ define void @test_guard_in_idom(ptr %base, i32 %limit, i32 %start) {
386378
; CHECK-LABEL: @test_guard_in_idom(
387379
; CHECK-NEXT: for.body.lr.ph:
388380
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
389-
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
390-
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
381+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
391382
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
392383
; CHECK: for.body:
393384
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -396,8 +387,7 @@ define void @test_guard_in_idom(ptr %base, i32 %limit, i32 %start) {
396387
; CHECK-NEXT: br label [[FOR_INC]]
397388
; CHECK: for.inc:
398389
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
399-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
400-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
390+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
401391
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
402392
; CHECK: for.end:
403393
; CHECK-NEXT: br label [[EXIT:%.*]]
@@ -433,8 +423,7 @@ define void @test_guard_merge_ranges(ptr %base, i32 %limit, i32 %start) {
433423
; CHECK-LABEL: @test_guard_merge_ranges(
434424
; CHECK-NEXT: for.body.lr.ph:
435425
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
436-
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[START]], 1
437-
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[LIMIT:%.*]], i32 [[TMP1]])
426+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[LIMIT:%.*]] to i64
438427
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
439428
; CHECK: for.body:
440429
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[TMP0]], [[FOR_BODY_LR_PH:%.*]] ]
@@ -443,8 +432,7 @@ define void @test_guard_merge_ranges(ptr %base, i32 %limit, i32 %start) {
443432
; CHECK-NEXT: [[WITHIN_LIMITS_2:%.*]] = icmp ult i64 [[INDVARS_IV]], 2147483647
444433
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_LIMITS_2]]) [ "deopt"() ]
445434
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
446-
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
447-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[SMAX]]
435+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT]], [[TMP1]]
448436
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
449437
; CHECK: for.end:
450438
; CHECK-NEXT: br label [[EXIT:%.*]]

0 commit comments

Comments
 (0)