1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt < %s -analyze -enable-new-pm=0 -scalar-evolution -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
3; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 2>&1 2>&1 | FileCheck %s
4
5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6target triple = "x86_64-unknown-linux-gnu"
7
8define void @unsimplified_and1(i32 %n) {
9; CHECK-LABEL: 'unsimplified_and1'
10; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_and1
11; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
12; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
13; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
14; CHECK-NEXT:   Predicates:
15; CHECK:       Loop %loop: Trip multiple is 1
16;
17entry:
18  br label %loop
19
20loop:
21  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
22  %iv.inc = add nsw i32 %iv, 1
23  %becond = icmp ule i32 %iv.inc, %n
24  %and = select i1 %becond, i1 true, i1 false
25  br i1 %and, label %loop, label %leave
26
27leave:
28  ret void
29}
30
31define void @unsimplified_and2(i32 %n) {
32; CHECK-LABEL: 'unsimplified_and2'
33; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_and2
34; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
35; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
36; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
37; CHECK-NEXT:   Predicates:
38; CHECK:       Loop %loop: Trip multiple is 1
39;
40entry:
41  br label %loop
42
43loop:
44  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
45  %iv.inc = add nsw i32 %iv, 1
46  %becond = icmp ule i32 %iv.inc, %n
47  %and = select i1 true, i1 %becond, i1 false
48  br i1 %and, label %loop, label %leave
49
50leave:
51  ret void
52}
53
54define void @unsimplified_and3(i32 %n) {
55; CHECK-LABEL: 'unsimplified_and3'
56; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_and3
57; CHECK-NEXT:  Loop %loop: backedge-taken count is false
58; CHECK-NEXT:  Loop %loop: max backedge-taken count is false
59; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is false
60; CHECK-NEXT:   Predicates:
61; CHECK:       Loop %loop: Trip multiple is 1
62;
63entry:
64  br label %loop
65
66loop:
67  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
68  %iv.inc = add nsw i32 %iv, 1
69  %becond = icmp ule i32 %iv.inc, %n
70  %and = select i1 false, i1 %becond, i1 false
71  br i1 %and, label %loop, label %leave
72
73leave:
74  ret void
75}
76
77define void @unsimplified_and4(i32 %n) {
78; CHECK-LABEL: 'unsimplified_and4'
79; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_and4
80; CHECK-NEXT:  Loop %loop: backedge-taken count is false
81; CHECK-NEXT:  Loop %loop: max backedge-taken count is false
82; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is false
83; CHECK-NEXT:   Predicates:
84; CHECK:       Loop %loop: Trip multiple is 1
85;
86entry:
87  br label %loop
88
89loop:
90  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
91  %iv.inc = add nsw i32 %iv, 1
92  %becond = icmp ule i32 %iv.inc, %n
93  %and = select i1 %becond, i1 false, i1 false
94  br i1 %and, label %loop, label %leave
95
96leave:
97  ret void
98}
99
100define void @unsimplified_or1(i32 %n) {
101; CHECK-LABEL: 'unsimplified_or1'
102; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_or1
103; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
104; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
105; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
106;
107entry:
108  br label %loop
109
110loop:
111  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
112  %iv.inc = add nsw i32 %iv, 1
113  %becond = icmp ule i32 %iv.inc, %n
114  %or = select i1 %becond, i1 true, i1 true
115  br i1 %or, label %loop, label %leave
116
117leave:
118  ret void
119}
120
121define void @unsimplified_or2(i32 %n) {
122; CHECK-LABEL: 'unsimplified_or2'
123; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_or2
124; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
125; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
126; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
127;
128entry:
129  br label %loop
130
131loop:
132  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
133  %iv.inc = add nsw i32 %iv, 1
134  %becond = icmp ule i32 %iv.inc, %n
135  %or = select i1 true, i1 true, i1 %becond
136  br i1 %or, label %loop, label %leave
137
138leave:
139  ret void
140}
141
142define void @unsimplified_or3(i32 %n) {
143; CHECK-LABEL: 'unsimplified_or3'
144; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_or3
145; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
146; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
147; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
148; CHECK-NEXT:   Predicates:
149; CHECK:       Loop %loop: Trip multiple is 1
150;
151entry:
152  br label %loop
153
154loop:
155  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
156  %iv.inc = add nsw i32 %iv, 1
157  %becond = icmp ule i32 %iv.inc, %n
158  %or = select i1 false, i1 true, i1 %becond
159  br i1 %or, label %loop, label %leave
160
161leave:
162  ret void
163}
164
165define void @unsimplified_or4(i32 %n) {
166; CHECK-LABEL: 'unsimplified_or4'
167; CHECK-NEXT:  Determining loop execution counts for: @unsimplified_or4
168; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
169; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
170; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
171; CHECK-NEXT:   Predicates:
172; CHECK:       Loop %loop: Trip multiple is 1
173;
174entry:
175  br label %loop
176
177loop:
178  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
179  %iv.inc = add nsw i32 %iv, 1
180  %becond = icmp ule i32 %iv.inc, %n
181  %or = select i1 %becond, i1 true, i1 false
182  br i1 %or, label %loop, label %leave
183
184leave:
185  ret void
186}
187
188define void @reversed_and1(i32 %n) {
189; CHECK-LABEL: 'reversed_and1'
190; CHECK-NEXT:  Determining loop execution counts for: @reversed_and1
191; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
192; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
193; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
194; CHECK-NEXT:   Predicates:
195; CHECK:       Loop %loop: Trip multiple is 1
196;
197entry:
198  br label %loop
199
200loop:
201  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
202  %iv.inc = add nsw i32 %iv, 1
203  %becond = icmp ugt i32 %iv.inc, %n
204  %and = select i1 %becond, i1 true, i1 false
205  br i1 %and, label %leave, label %loop
206
207leave:
208  ret void
209}
210
211define void @reversed_and2(i32 %n) {
212; CHECK-LABEL: 'reversed_and2'
213; CHECK-NEXT:  Determining loop execution counts for: @reversed_and2
214; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
215; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
216; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
217; CHECK-NEXT:   Predicates:
218; CHECK:       Loop %loop: Trip multiple is 1
219;
220entry:
221  br label %loop
222
223loop:
224  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
225  %iv.inc = add nsw i32 %iv, 1
226  %becond = icmp ugt i32 %iv.inc, %n
227  %and = select i1 true, i1 %becond, i1 false
228  br i1 %and, label %leave, label %loop
229
230leave:
231  ret void
232}
233
234define void @reversed_and3(i32 %n) {
235; CHECK-LABEL: 'reversed_and3'
236; CHECK-NEXT:  Determining loop execution counts for: @reversed_and3
237; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
238; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
239; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
240;
241entry:
242  br label %loop
243
244loop:
245  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
246  %iv.inc = add nsw i32 %iv, 1
247  %becond = icmp ugt i32 %iv.inc, %n
248  %and = select i1 false, i1 %becond, i1 false
249  br i1 %and, label %leave, label %loop
250
251leave:
252  ret void
253}
254
255define void @reversed_and4(i32 %n) {
256; CHECK-LABEL: 'reversed_and4'
257; CHECK-NEXT:  Determining loop execution counts for: @reversed_and4
258; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
259; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
260; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
261;
262entry:
263  br label %loop
264
265loop:
266  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
267  %iv.inc = add nsw i32 %iv, 1
268  %becond = icmp ugt i32 %iv.inc, %n
269  %and = select i1 %becond, i1 false, i1 false
270  br i1 %and, label %leave, label %loop
271
272leave:
273  ret void
274}
275
276define void @reversed_or1(i32 %n) {
277; CHECK-LABEL: 'reversed_or1'
278; CHECK-NEXT:  Determining loop execution counts for: @reversed_or1
279; CHECK-NEXT:  Loop %loop: backedge-taken count is false
280; CHECK-NEXT:  Loop %loop: max backedge-taken count is false
281; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is false
282; CHECK-NEXT:   Predicates:
283; CHECK:       Loop %loop: Trip multiple is 1
284;
285entry:
286  br label %loop
287
288loop:
289  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
290  %iv.inc = add nsw i32 %iv, 1
291  %becond = icmp ugt i32 %iv.inc, %n
292  %or = select i1 %becond, i1 true, i1 true
293  br i1 %or, label %leave, label %loop
294
295leave:
296  ret void
297}
298
299define void @reversed_or2(i32 %n) {
300; CHECK-LABEL: 'reversed_or2'
301; CHECK-NEXT:  Determining loop execution counts for: @reversed_or2
302; CHECK-NEXT:  Loop %loop: backedge-taken count is false
303; CHECK-NEXT:  Loop %loop: max backedge-taken count is false
304; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is false
305; CHECK-NEXT:   Predicates:
306; CHECK:       Loop %loop: Trip multiple is 1
307;
308entry:
309  br label %loop
310
311loop:
312  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
313  %iv.inc = add nsw i32 %iv, 1
314  %becond = icmp ugt i32 %iv.inc, %n
315  %or = select i1 true, i1 true, i1 %becond
316  br i1 %or, label %leave, label %loop
317
318leave:
319  ret void
320}
321
322define void @reversed_or3(i32 %n) {
323; CHECK-LABEL: 'reversed_or3'
324; CHECK-NEXT:  Determining loop execution counts for: @reversed_or3
325; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
326; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
327; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
328; CHECK-NEXT:   Predicates:
329; CHECK:       Loop %loop: Trip multiple is 1
330;
331entry:
332  br label %loop
333
334loop:
335  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
336  %iv.inc = add nsw i32 %iv, 1
337  %becond = icmp ugt i32 %iv.inc, %n
338  %or = select i1 false, i1 true, i1 %becond
339  br i1 %or, label %leave, label %loop
340
341leave:
342  ret void
343}
344
345define void @reversed_or4(i32 %n) {
346; CHECK-LABEL: 'reversed_or4'
347; CHECK-NEXT:  Determining loop execution counts for: @reversed_or4
348; CHECK-NEXT:  Loop %loop: backedge-taken count is %n
349; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
350; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is %n
351; CHECK-NEXT:   Predicates:
352; CHECK:       Loop %loop: Trip multiple is 1
353;
354entry:
355  br label %loop
356
357loop:
358  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
359  %iv.inc = add nsw i32 %iv, 1
360  %becond = icmp ugt i32 %iv.inc, %n
361  %or = select i1 %becond, i1 true, i1 false
362  br i1 %or, label %leave, label %loop
363
364leave:
365  ret void
366}
367