Skip to content

Commit b0ccf0c

Browse files
committed
[SCEV] Preserve divisor info when adding guard info for ICMP_NE via Sub.
Follow-up to #160500 to preserve divisibiltiy info when creating the UMax.
1 parent abd178c commit b0ccf0c

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15836,8 +15836,9 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
1583615836
}
1583715837
auto AddSubRewrite = [&](const SCEV *A, const SCEV *B) {
1583815838
const SCEV *Sub = SE.getMinusSCEV(A, B);
15839-
AddRewrite(Sub, Sub,
15840-
SE.getUMaxExpr(Sub, SE.getOne(From->getType())));
15839+
const SCEV *OneAlignedUp = GetNextSCEVDividesByDivisor(
15840+
SE.getOne(From->getType()), SE.getConstantMultiple(Sub));
15841+
AddRewrite(Sub, Sub, SE.getUMaxExpr(Sub, OneAlignedUp));
1584115842
};
1584215843
AddSubRewrite(LHS, RHS);
1584315844
AddSubRewrite(RHS, LHS);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,7 +1431,7 @@ define void @ptr_induction_early_exit_eq_1_with_align_on_load(ptr %a, ptr %b, pt
14311431
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
14321432
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
14331433
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1434-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1434+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693950
14351435
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
14361436
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
14371437
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
@@ -1470,7 +1470,7 @@ define void @ptr_induction_early_exit_eq_1_with_align_on_arguments(ptr align 8 %
14701470
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
14711471
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
14721472
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1473-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1473+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693950
14741474
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
14751475
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
14761476
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
@@ -1511,7 +1511,7 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_1(ptr %a, ptr %b, pt
15111511
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
15121512
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
15131513
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1514-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1514+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693950
15151515
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
15161516
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
15171517
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
@@ -1556,7 +1556,7 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_2(ptr %a, ptr %b, pt
15561556
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
15571557
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
15581558
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1559-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1559+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693950
15601560
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
15611561
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
15621562
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)

0 commit comments

Comments
 (0)