Skip to content

Commit fb7c0d7

Browse files
authored
[SCEV] Rewrite some SCEVAdd sub-expressions using loop guards. (#156013)
Trip count expressions sometimes consist of adding 3 operands, i.e. (Const + A + B). There may be guard info for A + B, and if so, apply it. We can probably more generally apply this, but need to be careful w.r.t compile-time. Alive2 Proof for changes in miniters.ll: https://alive2.llvm.org/ce/z/HFfXOx Fixes #155941. PR: #156013
1 parent e34d2e1 commit fb7c0d7

File tree

4 files changed

+16
-8
lines changed

4 files changed

+16
-8
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16009,6 +16009,16 @@ const SCEV *ScalarEvolution::LoopGuards::rewrite(const SCEV *Expr) const {
1600916009
}
1601016010

1601116011
const SCEV *visitAddExpr(const SCEVAddExpr *Expr) {
16012+
// Trip count expressions sometimes consist of adding 3 operands, i.e.
16013+
// (Const + A + B). There may be guard info for A + B, and if so, apply
16014+
// it.
16015+
// TODO: Could more generally apply guards to Add sub-expressions.
16016+
if (isa<SCEVConstant>(Expr->getOperand(0)) &&
16017+
Expr->getNumOperands() == 3) {
16018+
if (const SCEV *S = Map.lookup(
16019+
SE.getAddExpr(Expr->getOperand(1), Expr->getOperand(2))))
16020+
return SE.getAddExpr(Expr->getOperand(0), S);
16021+
}
1601216022
SmallVector<const SCEV *, 2> Operands;
1601316023
bool Changed = false;
1601416024
for (const auto *Op : Expr->operands()) {

llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-apply-to-adds.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
define void @ptrtoint_based_trip_count_known_via_guards_applied_to_add_subexpr(ptr %start, ptr %end) {
55
; CHECK-LABEL: 'ptrtoint_based_trip_count_known_via_guards_applied_to_add_subexpr'
66
; CHECK-NEXT: Determining loop execution counts for: @ptrtoint_based_trip_count_known_via_guards_applied_to_add_subexpr
7-
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
8-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4611686018427387903
9-
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
7+
; CHECK-NEXT: Loop %loop: backedge-taken count is i64 0
8+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 0
9+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 0
1010
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1111
;
1212
entry:

llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info-apply-to-adds.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ define void @max_btc_improved_by_applying_guards_to_add_subexpr(i32 %low, i32 %h
55
; CHECK-LABEL: 'max_btc_improved_by_applying_guards_to_add_subexpr'
66
; CHECK-NEXT: Determining loop execution counts for: @max_btc_improved_by_applying_guards_to_add_subexpr
77
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (zext i32 (1 + (-1 * %low) + %high) to i64))<nsw>
8-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
8+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 7
99
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (zext i32 (1 + (-1 * %low) + %high) to i64))<nsw>
1010
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1111
;

llvm/test/Transforms/LoopVectorize/miniters.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ define void @min_iters_known_via_loop_guards_add(i32 %start, i32 %end, ptr %src)
6161
; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[SUB]], 1
6262
; CHECK-NEXT: [[IV_START:%.*]] = zext i32 [[ADD_1]] to i64
6363
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 101, [[IV_START]]
64-
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4
65-
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], [[SCALAR_PH:label %.*]], label %[[VECTOR_PH:.*]]
64+
; CHECK-NEXT: br i1 false, [[SCALAR_PH:label %.*]], label %[[VECTOR_PH:.*]]
6665
; CHECK: [[VECTOR_PH]]:
6766
;
6867
; UNROLL-LABEL: define void @min_iters_known_via_loop_guards_add(
@@ -74,8 +73,7 @@ define void @min_iters_known_via_loop_guards_add(i32 %start, i32 %end, ptr %src)
7473
; UNROLL-NEXT: [[ADD_1:%.*]] = add i32 [[SUB]], 1
7574
; UNROLL-NEXT: [[IV_START:%.*]] = zext i32 [[ADD_1]] to i64
7675
; UNROLL-NEXT: [[TMP0:%.*]] = sub i64 101, [[IV_START]]
77-
; UNROLL-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 8
78-
; UNROLL-NEXT: br i1 [[MIN_ITERS_CHECK]], [[SCALAR_PH:label %.*]], label %[[VECTOR_PH:.*]]
76+
; UNROLL-NEXT: br i1 false, [[SCALAR_PH:label %.*]], label %[[VECTOR_PH:.*]]
7977
; UNROLL: [[VECTOR_PH]]:
8078
;
8179
entry:

0 commit comments

Comments
 (0)