xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/shift-op.ll (revision 0d38f21e4ab7fe7cebe76a9d7c218ec54dba1e98)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
3
4define void @test0(i32 %init) {
5;
6; CHECK-LABEL: 'test0'
7; CHECK-NEXT:  Determining loop execution counts for: @test0
8; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
9; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 32
10; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 32
11;
12 entry:
13  br label %loop
14
15 loop:
16  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
17  %iv.shift = lshr i32 %iv, 1
18  %exit.cond = icmp eq i32 %iv, 0
19  br i1 %exit.cond, label %leave, label %loop
20
21 leave:
22  ret void
23}
24
25define void @test1(i32 %init) {
26;
27; CHECK-LABEL: 'test1'
28; CHECK-NEXT:  Determining loop execution counts for: @test1
29; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
30; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 32
31; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 32
32;
33 entry:
34  br label %loop
35
36 loop:
37  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
38  %iv.shift = shl i32 %iv, 1
39  %exit.cond = icmp eq i32 %iv, 0
40  br i1 %exit.cond, label %leave, label %loop
41
42 leave:
43  ret void
44}
45
46define void @test2(i32 %init) {
47;
48; Unpredictable because %iv could "stabilize" to either -1 or 0,
49; depending on %init.
50; CHECK-LABEL: 'test2'
51; CHECK-NEXT:  Determining loop execution counts for: @test2
52; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
53; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
54; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
55;
56 entry:
57  br label %loop
58
59 loop:
60  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
61  %iv.shift = ashr i32 %iv, 1
62  %exit.cond = icmp eq i32 %iv, 0
63  br i1 %exit.cond, label %leave, label %loop
64
65 leave:
66  ret void
67}
68
69define void @test3(ptr %init.ptr) {
70;
71; CHECK-LABEL: 'test3'
72; CHECK-NEXT:  Determining loop execution counts for: @test3
73; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
74; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 32
75; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 32
76;
77 entry:
78  %init = load i32, ptr %init.ptr, !range !0
79  br label %loop
80
81 loop:
82  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
83  %iv.shift = ashr i32 %iv, 1
84  %exit.cond = icmp eq i32 %iv, 0
85  br i1 %exit.cond, label %leave, label %loop
86
87 leave:
88  ret void
89}
90
91define void @test4(ptr %init.ptr) {
92;
93; CHECK-LABEL: 'test4'
94; CHECK-NEXT:  Determining loop execution counts for: @test4
95; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
96; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 32
97; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 32
98;
99 entry:
100  %init = load i32, ptr %init.ptr, !range !1
101  br label %loop
102
103 loop:
104  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
105  %iv.shift = ashr i32 %iv, 1
106  %exit.cond = icmp eq i32 %iv, -1
107  br i1 %exit.cond, label %leave, label %loop
108
109 leave:
110  ret void
111}
112
113define void @test5(ptr %init.ptr) {
114;
115; %iv will "stabilize" to -1, so this is an infinite loop
116; CHECK-LABEL: 'test5'
117; CHECK-NEXT:  Determining loop execution counts for: @test5
118; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
119; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
120; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
121;
122 entry:
123  %init = load i32, ptr %init.ptr, !range !1
124  br label %loop
125
126 loop:
127  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
128  %iv.shift = ashr i32 %iv, 1
129  %exit.cond = icmp eq i32 %iv, 0
130  br i1 %exit.cond, label %leave, label %loop
131
132 leave:
133  ret void
134}
135
136define void @test6(i32 %init, i32 %shift.amt) {
137;
138; Potentially infinite loop, since %shift.amt could be 0
139; CHECK-LABEL: 'test6'
140; CHECK-NEXT:  Determining loop execution counts for: @test6
141; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
142; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
143; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
144;
145 entry:
146  br label %loop
147
148 loop:
149  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
150  %iv.shift = lshr i32 %iv, %shift.amt
151  %exit.cond = icmp eq i32 %iv, 0
152  br i1 %exit.cond, label %leave, label %loop
153
154 leave:
155  ret void
156}
157
158define void @test7(i32 %init) {
159;
160; CHECK-LABEL: 'test7'
161; CHECK-NEXT:  Determining loop execution counts for: @test7
162; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
163; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 32
164; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 32
165;
166 entry:
167  br label %loop
168
169 loop:
170  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
171  %iv.shift = lshr i32 %iv, 1
172  %exit.cond = icmp eq i32 %iv.shift, 0
173  br i1 %exit.cond, label %leave, label %loop
174
175 leave:
176  ret void
177}
178
179define void @test8(i32 %init) {
180;
181; In this test case, %iv.test stabilizes to 127, not -1, so the loop
182; is infinite.
183; CHECK-LABEL: 'test8'
184; CHECK-NEXT:  Determining loop execution counts for: @test8
185; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
186; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
187; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
188;
189 entry:
190  br label %loop
191
192 loop:
193  %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
194  %iv.shift = ashr i32 %iv, 1
195  %iv.test = lshr i32 %iv, 1
196  %exit.cond = icmp eq i32 %iv.test, -1
197  br i1 %exit.cond, label %leave, label %loop
198
199 leave:
200  ret void
201}
202
203define void @test9() {
204;
205; This is an infinite loop, make sure that it recognized as such.
206; CHECK-LABEL: 'test9'
207; CHECK-NEXT:  Determining loop execution counts for: @test9
208; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
209; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
210; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
211;
212entry:
213  br label %loop
214
215leave:
216  ret void
217
218loop:
219  %iv = phi i32 [ -20, %entry ], [ %iv.shift, %loop ]
220  %iv.shift = ashr i32 %iv, 1
221  %exit.cond = icmp sgt i32 %iv, -1
222  br i1 %exit.cond, label %leave, label %loop
223}
224
225!0 = !{i32 0, i32 50000}
226!1 = !{i32 -5000, i32 -1}
227