Skip to content

Commit ad28dd5

Browse files
fhahnpuja2196
authored andcommitted
[SCEV] Add predicate in SolveLinEq to ensure B is a multiple of A. (#108777)
This can help in cases where pointer alignment info is missing, e.g. llvm/llvm-project#108210 The predicate is formed for the complex expression that's passed to SolveLinEquationWithOverflow and the checks could probably be pushed closer to the root nodes, which in some cases may be cheaper to check. PR: llvm/llvm-project#108777
1 parent 09e61db commit ad28dd5

File tree

7 files changed

+343
-125
lines changed

7 files changed

+343
-125
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10129,8 +10129,11 @@ const SCEV *ScalarEvolution::stripInjectiveFunctions(const SCEV *S) const {
1012910129
/// A and B isn't important.
1013010130
///
1013110131
/// If the equation does not have a solution, SCEVCouldNotCompute is returned.
10132-
static const SCEV *SolveLinEquationWithOverflow(const APInt &A, const SCEV *B,
10133-
ScalarEvolution &SE) {
10132+
static const SCEV *
10133+
SolveLinEquationWithOverflow(const APInt &A, const SCEV *B,
10134+
SmallPtrSetImpl<const SCEVPredicate *> *Predicates,
10135+
10136+
ScalarEvolution &SE) {
1013410137
uint32_t BW = A.getBitWidth();
1013510138
assert(BW == SE.getTypeSizeInBits(B->getType()));
1013610139
assert(A != 0 && "A must be non-zero.");
@@ -10146,8 +10149,22 @@ static const SCEV *SolveLinEquationWithOverflow(const APInt &A, const SCEV *B,
1014610149
//
1014710150
// B is divisible by D if and only if the multiplicity of prime factor 2 for B
1014810151
// is not less than multiplicity of this prime factor for D.
10149-
if (SE.getMinTrailingZeros(B) < Mult2)
10150-
return SE.getCouldNotCompute();
10152+
if (SE.getMinTrailingZeros(B) < Mult2) {
10153+
// Check if we can prove there's no remainder using URem.
10154+
const SCEV *URem =
10155+
SE.getURemExpr(B, SE.getConstant(APInt::getOneBitSet(BW, Mult2)));
10156+
const SCEV *Zero = SE.getZero(B->getType());
10157+
if (!SE.isKnownPredicate(CmpInst::ICMP_EQ, URem, Zero)) {
10158+
// Try to add a predicate ensuring B is a multiple of 1 << Mult2.
10159+
if (!Predicates)
10160+
return SE.getCouldNotCompute();
10161+
10162+
// Avoid adding a predicate that is known to be false.
10163+
if (SE.isKnownPredicate(CmpInst::ICMP_NE, URem, Zero))
10164+
return SE.getCouldNotCompute();
10165+
Predicates->insert(SE.getEqualPredicate(URem, Zero));
10166+
}
10167+
}
1015110168

1015210169
// 3. Compute I: the multiplicative inverse of (A / D) in arithmetic
1015310170
// modulo (N / D).
@@ -10577,8 +10594,9 @@ ScalarEvolution::ExitLimit ScalarEvolution::howFarToZero(const SCEV *V,
1057710594
// Solve the general equation.
1057810595
if (!StepC || StepC->getValue()->isZero())
1057910596
return getCouldNotCompute();
10580-
const SCEV *E = SolveLinEquationWithOverflow(StepC->getAPInt(),
10581-
getNegativeSCEV(Start), *this);
10597+
const SCEV *E = SolveLinEquationWithOverflow(
10598+
StepC->getAPInt(), getNegativeSCEV(Start),
10599+
AllowPredicates ? &Predicates : nullptr, *this);
1058210600

1058310601
const SCEV *M = E;
1058410602
if (E != getCouldNotCompute()) {

llvm/test/Analysis/ScalarEvolution/ne-overflow.ll

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ define void @test_well_defined_infinite_st(i32 %N) mustprogress {
5858
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
5959
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
6060
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
61+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-2 + %N) /u 2)
62+
; CHECK-NEXT: Predicates:
63+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
64+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i32 2147483647
65+
; CHECK-NEXT: Predicates:
66+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
67+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-2 + %N) /u 2)
68+
; CHECK-NEXT: Predicates:
69+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
6170
;
6271
entry:
6372
br label %for.body
@@ -79,6 +88,15 @@ define void @test_well_defined_infinite_ld(i32 %N) mustprogress {
7988
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
8089
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
8190
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
91+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-2 + %N) /u 2)
92+
; CHECK-NEXT: Predicates:
93+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
94+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i32 2147483647
95+
; CHECK-NEXT: Predicates:
96+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
97+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-2 + %N) /u 2)
98+
; CHECK-NEXT: Predicates:
99+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
82100
;
83101
entry:
84102
br label %for.body
@@ -100,6 +118,15 @@ define void @test_no_mustprogress(i32 %N) {
100118
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
101119
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
102120
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
121+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-2 + %N) /u 2)
122+
; CHECK-NEXT: Predicates:
123+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
124+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i32 2147483647
125+
; CHECK-NEXT: Predicates:
126+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
127+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-2 + %N) /u 2)
128+
; CHECK-NEXT: Predicates:
129+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
103130
;
104131
entry:
105132
br label %for.body
@@ -187,6 +214,15 @@ define void @test_abnormal_exit(i32 %N) mustprogress {
187214
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
188215
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
189216
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
217+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-2 + %N) /u 2)
218+
; CHECK-NEXT: Predicates:
219+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
220+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i32 2147483647
221+
; CHECK-NEXT: Predicates:
222+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
223+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-2 + %N) /u 2)
224+
; CHECK-NEXT: Predicates:
225+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
190226
;
191227
entry:
192228
br label %for.body
@@ -209,10 +245,24 @@ define void @test_other_exit(i32 %N) mustprogress {
209245
; CHECK-NEXT: Loop %for.body: <multiple exits> Unpredictable backedge-taken count.
210246
; CHECK-NEXT: exit count for for.body: i32 9
211247
; CHECK-NEXT: exit count for for.latch: ***COULDNOTCOMPUTE***
248+
; CHECK-NEXT: predicated exit count for for.latch: ((-2 + %N) /u 2)
249+
; CHECK-NEXT: Predicates:
250+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
251+
; CHECK-EMPTY:
212252
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 9
213253
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 9
214254
; CHECK-NEXT: symbolic max exit count for for.body: i32 9
215255
; CHECK-NEXT: symbolic max exit count for for.latch: ***COULDNOTCOMPUTE***
256+
; CHECK-NEXT: predicated symbolic max exit count for for.latch: ((-2 + %N) /u 2)
257+
; CHECK-NEXT: Predicates:
258+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
259+
; CHECK-EMPTY:
260+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (9 umin ((-2 + %N) /u 2))
261+
; CHECK-NEXT: Predicates:
262+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
263+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (9 umin ((-2 + %N) /u 2))
264+
; CHECK-NEXT: Predicates:
265+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i32 %N to i1) to i32) == 0
216266
;
217267
entry:
218268
br label %for.body
@@ -267,6 +317,18 @@ define void @test_sext(i64 %N) mustprogress {
267317
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
268318
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
269319
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
320+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (%N /u 2)
321+
; CHECK-NEXT: Predicates:
322+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
323+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
324+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 9223372036854775807
325+
; CHECK-NEXT: Predicates:
326+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
327+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
328+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (%N /u 2)
329+
; CHECK-NEXT: Predicates:
330+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
331+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
270332
;
271333
entry:
272334
br label %for.body
@@ -288,6 +350,21 @@ define void @test_zext_of_sext(i64 %N) mustprogress {
288350
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
289351
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
290352
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
353+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (%N /u 2)
354+
; CHECK-NEXT: Predicates:
355+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
356+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
357+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
358+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 9223372036854775807
359+
; CHECK-NEXT: Predicates:
360+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
361+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
362+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
363+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (%N /u 2)
364+
; CHECK-NEXT: Predicates:
365+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
366+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
367+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %N to i1) to i64) == 0
291368
;
292369
entry:
293370
br label %for.body
@@ -310,6 +387,18 @@ define void @test_zext_offset(i64 %N) mustprogress {
310387
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
311388
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
312389
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
390+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-21 + %N) /u 2)
391+
; CHECK-NEXT: Predicates:
392+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
393+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
394+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 9223372036854775807
395+
; CHECK-NEXT: Predicates:
396+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
397+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
398+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-21 + %N) /u 2)
399+
; CHECK-NEXT: Predicates:
400+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nusw>
401+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
313402
;
314403
entry:
315404
br label %for.body
@@ -332,6 +421,18 @@ define void @test_sext_offset(i64 %N) mustprogress {
332421
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
333422
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
334423
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
424+
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-21 + %N) /u 2)
425+
; CHECK-NEXT: Predicates:
426+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
427+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
428+
; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 9223372036854775807
429+
; CHECK-NEXT: Predicates:
430+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
431+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
432+
; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is ((-21 + %N) /u 2)
433+
; CHECK-NEXT: Predicates:
434+
; CHECK-NEXT: {0,+,2}<%for.body> Added Flags: <nssw>
435+
; CHECK-NEXT: Equal predicate: (zext i1 (true + (trunc i64 %N to i1)) to i64) == 0
335436
;
336437
entry:
337438
br label %for.body

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ define i32 @ptr_induction_ult(ptr %a, ptr %b) {
77
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
88
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
99
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
10+
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 4)
11+
; CHECK-NEXT: Predicates:
12+
; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0
13+
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903
14+
; CHECK-NEXT: Predicates:
15+
; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0
16+
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is (((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 4)
17+
; CHECK-NEXT: Predicates:
18+
; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0
1019
;
1120
entry:
1221
%cmp.6 = icmp ult ptr %a, %b
@@ -28,6 +37,15 @@ define i32 @ptr_induction_ult_3_step_6(ptr %a, ptr %b) {
2837
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
2938
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
3039
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
40+
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((3074457345618258603 * (ptrtoint ptr %b to i64)) + (-3074457345618258603 * (ptrtoint ptr %a to i64))) /u 2)
41+
; CHECK-NEXT: Predicates:
42+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0
43+
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 9223372036854775807
44+
; CHECK-NEXT: Predicates:
45+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0
46+
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is (((3074457345618258603 * (ptrtoint ptr %b to i64)) + (-3074457345618258603 * (ptrtoint ptr %a to i64))) /u 2)
47+
; CHECK-NEXT: Predicates:
48+
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0
3149
;
3250
entry:
3351
%cmp.6 = icmp ult ptr %a, %b
@@ -74,10 +92,24 @@ define void @ptr_induction_early_exit_eq_1(ptr %a, ptr %b, ptr %c) {
7492
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
7593
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
7694
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
95+
; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
96+
; CHECK-NEXT: Predicates:
97+
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0
98+
; CHECK-EMPTY:
7799
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
78100
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
79101
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
80102
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
103+
; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
104+
; CHECK-NEXT: Predicates:
105+
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0
106+
; CHECK-EMPTY:
107+
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951
108+
; CHECK-NEXT: Predicates:
109+
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0
110+
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
111+
; CHECK-NEXT: Predicates:
112+
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0
81113
;
82114
entry:
83115
%cmp = icmp eq ptr %a, %b

llvm/test/Analysis/ScalarEvolution/trip-count-urem.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ declare void @foo()
66
define void @test_trip_count_expr_contains_urem(i32 %N) {
77
; CHECK-LABEL: 'test_trip_count_expr_contains_urem'
88
; CHECK-NEXT: Determining loop execution counts for: @test_trip_count_expr_contains_urem
9-
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
10-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
11-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
9+
; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + (-1 * (zext i4 (1 + (trunc i32 %N to i4)) to i32))<nsw> + %N) /u 16)
10+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 268435455
11+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + (-1 * (zext i4 (1 + (trunc i32 %N to i4)) to i32))<nsw> + %N) /u 16)
12+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1213
;
1314
entry:
1415
%n.rnd.up = add i32 %N, 1

0 commit comments

Comments
 (0)