]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Analysis/ScalarEvolution/solve-quadratic.ll
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / Analysis / ScalarEvolution / solve-quadratic.ll
1 ; RUN: opt -analyze -scalar-evolution -S -debug-only=scalar-evolution,apint < %s 2>&1 | FileCheck %s
2 ; REQUIRES: asserts
3
4 ; Use the following template to get a chrec {L,+,M,+,N}.
5 ;
6 ; define signext i32 @func() {
7 ; entry:
8 ;   br label %loop
9 ;
10 ; loop:
11 ;   %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ]
12 ;   %inc = phi i32 [ X, %entry ], [ %inc1, %loop ]
13 ;   %acc = phi i32 [ Y, %entry ], [ %acc1, %loop ]
14 ;   %ivr1 = add i32 %ivr, %inc
15 ;   %inc1 = add i32 %inc, Z                 ; M = inc1 = inc + N = X + N
16 ;   %acc1 = add i32 %acc, %inc              ; L = acc1 = X + Y
17 ;   %and  = and i32 %acc1, 2^W-1            ; iW
18 ;   %cond = icmp eq i32 %and, 0
19 ;   br i1 %cond, label %exit, label %loop
20 ;
21 ; exit:
22 ;   %rv = phi i32 [ %acc1, %loop ]
23 ;   ret i32 %rv
24 ; }
25 ;
26 ; From
27 ;       X + Y = L
28 ;       X + Z = M
29 ;           Z = N
30 ; get
31 ;       X = M - N
32 ;       Y = N - M + L
33 ;       Z = N
34
35 ; The connection between the chrec coefficients {L,+,M,+,N} and the quadratic
36 ; coefficients is that the quadratic equation is N x^2 + (2M-N) x + 2L = 0,
37 ; where the equation was multiplied by 2 to make the coefficient at x^2 an
38 ; integer (the actual equation is N/2 x^2 + (M-N/2) x + L = 0).
39
40 ; Quadratic equation: 2x^2 + 2x + 4 in i4, solution (wrap): 4
41 ; {14,+,14,+,14} -> X=0, Y=14, Z=14
42 ;
43 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test01'
44 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {-2,+,-2,+,-2}<%loop>
45 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 4
46 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation -2x^2 + -2x + -4, coeff bw: 5, multiplied by 2
47 ; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow
48 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -2x^2 + -2x + -4, rw:5
49 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 2x^2 + 2x + -28, rw:5
50 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 4
51 ; CHECK: Loop %loop: Unpredictable backedge-taken count
52 define signext i32 @test01() {
53 entry:
54   br label %loop
55
56 loop:
57   %ivr = phi i32 [  0, %entry ], [ %ivr1, %loop ]
58   %inc = phi i32 [  0, %entry ], [ %inc1, %loop ]
59   %acc = phi i32 [ 14, %entry ], [ %acc1, %loop ]
60   %ivr1 = add i32 %ivr, %inc
61   %inc1 = add i32 %inc, 14
62   %acc1 = add i32 %acc, %inc
63   %and  = and i32 %acc1, 15
64   %cond = icmp eq i32 %and, 0
65   br i1 %cond, label %exit, label %loop
66
67 exit:
68   %rv = phi i32 [ %acc1, %loop ]
69   ret i32 %rv
70 }
71
72 ; Quadratic equation: 1x^2 + -73x + -146 in i32, solution (wrap): 75
73 ; {-72,+,-36,+,1} -> X=-37, Y=-35, Z=1
74 ;
75 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test02':
76 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-36,+,1}<%loop>
77 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32
78 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 1x^2 + -73x + 0, coeff bw: 33, multiplied by 2
79 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
80 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + 4294967154, rw:32
81 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -142, rw:32
82 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75
83 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
84 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + 4294967154, rw:33
85 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -4294967438, rw:33
86 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 65573
87 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
88 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + -146, rw:32
89 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -146, rw:32
90 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75
91 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
92 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + -146, rw:33
93 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -146, rw:33
94 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75
95 ; CHECK: Loop %loop: backedge-taken count is 75
96 define signext i32 @test02() {
97 entry:
98   br label %loop
99
100 loop:
101   %ivr = phi i32 [  0, %entry ], [ %ivr1, %loop ]
102   %inc = phi i32 [ -37, %entry ], [ %inc1, %loop ]
103   %acc = phi i32 [ -35, %entry ], [ %acc1, %loop ]
104   %ivr1 = add i32 %ivr, %inc
105   %inc1 = add i32 %inc, 1
106   %acc1 = add i32 %acc, %inc
107   %and  = and i32 %acc1, -1
108   %cond = icmp sgt i32 %and, 0
109   br i1 %cond, label %exit, label %loop
110
111 exit:
112   %rv = phi i32 [ %acc1, %loop ]
113   ret i32 %rv
114 }
115
116 ; Quadratic equation: 2x^2 - 4x + 34 in i4, solution (exact): 1.
117 ; {17,+,-1,+,2} -> X=-3, Y=20, Z=2
118 ;
119 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test03':
120 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {1,+,-1,+,2}<%loop>
121 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 4
122 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 2x^2 + -4x + 2, coeff bw: 5, multiplied by 2
123 ; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow
124 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 2x^2 + -4x + 2, rw:5
125 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 2x^2 + -4x + 2, rw:5
126 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (root): 1
127 ; CHECK: Loop %loop: backedge-taken count is 1
128 define signext i32 @test03() {
129 entry:
130   br label %loop
131
132 loop:
133   %ivr = phi i32 [  0, %entry ], [ %ivr1, %loop ]
134   %inc = phi i32 [ -3, %entry ], [ %inc1, %loop ]
135   %acc = phi i32 [ 20, %entry ], [ %acc1, %loop ]
136   %ivr1 = add i32 %ivr, %inc
137   %inc1 = add i32 %inc, 2
138   %acc1 = add i32 %acc, %inc
139   %and  = and i32 %acc1, 15
140   %cond = icmp eq i32 %and, 0
141   br i1 %cond, label %exit, label %loop
142
143 exit:
144   %rv = phi i32 [ %acc1, %loop ]
145   ret i32 %rv
146 }
147
148 ; Quadratic equation  4x^2 + 2x + 2 in i16, solution (wrap): 181
149 ; {1,+,3,+,4} -> X=-1, Y=2, Z=4 (i16)
150 ;
151 ; This is an example where the returned solution is the first time an
152 ; unsigned wrap occurs, whereas the actual exit condition occurs much
153 ; later. The number of iterations returned by SolveQuadraticEquation
154 ; is 181, but the loop will iterate 37174 times.
155 ;
156 ; Here is a C code that corresponds to this case that calculates the number
157 ; of iterations:
158 ;
159 ; int test04() {
160 ;   int c = 0;
161 ;   int ivr = 0;
162 ;   int inc = -1;
163 ;   int acc = 2;
164 ;
165 ;   while (acc & 0xffff) {
166 ;     c++;
167 ;     ivr += inc;
168 ;     inc += 4;
169 ;     acc += inc;
170 ;   }
171 ;
172 ;   return c;
173 ; }
174 ;
175
176 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test04':
177 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,3,+,4}<%loop>
178 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 16
179 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 4x^2 + 2x + 0, coeff bw: 17, multiplied by 2
180 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
181 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:16
182 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -65534, rw:16
183 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 128
184 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
185 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17
186 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17
187 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181
188 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
189 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:16
190 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -65534, rw:16
191 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 128
192 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
193 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17
194 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17
195 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181
196 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {1,+,3,+,4}<%loop>
197 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 16
198 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 4x^2 + 2x + 2, coeff bw: 17, multiplied by 2
199 ; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow
200 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17
201 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17
202 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181
203 ; CHECK: Loop %loop: Unpredictable backedge-taken count.
204 define signext i32 @test04() {
205 entry:
206   br label %loop
207
208 loop:
209   %ivr = phi i32 [  0, %entry ], [ %ivr1, %loop ]
210   %inc = phi i32 [ -1, %entry ], [ %inc1, %loop ]
211   %acc = phi i32 [  2, %entry ], [ %acc1, %loop ]
212   %ivr1 = add i32 %ivr, %inc
213   %inc1 = add i32 %inc, 4
214   %acc1 = add i32 %acc, %inc
215   %and  = trunc i32 %acc1 to i16
216   %cond = icmp eq i16 %and, 0
217   br i1 %cond, label %exit, label %loop
218
219 exit:
220   %rv = phi i32 [ %acc1, %loop ]
221   ret i32 %rv
222 }
223
224 ; A case with signed arithmetic, but unsigned comparison.
225
226 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test05':
227 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-1,+,-1}<%loop>
228 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32
229 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation -1x^2 + -1x + 0, coeff bw: 33, multiplied by 2
230 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
231 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + 4, rw:32
232 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4, rw:32
233 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 2
234 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
235 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + 4, rw:33
236 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4, rw:33
237 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 2
238 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
239 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + -2, rw:32
240 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4294967294, rw:32
241 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 65536
242 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
243 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + -2, rw:33
244 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -8589934590, rw:33
245 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 92682
246 ; CHECK: Loop %loop: backedge-taken count is 2
247
248 define signext i32 @test05() {
249 entry:
250   br label %loop
251
252 loop:
253   %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ]
254   %inc = phi i32 [ 0, %entry ], [ %inc1, %loop ]
255   %acc = phi i32 [ -1, %entry ], [ %acc1, %loop ]
256   %ivr1 = add i32 %ivr, %inc
257   %inc1 = add i32 %inc, -1
258   %acc1 = add i32 %acc, %inc
259   %and  = and i32 %acc1, -1
260   %cond = icmp ule i32 %and, -3
261   br i1 %cond, label %exit, label %loop
262
263 exit:
264   %rv = phi i32 [ %acc1, %loop ]
265   ret i32 %rv
266 }
267
268 ; A test that used to crash with one of the earlier versions of the code.
269
270 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test06':
271 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-99999,+,1}<%loop>
272 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32
273 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 1x^2 + -199999x + 0, coeff bw: 33, multiplied by 2
274 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
275 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -4294967294, rw:32
276 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 2, rw:32
277 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 1
278 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
279 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -4294967294, rw:33
280 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 4294967298, rw:33
281 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 24469
282 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
283 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -12, rw:32
284 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 4294967284, rw:32
285 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 24469
286 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
287 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -12, rw:33
288 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 8589934580, rw:33
289 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 62450
290 ; CHECK: Loop %loop: backedge-taken count is 24469
291 define signext i32 @test06() {
292 entry:
293   br label %loop
294
295 loop:
296   %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ]
297   %inc = phi i32 [ -100000, %entry ], [ %inc1, %loop ]
298   %acc = phi i32 [ 100000, %entry ], [ %acc1, %loop ]
299   %ivr1 = add i32 %ivr, %inc
300   %inc1 = add i32 %inc, 1
301   %acc1 = add i32 %acc, %inc
302   %and  = and i32 %acc1, -1
303   %cond = icmp sgt i32 %and, 5
304   br i1 %cond, label %exit, label %loop
305
306 exit:
307   %rv = phi i32 [ %acc1, %loop ]
308   ret i32 %rv
309 }
310
311 ; The equation
312 ;   532052752x^2 + -450429774x + 71188414 = 0
313 ; has two exact solutions (up to two decimal digits): 0.21 and 0.64.
314 ; Since there is no integer between them, there is no integer n that either
315 ; solves the equation exactly, or changes the sign of it between n and n+1.
316
317 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test07':
318 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,40811489,+,532052752}<%loop>
319 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32
320 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 532052752x^2 + -450429774x + 0, coeff bw: 33, multiplied by 2
321 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
322 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:32
323 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:32
324 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution
325 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
326 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33
327 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33
328 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution
329 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow
330 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:32
331 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:32
332 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution
333 ; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow
334 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33
335 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33
336 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution
337 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {35594207,+,40811489,+,532052752}<%loop>
338 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32
339 ; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 532052752x^2 + -450429774x + 71188414, coeff bw: 33, multiplied by 2
340 ; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow
341 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33
342 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33
343 ; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution
344 ; CHECK: Loop %loop: Unpredictable backedge-taken count.
345 define signext i32 @test07() {
346 entry:
347   br label %loop
348
349 loop:
350   %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ]
351   %inc = phi i32 [ -491241263, %entry ], [ %inc1, %loop ]
352   %acc = phi i32 [ 526835470, %entry ], [ %acc1, %loop ]
353   %ivr1 = add i32 %ivr, %inc
354   %inc1 = add i32 %inc, 532052752
355   %acc1 = add i32 %acc, %inc
356   %and  = and i32 %acc1, -1
357   %cond = icmp eq i32 %and, 0
358   br i1 %cond, label %exit, label %loop
359
360 exit:
361   %rv = phi i32 [ %acc1, %loop ]
362   ret i32 %rv
363 }
364