1e4da0f96SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2e4da0f96SMax Kazantsev; RUN: opt < %s -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s 3e4da0f96SMax Kazantsev 4e4da0f96SMax Kazantsevdeclare i1 @cond() 5e4da0f96SMax Kazantsev 6e4da0f96SMax Kazantsevdefine i32 @test_01(i32 %a, i32 %b) { 7e4da0f96SMax Kazantsev; CHECK-LABEL: 'test_01' 8e4da0f96SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_01 9e4da0f96SMax Kazantsev; CHECK-NEXT: %outer.iv = phi i32 [ 0, %entry ], [ %iv.next, %outer.backedge ] 10e4da0f96SMax Kazantsev; CHECK-NEXT: --> %outer.iv U: [0,-2147483647) S: [0,-2147483647) Exits: <<Unknown>> LoopDispositions: { %outer: Variant, %inner: Invariant } 11e4da0f96SMax Kazantsev; CHECK-NEXT: %iv = phi i32 [ 0, %outer ], [ %iv.next, %inner.backedge ] 12e4da0f96SMax Kazantsev; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%inner> U: [0,-2147483648) S: [0,-2147483648) Exits: <<Unknown>> LoopDispositions: { %inner: Computable, %outer: Variant } 13e4da0f96SMax Kazantsev; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, 1 14e4da0f96SMax Kazantsev; CHECK-NEXT: --> {1,+,1}<nuw><%inner> U: [1,-2147483647) S: [1,-2147483647) Exits: <<Unknown>> LoopDispositions: { %inner: Computable, %outer: Variant } 15e4da0f96SMax Kazantsev; CHECK-NEXT: %inner.loop.cond = call i1 @cond() 16e4da0f96SMax Kazantsev; CHECK-NEXT: --> %inner.loop.cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner: Variant, %outer: Variant } 17e4da0f96SMax Kazantsev; CHECK-NEXT: %outer.loop.cond = call i1 @cond() 18e4da0f96SMax Kazantsev; CHECK-NEXT: --> %outer.loop.cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer: Variant, %inner: Invariant } 19e4da0f96SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_01 20e4da0f96SMax Kazantsev; CHECK-NEXT: Loop %inner: <multiple exits> Unpredictable backedge-taken count. 21e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner: %b 22e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner.backedge: ***COULDNOTCOMPUTE*** 23*7755c261SPhilip Reames; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 2147483647 244496d553SMax Kazantsev; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is %b 254496d553SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner: %b 26e5fa7eb1SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner.backedge: ***COULDNOTCOMPUTE*** 27e4da0f96SMax Kazantsev; CHECK-NEXT: Loop %outer: <multiple exits> Unpredictable backedge-taken count. 28e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner: ***COULDNOTCOMPUTE*** 29e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for outer.backedge: ***COULDNOTCOMPUTE*** 30211d9411SMax Kazantsev; CHECK-NEXT: Loop %outer: Unpredictable constant max backedge-taken count. 314496d553SMax Kazantsev; CHECK-NEXT: Loop %outer: Unpredictable symbolic max backedge-taken count. 324496d553SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner: ***COULDNOTCOMPUTE*** 33e5fa7eb1SMax Kazantsev; CHECK-NEXT: symbolic max exit count for outer.backedge: ***COULDNOTCOMPUTE*** 34e4da0f96SMax Kazantsev; 35e4da0f96SMax Kazantseventry: 36e4da0f96SMax Kazantsev %b_is_non_negative = icmp sge i32 %b, 0 37e4da0f96SMax Kazantsev br i1 %b_is_non_negative, label %outer, label %failure 38e4da0f96SMax Kazantsev 39e4da0f96SMax Kazantsevouter: 40e4da0f96SMax Kazantsev %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge] 41e4da0f96SMax Kazantsev br label %inner 42e4da0f96SMax Kazantsev 43e4da0f96SMax Kazantsevinner: 44e4da0f96SMax Kazantsev %iv = phi i32 [0, %outer], [%iv.next, %inner.backedge] 45e4da0f96SMax Kazantsev %signed_cond = icmp slt i32 %iv, %b 46e4da0f96SMax Kazantsev br i1 %signed_cond, label %inner.backedge, label %side.exit 47e4da0f96SMax Kazantsev 48e4da0f96SMax Kazantsevinner.backedge: 49e4da0f96SMax Kazantsev %iv.next = add nuw nsw i32 %iv, 1 50e4da0f96SMax Kazantsev %inner.loop.cond = call i1 @cond() 51e4da0f96SMax Kazantsev br i1 %inner.loop.cond, label %inner, label %outer.backedge 52e4da0f96SMax Kazantsev 53e4da0f96SMax Kazantsevouter.backedge: 54e4da0f96SMax Kazantsev %outer.loop.cond = call i1 @cond() 55e4da0f96SMax Kazantsev br i1 %outer.loop.cond, label %outer, label %exit 56e4da0f96SMax Kazantsev 57e4da0f96SMax Kazantsevfailure: 58e4da0f96SMax Kazantsev unreachable 59e4da0f96SMax Kazantsev 60e4da0f96SMax Kazantsevside.exit: 61e4da0f96SMax Kazantsev ret i32 0 62e4da0f96SMax Kazantsev 63e4da0f96SMax Kazantsevexit: 64e4da0f96SMax Kazantsev ret i32 1 65e4da0f96SMax Kazantsev} 66e4da0f96SMax Kazantsev 67e4da0f96SMax Kazantsev; FIXME: both outer.iv and iv here can be proved non-negative. 68e4da0f96SMax Kazantsevdefine i32 @test_02(i32 %a, i32 %b) { 69e4da0f96SMax Kazantsev; CHECK-LABEL: 'test_02' 70e4da0f96SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_02 71e4da0f96SMax Kazantsev; CHECK-NEXT: %outer.iv = phi i32 [ 0, %entry ], [ %iv.next, %outer.backedge ] 72e4da0f96SMax Kazantsev; CHECK-NEXT: --> %outer.iv U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer: Variant, %inner: Invariant } 73e4da0f96SMax Kazantsev; CHECK-NEXT: %iv = phi i32 [ %outer.iv, %outer ], [ %iv.next, %inner.backedge ] 74e4da0f96SMax Kazantsev; CHECK-NEXT: --> {%outer.iv,+,1}<nuw><nsw><%inner> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner: Computable, %outer: Variant } 75e4da0f96SMax Kazantsev; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, 1 76e4da0f96SMax Kazantsev; CHECK-NEXT: --> {(1 + %outer.iv),+,1}<nw><%inner> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner: Computable, %outer: Variant } 77e4da0f96SMax Kazantsev; CHECK-NEXT: %inner.loop.cond = call i1 @cond() 78e4da0f96SMax Kazantsev; CHECK-NEXT: --> %inner.loop.cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %inner: Variant, %outer: Variant } 79e4da0f96SMax Kazantsev; CHECK-NEXT: %outer.loop.cond = call i1 @cond() 80e4da0f96SMax Kazantsev; CHECK-NEXT: --> %outer.loop.cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %outer: Variant, %inner: Invariant } 81e4da0f96SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_02 82e4da0f96SMax Kazantsev; CHECK-NEXT: Loop %inner: <multiple exits> Unpredictable backedge-taken count. 83e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner: ((-1 * %outer.iv) + (%b smax %outer.iv)) 84e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner.backedge: ***COULDNOTCOMPUTE*** 85*7755c261SPhilip Reames; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 -1 864496d553SMax Kazantsev; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is ((-1 * %outer.iv) + (%b smax %outer.iv)) 874496d553SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner: ((-1 * %outer.iv) + (%b smax %outer.iv)) 88e5fa7eb1SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner.backedge: ***COULDNOTCOMPUTE*** 89e4da0f96SMax Kazantsev; CHECK-NEXT: Loop %outer: <multiple exits> Unpredictable backedge-taken count. 90e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for inner: ***COULDNOTCOMPUTE*** 91e4da0f96SMax Kazantsev; CHECK-NEXT: exit count for outer.backedge: ***COULDNOTCOMPUTE*** 92211d9411SMax Kazantsev; CHECK-NEXT: Loop %outer: Unpredictable constant max backedge-taken count. 934496d553SMax Kazantsev; CHECK-NEXT: Loop %outer: Unpredictable symbolic max backedge-taken count. 944496d553SMax Kazantsev; CHECK-NEXT: symbolic max exit count for inner: ***COULDNOTCOMPUTE*** 95e5fa7eb1SMax Kazantsev; CHECK-NEXT: symbolic max exit count for outer.backedge: ***COULDNOTCOMPUTE*** 96e4da0f96SMax Kazantsev; 97e4da0f96SMax Kazantseventry: 98e4da0f96SMax Kazantsev %b_is_non_negative = icmp sge i32 %b, 0 99e4da0f96SMax Kazantsev br i1 %b_is_non_negative, label %outer, label %failure 100e4da0f96SMax Kazantsev 101e4da0f96SMax Kazantsevouter: 102e4da0f96SMax Kazantsev %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge] 103e4da0f96SMax Kazantsev br label %inner 104e4da0f96SMax Kazantsev 105e4da0f96SMax Kazantsevinner: 106e4da0f96SMax Kazantsev %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge] 107e4da0f96SMax Kazantsev %signed_cond = icmp slt i32 %iv, %b 108e4da0f96SMax Kazantsev br i1 %signed_cond, label %inner.backedge, label %side.exit 109e4da0f96SMax Kazantsev 110e4da0f96SMax Kazantsevinner.backedge: 111e4da0f96SMax Kazantsev %iv.next = add nuw nsw i32 %iv, 1 112e4da0f96SMax Kazantsev %inner.loop.cond = call i1 @cond() 113e4da0f96SMax Kazantsev br i1 %inner.loop.cond, label %inner, label %outer.backedge 114e4da0f96SMax Kazantsev 115e4da0f96SMax Kazantsevouter.backedge: 116e4da0f96SMax Kazantsev %outer.loop.cond = call i1 @cond() 117e4da0f96SMax Kazantsev br i1 %outer.loop.cond, label %outer, label %exit 118e4da0f96SMax Kazantsev 119e4da0f96SMax Kazantsevfailure: 120e4da0f96SMax Kazantsev unreachable 121e4da0f96SMax Kazantsev 122e4da0f96SMax Kazantsevside.exit: 123e4da0f96SMax Kazantsev ret i32 0 124e4da0f96SMax Kazantsev 125e4da0f96SMax Kazantsevexit: 126e4da0f96SMax Kazantsev ret i32 1 127e4da0f96SMax Kazantsev} 128