27 changes: 27 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/shift-recurrences.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ define void @test_lshr() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -34,6 +35,7 @@ define void @test_lshr2() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -57,6 +59,7 @@ define void @test_ashr_zeros() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_zeros
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -79,6 +82,7 @@ define void @test_ashr_ones() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_ones
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -102,6 +106,7 @@ define void @test_ashr_ones2() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_ones2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -126,6 +131,7 @@ define void @test_ashr_unknown(i64 %start) {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_unknown
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -150,6 +156,7 @@ define void @test_ashr_wrong_op(i64 %start) {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_wrong_op
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -173,6 +180,7 @@ define void @test_shl() {
; CHECK-NEXT: Determining loop execution counts for: @test_shl
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down Expand Up @@ -200,6 +208,7 @@ define void @test_shl2() {
; CHECK-NEXT: Determining loop execution counts for: @test_shl2
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -234,6 +243,7 @@ define void @test_shl3(i1 %c) {
; CHECK-NEXT: Determining loop execution counts for: @test_shl3
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -267,6 +277,7 @@ define void @test_shl4() {
; CHECK-NEXT: Determining loop execution counts for: @test_shl4
; CHECK-NEXT: Loop %loop: backedge-taken count is 60
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 60
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 60
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 60
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 61
Expand Down Expand Up @@ -299,6 +310,7 @@ define void @test_shl5() {
; CHECK-NEXT: Determining loop execution counts for: @test_shl5
; CHECK-NEXT: Loop %loop: backedge-taken count is 61
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 61
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 61
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 61
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 62
Expand Down Expand Up @@ -333,6 +345,7 @@ define void @test_shl6(i1 %c) {
; CHECK-NEXT: Determining loop execution counts for: @test_shl6
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -366,6 +379,7 @@ define void @test_shl7(i1 %c, i64 %shiftamt) {
; CHECK-NEXT: Determining loop execution counts for: @test_shl7
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -419,6 +433,7 @@ define void @unreachable_binop() {
; CHECK-NEXT: Determining loop execution counts for: @unreachable_binop
; CHECK-NEXT: Loop %header: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %header: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %header: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %header: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down Expand Up @@ -476,6 +491,7 @@ define void @nonloop_recurrence_2() {
; CHECK-NEXT: Determining loop execution counts for: @nonloop_recurrence_2
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
bb:
Expand Down Expand Up @@ -510,6 +526,7 @@ define void @test_ashr_tc_positive() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_positive
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -541,6 +558,7 @@ define void @test_ashr_tc_negative() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_negative
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -574,6 +592,7 @@ define void @test_ashr_tc_either(i1 %a) {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_either
; CHECK-NEXT: Loop %loop: backedge-taken count is 60
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 60
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 60
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 60
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 61
Expand Down Expand Up @@ -606,6 +625,7 @@ define void @test_ashr_zero_shift() {
; CHECK-NEXT: Determining loop execution counts for: @test_ashr_zero_shift
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -637,6 +657,7 @@ define void @test_lshr_tc_positive() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_positive
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -668,6 +689,7 @@ define void @test_lshr_tc_negative() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_negative
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -701,6 +723,7 @@ define void @test_lshr_tc_either(i1 %a) {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_either
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -733,6 +756,7 @@ define void @test_lshr_zero_shift() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_zero_shift
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -765,6 +789,7 @@ define void @test_lshr_power_of_2_start() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_power_of_2_start
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -797,6 +822,7 @@ define void @test_lshr_arbitrary_start() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_arbitrary_start
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down Expand Up @@ -828,6 +854,7 @@ define void @test_lshr_start_power_of_2_plus_one() {
; CHECK-NEXT: Determining loop execution counts for: @test_lshr_start_power_of_2_plus_one
; CHECK-NEXT: Loop %loop: backedge-taken count is 4
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 5
Expand Down
23 changes: 15 additions & 8 deletions llvm/test/Analysis/ScalarEvolution/smin-smax-folds.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
; Test case from PR1614.
define i32 @test_PR1614(i32 %a, i32 %b, i32 %c) {
; CHECK-LABEL: 'test_PR1614'
; CHECK: --> (%a smax %b)
; CHECK: --> (%a smax %b smax %c)
; CHECK-NOT: smax
; CHECK-NEXT: Classifying expressions for: @test_PR1614
; CHECK-NEXT: %B = select i1 %A, i32 %a, i32 %b
; CHECK-NEXT: --> (%a smax %b) U: full-set S: full-set
; CHECK-NEXT: %D = select i1 %C, i32 %B, i32 %c
; CHECK-NEXT: --> (%a smax %b smax %c) U: full-set S: full-set
; CHECK-NEXT: Determining loop execution counts for: @test_PR1614
;

%A = icmp sgt i32 %a, %b
%B = select i1 %A, i32 %a, i32 %b
Expand All @@ -31,6 +35,7 @@ define void @smin_simplify_with_guard(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @smin_simplify_with_guard
; CHECK-NEXT: Loop %for.body: backedge-taken count is %n
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 2147483647
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand Down Expand Up @@ -58,7 +63,6 @@ for.cond.cleanup:

define void @smin_to_smax(i32 %n) {
; FIXME: ((-1 * (0 smin %n)) + %n) is actually just (0 smax %n)

; CHECK-LABEL: 'smin_to_smax'
; CHECK-NEXT: Classifying expressions for: @smin_to_smax
; CHECK-NEXT: %i.011 = phi i32 [ %n, %for.body.lr.ph ], [ %dec, %for.body ]
Expand All @@ -68,6 +72,7 @@ define void @smin_to_smax(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @smin_to_smax
; CHECK-NEXT: Loop %for.body: backedge-taken count is ((-1 * (0 smin %n)) + %n)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 2147483647
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((-1 * (0 smin %n)) + %n)
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-1 * (0 smin %n)) + %n)
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -94,18 +99,20 @@ for.cond.cleanup:

; The information from the loop guard can be used to simplify the trip count expression.
define void @smax_simplify_with_guard(i32 %start, i32 %n) {
; CHECK-LABEL: 'smax_simplify_with_guard'
; CHECK-LABEL: 'smax_simplify_with_guard'
; CHECK-NEXT: Classifying expressions for: @smax_simplify_with_guard
; CHECK-NEXT: %k.0.i26 = phi i32 [ %start, %loop.ph ], [ %inc.i, %loop ]
; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: %n LoopDispositions: { %loop: Computable }
; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: %n LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %inc.i = add nsw i32 %k.0.i26, 1
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: (1 + %n) LoopDispositions: { %loop: Computable }
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: (1 + %n) LoopDispositions: { %loop: Computable }
; CHECK-NEXT: Determining loop execution counts for: @smax_simplify_with_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %start) + %n)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 * %start) + %n)
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %start) + %n)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 * %start) + %n)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
;
entry:
%guard = icmp sge i32 %n, %start
br i1 %guard, label %loop.ph, label %exit
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/solve-quadratic-i1.ll
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ define void @f0() {
; CHECK-NEXT: Determining loop execution counts for: @f0
; CHECK-NEXT: Loop %b1: backedge-taken count is 1
; CHECK-NEXT: Loop %b1: constant max backedge-taken count is 1
; CHECK-NEXT: Loop %b1: symbolic max backedge-taken count is 1
; CHECK-NEXT: Loop %b1: Predicated backedge-taken count is 1
; CHECK-NEXT: Predicates:
; CHECK: Loop %b1: Trip multiple is 2
Expand Down Expand Up @@ -65,9 +66,11 @@ define void @f1() #0 {
; CHECK-NEXT: Determining loop execution counts for: @f1
; CHECK-NEXT: Loop %b3: <multiple exits> Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %b3: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %b3: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %b3: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %b1: backedge-taken count is 2
; CHECK-NEXT: Loop %b1: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %b1: symbolic max backedge-taken count is 2
; CHECK-NEXT: Loop %b1: Predicated backedge-taken count is 2
; CHECK-NEXT: Predicates:
; CHECK: Loop %b1: Trip multiple is 3
Expand Down
46 changes: 23 additions & 23 deletions llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
; RUN: opt -disable-output "-passes=print<scalar-evolution>" -S < %s 2>&1 | FileCheck %s

; The exit value from this loop was originally calculated as 0.
; The actual exit condition is 256*256 == 0 (in i16).

; CHECK: Printing analysis 'Scalar Evolution Analysis' for function 'f0':
; CHECK-NEXT: Classifying expressions for: @f0
; CHECK-NEXT: %v1 = phi i16 [ 0, %b0 ], [ %v2, %b1 ]
; CHECK-NEXT: --> {0,+,-1}<%b1> U: [-255,1) S: [-255,1) Exits: -255 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v2 = add i16 %v1, -1
; CHECK-NEXT: --> {-1,+,-1}<%b1> U: [-256,0) S: [-256,0) Exits: -256 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v3 = mul i16 %v2, %v2
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set Exits: 0 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v5 = phi i16 [ %v2, %b1 ]
; CHECK-NEXT: --> {-1,+,-1}<%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
; CHECK-NEXT: %v6 = phi i16 [ %v3, %b1 ]
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set --> 0 U: [0,1) S: [0,1)
; CHECK-NEXT: %v7 = sext i16 %v5 to i32
; CHECK-NEXT: --> {-1,+,-1}<nsw><%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
; CHECK-NEXT: Determining loop execution counts for: @f0
; CHECK-NEXT: Loop %b1: backedge-taken count is 255
; CHECK-NEXT: Loop %b1: constant max backedge-taken count is 255
; CHECK-NEXT: Loop %b1: Predicated backedge-taken count is 255
; CHECK-NEXT: Predicates:
; CHECK-EMPTY:
; CHECK-NEXT: Loop %b1: Trip multiple is 256


@g0 = global i32 0, align 4
@g1 = global i16 0, align 2

define signext i32 @f0() {
; CHECK-LABEL: 'f0'
; CHECK-NEXT: Classifying expressions for: @f0
; CHECK-NEXT: %v1 = phi i16 [ 0, %b0 ], [ %v2, %b1 ]
; CHECK-NEXT: --> {0,+,-1}<%b1> U: [-255,1) S: [-255,1) Exits: -255 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v2 = add i16 %v1, -1
; CHECK-NEXT: --> {-1,+,-1}<%b1> U: [-256,0) S: [-256,0) Exits: -256 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v3 = mul i16 %v2, %v2
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set Exits: 0 LoopDispositions: { %b1: Computable }
; CHECK-NEXT: %v5 = phi i16 [ %v2, %b1 ]
; CHECK-NEXT: --> {-1,+,-1}<%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
; CHECK-NEXT: %v6 = phi i16 [ %v3, %b1 ]
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set --> 0 U: [0,1) S: [0,1)
; CHECK-NEXT: %v7 = sext i16 %v5 to i32
; CHECK-NEXT: --> {-1,+,-1}<nsw><%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
; CHECK-NEXT: Determining loop execution counts for: @f0
; CHECK-NEXT: Loop %b1: backedge-taken count is 255
; CHECK-NEXT: Loop %b1: constant max backedge-taken count is 255
; CHECK-NEXT: Loop %b1: symbolic max backedge-taken count is 255
; CHECK-NEXT: Loop %b1: Predicated backedge-taken count is 255
; CHECK-NEXT: Predicates:
; CHECK: Loop %b1: Trip multiple is 256
;
b0:
br label %b1

Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/srem.ll
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ define dso_local void @_Z4loopi(i32 %width) local_unnamed_addr #0 {
; CHECK-NEXT: Determining loop execution counts for: @_Z4loopi
; CHECK-NEXT: Loop %for.cond: backedge-taken count is %width
; CHECK-NEXT: Loop %for.cond: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %for.cond: symbolic max backedge-taken count is %width
; CHECK-NEXT: Loop %for.cond: Predicated backedge-taken count is %width
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.cond: Trip multiple is 1
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count-andor-selectform.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ define void @unsimplified_and1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and1
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -32,6 +33,7 @@ define void @unsimplified_and2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and2
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -55,6 +57,7 @@ define void @unsimplified_and3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and3
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -78,6 +81,7 @@ define void @unsimplified_and4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and4
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -101,6 +105,7 @@ define void @unsimplified_or1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or1
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -122,6 +127,7 @@ define void @unsimplified_or2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -143,6 +149,7 @@ define void @unsimplified_or3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or3
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -166,6 +173,7 @@ define void @unsimplified_or4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or4
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -189,6 +197,7 @@ define void @reversed_and1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and1
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -212,6 +221,7 @@ define void @reversed_and2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and2
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -235,6 +245,7 @@ define void @reversed_and3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and3
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -256,6 +267,7 @@ define void @reversed_and4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and4
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -277,6 +289,7 @@ define void @reversed_or1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or1
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -300,6 +313,7 @@ define void @reversed_or2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or2
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -323,6 +337,7 @@ define void @reversed_or3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or3
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -346,6 +361,7 @@ define void @reversed_or4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or4
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count-andor.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ define void @unsimplified_and1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and1
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -32,6 +33,7 @@ define void @unsimplified_and2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and2
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -55,6 +57,7 @@ define void @unsimplified_and3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and3
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -78,6 +81,7 @@ define void @unsimplified_and4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_and4
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -101,6 +105,7 @@ define void @unsimplified_or1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or1
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -122,6 +127,7 @@ define void @unsimplified_or2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -143,6 +149,7 @@ define void @unsimplified_or3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or3
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -166,6 +173,7 @@ define void @unsimplified_or4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @unsimplified_or4
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -189,6 +197,7 @@ define void @reversed_and1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and1
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -212,6 +221,7 @@ define void @reversed_and2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and2
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -235,6 +245,7 @@ define void @reversed_and3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and3
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -256,6 +267,7 @@ define void @reversed_and4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_and4
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -277,6 +289,7 @@ define void @reversed_or1(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or1
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -300,6 +313,7 @@ define void @reversed_or2(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or2
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -323,6 +337,7 @@ define void @reversed_or3(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or3
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -346,6 +361,7 @@ define void @reversed_or4(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @reversed_or4
; CHECK-NEXT: Loop %loop: backedge-taken count is %n
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down
18 changes: 18 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count-implied-addrec.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ define void @nw_implies_nuw(i16 %n) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @nw_implies_nuw
; CHECK-NEXT: Loop %for.body: backedge-taken count is %n
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is %n
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is %n
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -37,6 +38,7 @@ define void @neg_nw_nuw(i16 %n) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @neg_nw_nuw
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -58,6 +60,7 @@ define void @nw_implies_nsw(i16 %n) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @nw_implies_nsw
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (128 + (-128 smax %n))
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {-128,+,1}<%for.body> Added Flags: <nssw>
Expand All @@ -81,6 +84,7 @@ define void @neg_nw_nsw(i16 %n) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @neg_nw_nsw
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -103,6 +107,7 @@ define void @actually_infinite() {
; CHECK-NEXT: Determining loop execution counts for: @actually_infinite
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is 257
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nusw>
Expand All @@ -127,6 +132,7 @@ define void @rhs_mustexit_1(i16 %n.raw) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @rhs_mustexit_1
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + (1 umax (-1 + (zext i8 (trunc i16 %n.raw to i8) to i16))<nsw>))
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {1,+,1}<nw><%for.body> Added Flags: <nusw>
Expand All @@ -153,6 +159,7 @@ define void @rhs_mustexit_3(i16 %n.raw) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @rhs_mustexit_3
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -178,6 +185,7 @@ define void @rhs_mustexit_nonzero_step(i16 %n.raw, i8 %step.raw) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @rhs_mustexit_nonzero_step
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -203,6 +211,7 @@ define void @neg_maybe_zero_step(i16 %n.raw, i8 %step) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @neg_maybe_zero_step
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -227,6 +236,7 @@ define void @neg_rhs_wrong_range(i16 %n.raw) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @neg_rhs_wrong_range
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((-1 + (2 umax (-1 + (zext i8 (trunc i16 %n.raw to i8) to i16))<nsw>)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {2,+,2}<nw><%for.body> Added Flags: <nusw>
Expand All @@ -253,6 +263,7 @@ define void @neg_rhs_maybe_infinite(i16 %n.raw) {
; CHECK-NEXT: Determining loop execution counts for: @neg_rhs_maybe_infinite
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + (1 umax (-1 + (zext i8 (trunc i16 %n.raw to i8) to i16))<nsw>))
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {1,+,1}<%for.body> Added Flags: <nusw>
Expand Down Expand Up @@ -281,6 +292,7 @@ define void @rhs_narrow_range(i16 %n.raw) {
; CHECK-NEXT: Determining loop execution counts for: @rhs_narrow_range
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (1 umax (2 * (zext i7 (trunc i16 (%n.raw /u 2) to i7) to i16))<nuw><nsw>))<nsw>
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 253
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (1 umax (2 * (zext i7 (trunc i16 (%n.raw /u 2) to i7) to i16))<nuw><nsw>))<nsw>
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + (1 umax (2 * (zext i7 (trunc i16 (%n.raw /u 2) to i7) to i16))<nuw><nsw>))<nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -307,6 +319,7 @@ define void @ugt_constant_rhs(i16 %n.raw, i8 %start) mustprogress {
; CHECK-NEXT: Determining loop execution counts for: @ugt_constant_rhs
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -329,6 +342,7 @@ define void @ult_constant_rhs(i16 %n.raw, i8 %start) {
; CHECK-NEXT: Determining loop execution counts for: @ult_constant_rhs
; CHECK-NEXT: Loop %for.body: backedge-taken count is (255 + (-1 * (zext i8 (1 + %start) to i16))<nsw>)<nsw>
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 255
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (255 + (-1 * (zext i8 (1 + %start) to i16))<nsw>)<nsw>
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (255 + (-1 * (zext i8 (1 + %start) to i16))<nsw>)<nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -353,6 +367,7 @@ define void @ult_constant_rhs_stride2(i16 %n.raw, i8 %start) {
; CHECK-NEXT: Determining loop execution counts for: @ult_constant_rhs_stride2
; CHECK-NEXT: Loop %for.body: backedge-taken count is ((1 + (-1 * (zext i8 (2 + %start) to i16))<nsw> + (254 umax (zext i8 (2 + %start) to i16))) /u 2)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 127
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((1 + (-1 * (zext i8 (2 + %start) to i16))<nsw> + (254 umax (zext i8 (2 + %start) to i16))) /u 2)
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((1 + (-1 * (zext i8 (2 + %start) to i16))<nsw> + (254 umax (zext i8 (2 + %start) to i16))) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -377,6 +392,7 @@ define void @ult_constant_rhs_stride2_neg(i16 %n.raw, i8 %start) {
; CHECK-NEXT: Determining loop execution counts for: @ult_constant_rhs_stride2_neg
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is ((256 + (-1 * (zext i8 (2 + %start) to i16))<nsw>)<nsw> /u 2)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: {(2 + %start),+,2}<%for.body> Added Flags: <nusw>
Expand All @@ -401,6 +417,7 @@ define void @ult_restricted_rhs(i16 %n.raw) {
; CHECK-NEXT: Determining loop execution counts for: @ult_restricted_rhs
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (1 umax (zext i8 (trunc i16 %n.raw to i8) to i16)))<nsw>
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 254
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (1 umax (zext i8 (trunc i16 %n.raw to i8) to i16)))<nsw>
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + (1 umax (zext i8 (trunc i16 %n.raw to i8) to i16)))<nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand All @@ -425,6 +442,7 @@ define void @ult_guarded_rhs(i16 %n) {;
; CHECK-NEXT: Determining loop execution counts for: @ult_guarded_rhs
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (1 umax %n))
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -2
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (1 umax %n))
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + (1 umax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand Down
30 changes: 30 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count-negative-stride.ll

Large diffs are not rendered by default.

24 changes: 18 additions & 6 deletions llvm/test/Analysis/ScalarEvolution/trip-count-non-unit-stride.ll
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ define void @test_preinc_ult(i64 %len) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down Expand Up @@ -49,7 +51,9 @@ define void @test_postinc_ult(i64 %len) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down Expand Up @@ -81,7 +85,9 @@ define void @test_preinc_slt(i64 %len) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down Expand Up @@ -114,7 +120,9 @@ define void @test_postinc_slt(i64 %len) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down Expand Up @@ -146,7 +154,9 @@ define void @test_preinc_sgt(i64 %lim) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down Expand Up @@ -179,7 +189,9 @@ define void @test_postinc_sgt(i64 %lim) {
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. symbolic max exit count for loop: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***
; CHECK: Loop %loop: Unpredictable predicated backedge-taken count.
;
start:
br label %loop
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ define void @PR1101(i32 %N) {
; CHECK-NEXT: Determining loop execution counts for: @PR1101
; CHECK-NEXT: Loop %bb3: backedge-taken count is 10000
; CHECK-NEXT: Loop %bb3: constant max backedge-taken count is 10000
; CHECK-NEXT: Loop %bb3: symbolic max backedge-taken count is 10000
; CHECK-NEXT: Loop %bb3: Predicated backedge-taken count is 10000
; CHECK-NEXT: Predicates:
; CHECK: Loop %bb3: Trip multiple is 10001
Expand Down Expand Up @@ -41,6 +42,7 @@ define i32 @PR22795() {
; CHECK-NEXT: Determining loop execution counts for: @PR22795
; CHECK-NEXT: Loop %preheader: backedge-taken count is 7
; CHECK-NEXT: Loop %preheader: constant max backedge-taken count is 7
; CHECK-NEXT: Loop %preheader: symbolic max backedge-taken count is 7
; CHECK-NEXT: Loop %preheader: Predicated backedge-taken count is 7
; CHECK-NEXT: Predicates:
; CHECK: Loop %preheader: Trip multiple is 8
Expand Down Expand Up @@ -104,6 +106,7 @@ define void @pr28012(i32 %n) {
; CHECK-NEXT: Determining loop execution counts for: @pr28012
; CHECK-NEXT: Loop %loop: backedge-taken count is -1431655751
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1431655751
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is -1431655751
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is -1431655751
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 2863311546
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count10.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ define void @a(i64 %n) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @a
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -28,6 +29,7 @@ define void @b(i64 %n) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @b
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -50,6 +52,7 @@ define void @c(i64 %n) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @c
; CHECK-NEXT: Loop %loop: backedge-taken count is false
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is false
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is false
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is false
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -72,6 +75,7 @@ define void @d(i64 %n) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @d
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down Expand Up @@ -100,6 +104,7 @@ define void @nonpolynomial() {
; CHECK-NEXT: Determining loop execution counts for: @nonpolynomial
; CHECK-NEXT: Loop %loophead: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loophead: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loophead: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loophead: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down Expand Up @@ -128,6 +133,7 @@ define void @constant_phi_operands() nounwind {
; CHECK-NEXT: Determining loop execution counts for: @constant_phi_operands
; CHECK-NEXT: Loop %loop: backedge-taken count is 1
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 1
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 1
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 2
Expand All @@ -153,6 +159,7 @@ define void @exit_orcond_nsw(i32 *%a) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @exit_orcond_nsw
; CHECK-NEXT: Loop %for.body.i: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %for.body.i: constant max backedge-taken count is 1
; CHECK-NEXT: Loop %for.body.i: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %for.body.i: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down
14 changes: 12 additions & 2 deletions llvm/test/Analysis/ScalarEvolution/trip-count14.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ define void @s32_max1(i32 %n, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @s32_max1
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((1 + %n) smax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 1, actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((1 + %n) smax %n)), actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((1 + %n) smax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand All @@ -31,6 +32,7 @@ define void @s32_max2(i32 %n, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @s32_max2
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((2 + %n) smax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 2, actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((2 + %n) smax %n)), actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((2 + %n) smax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand All @@ -56,6 +58,7 @@ define void @s32_maxx(i32 %n, i32 %x, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @s32_maxx
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((%n + %x) smax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((%n + %x) smax %n))
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((%n + %x) smax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand Down Expand Up @@ -83,7 +86,9 @@ define void @s32_max2_unpredictable_exit(i32 %n, i32 %x, i32* %p) {
; CHECK-NEXT: exit count for do.body: ((-1 * %n) + %x)
; CHECK-NEXT: exit count for if.end: ((-1 * %n) + ((2 + %n) smax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is (((-1 * %n) + ((2 + %n) smax %n)) umin ((-1 * %n) + %x))
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is (((-1 * %n) + ((2 + %n) smax %n)) umin ((-1 * %n) + %x)) symbolic max exit count for do.body: ((-1 * %n) + %x)
; CHECK-NEXT: symbolic max exit count for if.end: ((-1 * %n) + ((2 + %n) smax %n))
; CHECK: Loop %do.body: Predicated backedge-taken count is (((-1 * %n) + ((2 + %n) smax %n)) umin ((-1 * %n) + %x))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
;
Expand Down Expand Up @@ -112,6 +117,7 @@ define void @u32_max1(i32 %n, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @u32_max1
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((1 + %n) umax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 1, actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((1 + %n) umax %n)), actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((1 + %n) umax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand All @@ -137,6 +143,7 @@ define void @u32_max2(i32 %n, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @u32_max2
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((2 + %n) umax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 2, actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((2 + %n) umax %n)), actual taken count either this or zero.
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((2 + %n) umax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand All @@ -162,6 +169,7 @@ define void @u32_maxx(i32 %n, i32 %x, i32* %p) {
; CHECK-NEXT: Determining loop execution counts for: @u32_maxx
; CHECK-NEXT: Loop %do.body: backedge-taken count is ((-1 * %n) + ((%n + %x) umax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is ((-1 * %n) + ((%n + %x) umax %n))
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is ((-1 * %n) + ((%n + %x) umax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
Expand Down Expand Up @@ -189,7 +197,9 @@ define void @u32_max2_unpredictable_exit(i32 %n, i32 %x, i32* %p) {
; CHECK-NEXT: exit count for do.body: ((-1 * %n) + %x)
; CHECK-NEXT: exit count for if.end: ((-1 * %n) + ((2 + %n) umax %n))
; CHECK-NEXT: Loop %do.body: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %do.body: Predicated backedge-taken count is (((-1 * %n) + ((2 + %n) umax %n)) umin ((-1 * %n) + %x))
; CHECK-NEXT: Loop %do.body: symbolic max backedge-taken count is (((-1 * %n) + ((2 + %n) umax %n)) umin ((-1 * %n) + %x)) symbolic max exit count for do.body: ((-1 * %n) + %x)
; CHECK-NEXT: symbolic max exit count for if.end: ((-1 * %n) + ((2 + %n) umax %n))
; CHECK: Loop %do.body: Predicated backedge-taken count is (((-1 * %n) + ((2 + %n) umax %n)) umin ((-1 * %n) + %x))
; CHECK-NEXT: Predicates:
; CHECK: Loop %do.body: Trip multiple is 1
;
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count15.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ define void @umin_unsigned_check(i64 %n) {
; CHECK-NEXT: Determining loop execution counts for: @umin_unsigned_check
; CHECK-NEXT: Loop %loop: backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4097
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -43,6 +44,7 @@ define void @umin_signed_check(i64 %n) {
; CHECK-NEXT: Determining loop execution counts for: @umin_signed_check
; CHECK-NEXT: Loop %loop: backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4097
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (1 + (4096 umin %n))<nuw><nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -73,6 +75,7 @@ define void @smin_signed_check(i64 %n) {
; CHECK-NEXT: Determining loop execution counts for: @smin_signed_check
; CHECK-NEXT: Loop %loop: backedge-taken count is (0 smax (1 + (4096 smin %n))<nsw>)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4097
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (0 smax (1 + (4096 smin %n))<nsw>)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (0 smax (1 + (4096 smin %n))<nsw>)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -103,6 +106,7 @@ define void @smin_unsigned_check(i64 %n) {
; CHECK-NEXT: Determining loop execution counts for: @smin_unsigned_check
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ define void @PR1101(i32 %N) {
; CHECK-NEXT: Determining loop execution counts for: @PR1101
; CHECK-NEXT: Loop %bb3: backedge-taken count is 4
; CHECK-NEXT: Loop %bb3: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %bb3: symbolic max backedge-taken count is 4
; CHECK-NEXT: Loop %bb3: Predicated backedge-taken count is 4
; CHECK-NEXT: Predicates:
; CHECK: Loop %bb3: Trip multiple is 5
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count3.ll
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ define void @sha_stream_bb3_2E_i(%struct.SHA_INFO* %sha_info, i8* %data1, i32, i
; CHECK-NEXT: Determining loop execution counts for: @sha_stream_bb3_2E_i
; CHECK-NEXT: Loop %bb3.i: backedge-taken count is ((63 + (-1 * (63 smin %0)) + %0) /u 64)
; CHECK-NEXT: Loop %bb3.i: constant max backedge-taken count is 33554431
; CHECK-NEXT: Loop %bb3.i: symbolic max backedge-taken count is ((63 + (-1 * (63 smin %0)) + %0) /u 64)
; CHECK-NEXT: Loop %bb3.i: Predicated backedge-taken count is ((63 + (-1 * (63 smin %0)) + %0) /u 64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %bb3.i: Trip multiple is 1
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count4.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ define void @another_count_down_signed(double* %d, i64 %n) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @another_count_down_signed
; CHECK-NEXT: Loop %loop: backedge-taken count is (-11 + %n)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-11 + %n)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-11 + %n)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down
4 changes: 3 additions & 1 deletion llvm/test/Analysis/ScalarEvolution/trip-count6.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ define i8 @f() {
; CHECK-NEXT: exit count for bb: ***COULDNOTCOMPUTE***
; CHECK-NEXT: exit count for bb2: 1
; CHECK-NEXT: Loop %bb: constant max backedge-taken count is 1
; CHECK-NEXT: Loop %bb: Unpredictable predicated backedge-taken count.
; CHECK-NEXT: Loop %bb: symbolic max backedge-taken count is 1 symbolic max exit count for bb: ***COULDNOTCOMPUTE***
; CHECK-NEXT: symbolic max exit count for bb2: 1
; CHECK: Loop %bb: Unpredictable predicated backedge-taken count.
;
entry:
tail call i32 @fegetround( ) ; <i32>:0 [#uses=1]
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count7.ll
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ define void @Doit_bb7_2E_i([9 x i32]* %x1, [15 x i32]* %c, [17 x i32]* %b, [9 x
; CHECK-NEXT: Determining loop execution counts for: @Doit_bb7_2E_i
; CHECK-NEXT: Loop %bb7.i: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %bb7.i: constant max backedge-taken count is 8
; CHECK-NEXT: Loop %bb7.i: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %bb7.i: Unpredictable predicated backedge-taken count.
;
newFuncRoot:
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count8.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ define i32 @foo(i32 %ecx) nounwind {
; CHECK-NEXT: Determining loop execution counts for: @foo
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %ecx)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -2
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %ecx)
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (-1 + %ecx)
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
Expand Down
24 changes: 24 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/trip-count9.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ define void @foo(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @foo
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %n)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 6
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %n)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + %n)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -35,6 +36,7 @@ define void @step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @step2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -54,6 +56,7 @@ define void @start1(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @start1
; CHECK-NEXT: Loop %loop: backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 5
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -75,6 +78,7 @@ define void @start1_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @start1_step2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -94,6 +98,7 @@ define void @startx(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @startx
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -115,6 +120,7 @@ define void @startx_step2(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @startx_step2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand All @@ -134,6 +140,7 @@ define void @nsw(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @nsw
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %n)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 6
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %n)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + %n)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -163,6 +170,7 @@ define void @nsw_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @nsw_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + %n) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + %n) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + %n) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -184,6 +192,7 @@ define void @nsw_start1(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @nsw_start1
; CHECK-NEXT: Loop %loop: backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 5
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-2 + (2 smax %n))<nsw>
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -205,6 +214,7 @@ define void @nsw_start1_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @nsw_start1_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + (3 smax %n))<nsw> /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + (3 smax %n))<nsw> /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2 + (3 smax %n))<nsw> /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -226,6 +236,7 @@ define void @nsw_startx(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @nsw_startx
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -247,6 +258,7 @@ define void @nsw_startx_step2(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @nsw_startx_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax %n)) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 7
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax %n)) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax %n)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -268,6 +280,7 @@ define void @even(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 5
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 2
Expand All @@ -290,6 +303,7 @@ define void @even_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -312,6 +326,7 @@ define void @even_start1(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_start1
; CHECK-NEXT: Loop %loop: backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -334,6 +349,7 @@ define void @even_start1_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_start1_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -356,6 +372,7 @@ define void @even_startx(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @even_startx
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -378,6 +395,7 @@ define void @even_startx_step2(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @even_startx_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 7
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -400,6 +418,7 @@ define void @even_nsw(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 5
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (2 * %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 2
Expand All @@ -422,6 +441,7 @@ define void @even_nsw_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + (2 * %n)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -444,6 +464,7 @@ define void @even_nsw_start1(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw_start1
; CHECK-NEXT: Loop %loop: backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-2 + (2 * %n))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -466,6 +487,7 @@ define void @even_nsw_start1_step2(i4 %n) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw_start1_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2 + (2 * %n)) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -488,6 +510,7 @@ define void @even_nsw_startx(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw_startx
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -2
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand All @@ -510,6 +533,7 @@ define void @even_nsw_startx_step2(i4 %n, i4 %x) {
; CHECK-NEXT: Determining loop execution counts for: @even_nsw_startx_step2
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 7
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down
171 changes: 147 additions & 24 deletions llvm/test/Analysis/ScalarEvolution/trip-multiple-guard-info.ll

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/umin-umax-folds.ll
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ define void @umin_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @umin_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -52,6 +53,7 @@ define void @ule_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @ule_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -87,6 +89,7 @@ define void @uge_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @uge_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -122,6 +125,7 @@ define void @ult_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @ult_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -157,6 +161,7 @@ define void @ugt_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @ugt_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -192,6 +197,7 @@ define void @sle_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @sle_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -227,6 +233,7 @@ define void @sge_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @sge_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -262,6 +269,7 @@ define void @slt_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @slt_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down Expand Up @@ -297,6 +305,7 @@ define void @sgt_sext_x_zext_x(i32 %len) {
; CHECK-NEXT: Determining loop execution counts for: @sgt_sext_x_zext_x
; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 1
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/unknown_phis.ll
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ define void @merge_values_with_ranges_looped(i32 *%a_len_ptr, i32 *%b_len_ptr) {
; CHECK-NEXT: Determining loop execution counts for: @merge_values_with_ranges_looped
; CHECK-NEXT: Loop %loop: backedge-taken count is 99
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 99
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 99
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 99
; CHECK-NEXT: Predicates:
; CHECK: Loop %loop: Trip multiple is 100
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/ScalarEvolution/widenable-condition.ll
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ define i32 @wc_max() {
; CHECK-NEXT: Determining loop execution counts for: @wc_max
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 1999
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
;
entry:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
; CHECK: Determining loop execution counts for: @test
; CHECK-NEXT: Loop %inner: backedge-taken count is (405 + %invar)<nuw><nsw>
; CHECK-NEXT: Loop %inner: constant max backedge-taken count is 405
; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is (405 + %invar)<nuw><nsw>
; CHECK-NEXT: Loop %inner: Predicated backedge-taken count is (405 + %invar)<nuw><nsw>

define void @test_pr57837() {
Expand Down