xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/outer_phi.ll (revision 8b5b294ec2cf876bc5eb5bd5fcb56ef487e36d60)
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