1273cbb58SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2 263df77d9SMax Kazantsev; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s --check-prefix=DEFAULT 363df77d9SMax Kazantsev; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-use-expensive-range-sharpening < %s 2>&1 | FileCheck %s --check-prefix=EXPENSIVE_SHARPENING 4273cbb58SMax Kazantsev 5273cbb58SMax Kazantsev; This test exercises the following scenario: 6273cbb58SMax Kazantsev; given: n > 0 7273cbb58SMax Kazantsev; for (i = 0, j = n - 1; i < n; i++, j--) { 8273cbb58SMax Kazantsev; a = n - i; 9273cbb58SMax Kazantsev; b = (n - 1) - i; 10273cbb58SMax Kazantsev; c = 2147483647 - 1; 11273cbb58SMax Kazantsev; } 12273cbb58SMax Kazantsev; 13273cbb58SMax Kazantsev; Note that value ranges of 'i' and 'j' are the same, just inverted. It means that 14273cbb58SMax Kazantsev; they have same ranges and same no-wrap properties. 'b' is just an alternative 15273cbb58SMax Kazantsev; way to compute the same value as 'j'. 'a' is effectively 'j + 1' and 'c' is a 16273cbb58SMax Kazantsev; a positive value. All involved addrecs for 'i', 'j', 'a', 'b', 'c' should have 17273cbb58SMax Kazantsev; no-sign-wrap flag. 18273cbb58SMax Kazantsev; 19273cbb58SMax Kazantsev; i's AddRec is expected to be proven no-sign-wrap 20273cbb58SMax Kazantsev; j's AddRec is expected to be proven no-sign-wrap 21273cbb58SMax Kazantsev; FIXME: a's AddRec is expected to be no-sign-wrap 22273cbb58SMax Kazantsev; b's AddRec is expected to be no-sign-wrap 23273cbb58SMax Kazantsev; FIXME: c's AddRec is expected to be no-sign-wrap 24273cbb58SMax Kazantsev; i is expected to be non-negative 25273cbb58SMax Kazantsev; j is expected to be non-negative 265b96b13fSMax Kazantsev; a is expected to be positive 275b96b13fSMax Kazantsev; b is expected to be non-negative 28273cbb58SMax Kazantsev; c is expected to be positive 29273cbb58SMax Kazantsevdefine i32 @test_step_1_flags(i32 %n) { 3063df77d9SMax Kazantsev; DEFAULT-LABEL: 'test_step_1_flags' 3163df77d9SMax Kazantsev; DEFAULT-NEXT: Classifying expressions for: @test_step_1_flags 3263df77d9SMax Kazantsev; DEFAULT-NEXT: %n.minus.1 = sub nsw i32 %n, 1 3363df77d9SMax Kazantsev; DEFAULT-NEXT: --> (-1 + %n) U: full-set S: full-set 3463df77d9SMax Kazantsev; DEFAULT-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 3563df77d9SMax Kazantsev; DEFAULT-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %n) LoopDispositions: { %loop: Computable } 3663df77d9SMax Kazantsev; DEFAULT-NEXT: %j = phi i32 [ %n.minus.1, %entry ], [ %j.next, %loop ] 3763df77d9SMax Kazantsev; DEFAULT-NEXT: --> {(-1 + %n),+,-1}<nsw><%loop> U: full-set S: full-set Exits: 0 LoopDispositions: { %loop: Computable } 3863df77d9SMax Kazantsev; DEFAULT-NEXT: %a = sub i32 %n, %i 3963df77d9SMax Kazantsev; DEFAULT-NEXT: --> {%n,+,-1}<nw><%loop> U: full-set S: full-set Exits: 1 LoopDispositions: { %loop: Computable } 4063df77d9SMax Kazantsev; DEFAULT-NEXT: %b = sub i32 %n.minus.1, %i 4163df77d9SMax Kazantsev; DEFAULT-NEXT: --> {(-1 + %n),+,-1}<nsw><%loop> U: full-set S: full-set Exits: 0 LoopDispositions: { %loop: Computable } 4263df77d9SMax Kazantsev; DEFAULT-NEXT: %c = sub i32 2147483647, %i 43e08f9894SDmitry Makogon; DEFAULT-NEXT: --> {2147483647,+,-1}<nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: (-2147483648 + (-1 * %n)) LoopDispositions: { %loop: Computable } 4463df77d9SMax Kazantsev; DEFAULT-NEXT: %i.next = add nuw nsw i32 %i, 1 4563df77d9SMax Kazantsev; DEFAULT-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: %n LoopDispositions: { %loop: Computable } 4663df77d9SMax Kazantsev; DEFAULT-NEXT: %j.next = add nsw i32 %j, -1 4763df77d9SMax Kazantsev; DEFAULT-NEXT: --> {(-2 + %n),+,-1}<nw><%loop> U: full-set S: full-set Exits: -1 LoopDispositions: { %loop: Computable } 4863df77d9SMax Kazantsev; DEFAULT-NEXT: Determining loop execution counts for: @test_step_1_flags 4963df77d9SMax Kazantsev; DEFAULT-NEXT: Loop %loop: backedge-taken count is (-1 + %n) 50*7755c261SPhilip Reames; DEFAULT-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483646 5163df77d9SMax Kazantsev; DEFAULT-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %n) 5288f7dc17SNikita Popov; DEFAULT-NEXT: Loop %loop: Trip multiple is 1 5363df77d9SMax Kazantsev; 5463df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-LABEL: 'test_step_1_flags' 5563df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: Classifying expressions for: @test_step_1_flags 5663df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %n.minus.1 = sub nsw i32 %n, 1 5763df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> (-1 + %n) U: full-set S: full-set 5863df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 5963df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %n) LoopDispositions: { %loop: Computable } 6063df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %j = phi i32 [ %n.minus.1, %entry ], [ %j.next, %loop ] 615b96b13fSMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {(-1 + %n),+,-1}<nsw><%loop> U: [0,2147483647) S: [0,2147483647) Exits: 0 LoopDispositions: { %loop: Computable } 6263df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %a = sub i32 %n, %i 635b96b13fSMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {%n,+,-1}<nw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: 1 LoopDispositions: { %loop: Computable } 6463df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %b = sub i32 %n.minus.1, %i 655b96b13fSMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {(-1 + %n),+,-1}<nsw><%loop> U: [0,2147483647) S: [0,2147483647) Exits: 0 LoopDispositions: { %loop: Computable } 6663df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %c = sub i32 2147483647, %i 67e08f9894SDmitry Makogon; EXPENSIVE_SHARPENING-NEXT: --> {2147483647,+,-1}<nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: (-2147483648 + (-1 * %n)) LoopDispositions: { %loop: Computable } 6863df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %i.next = add nuw nsw i32 %i, 1 6963df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2147483648) S: [1,-2147483648) Exits: %n LoopDispositions: { %loop: Computable } 7063df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: %j.next = add nsw i32 %j, -1 715b96b13fSMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: --> {(-2 + %n),+,-1}<nsw><%loop> U: full-set S: [-1,2147483646) Exits: -1 LoopDispositions: { %loop: Computable } 7263df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: Determining loop execution counts for: @test_step_1_flags 7363df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: Loop %loop: backedge-taken count is (-1 + %n) 74*7755c261SPhilip Reames; EXPENSIVE_SHARPENING-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483646 7563df77d9SMax Kazantsev; EXPENSIVE_SHARPENING-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %n) 7688f7dc17SNikita Popov; EXPENSIVE_SHARPENING-NEXT: Loop %loop: Trip multiple is 1 77273cbb58SMax Kazantsev; 78273cbb58SMax Kazantseventry: 79273cbb58SMax Kazantsev %n.minus.1 = sub nsw i32 %n, 1 80273cbb58SMax Kazantsev %precond = icmp sgt i32 %n, 0 81273cbb58SMax Kazantsev br i1 %precond, label %loop, label %fail 82273cbb58SMax Kazantsev 83273cbb58SMax Kazantsevloop: 84273cbb58SMax Kazantsev %i = phi i32 [0, %entry], [%i.next, %loop] ; 0...n-1 85273cbb58SMax Kazantsev %j = phi i32 [%n.minus.1, %entry], [%j.next, %loop] ; n-1...0 86273cbb58SMax Kazantsev %a = sub i32 %n, %i ; n...1 87273cbb58SMax Kazantsev %b = sub i32 %n.minus.1, %i ; n-1...0 88273cbb58SMax Kazantsev %c = sub i32 2147483647, %i ; 2147483647...1 89273cbb58SMax Kazantsev %i.next = add nuw nsw i32 %i, 1 90273cbb58SMax Kazantsev %j.next = add nsw i32 %j, -1 91273cbb58SMax Kazantsev %cond = icmp slt i32 %i.next, %n 92273cbb58SMax Kazantsev br i1 %cond, label %loop, label %exit 93273cbb58SMax Kazantsev 94273cbb58SMax Kazantsevfail: 95273cbb58SMax Kazantsev ret i32 -1 96273cbb58SMax Kazantsev 97273cbb58SMax Kazantsevexit: 98273cbb58SMax Kazantsev ret i32 0 99273cbb58SMax Kazantsev} 100