1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -analyze -enable-new-pm=0 -scalar-evolution < %s | FileCheck %s
3; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
4
5define void @umin_sext_x_zext_x(i32 %len) {
6; CHECK-LABEL: 'umin_sext_x_zext_x'
7; CHECK-NEXT:  Classifying expressions for: @umin_sext_x_zext_x
8; CHECK-NEXT:    %len.zext = zext i32 %len to i64
9; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
10; CHECK-NEXT:    %len.sext = sext i32 %len to i64
11; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
12; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
13; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
14; CHECK-NEXT:    %iv.next = add i64 %iv, 1
15; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
16; CHECK-NEXT:    %and = and i1 %cmp1, %cmp2
17; CHECK-NEXT:    --> %and U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
18; CHECK-NEXT:  Determining loop execution counts for: @umin_sext_x_zext_x
19; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
20; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
21; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
22; CHECK-NEXT:   Predicates:
23; CHECK:       Loop %loop: Trip multiple is 1
24;
25entry:
26  %len.zext = zext i32 %len to i64
27  %len.sext = sext i32 %len to i64
28  br label %loop
29loop:
30  %iv = phi i64 [0, %entry], [%iv.next, %loop]
31  %iv.next = add i64 %iv, 1
32  %cmp1 = icmp ult i64 %iv, %len.zext
33  %cmp2 = icmp ult i64 %iv, %len.sext
34  %and = and i1 %cmp1, %cmp2
35  br i1 %and, label %loop, label %exit
36exit:
37  ret void
38}
39
40define void @ule_sext_x_zext_x(i32 %len) {
41; CHECK-LABEL: 'ule_sext_x_zext_x'
42; CHECK-NEXT:  Classifying expressions for: @ule_sext_x_zext_x
43; CHECK-NEXT:    %len.zext = zext i32 %len to i64
44; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
45; CHECK-NEXT:    %len.sext = sext i32 %len to i64
46; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
47; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
48; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
49; CHECK-NEXT:    %iv.next = add i64 %iv, 1
50; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
51; CHECK-NEXT:    %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
52; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant }
53; CHECK-NEXT:  Determining loop execution counts for: @ule_sext_x_zext_x
54; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
55; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
56; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
57; CHECK-NEXT:   Predicates:
58; CHECK:       Loop %loop: Trip multiple is 1
59;
60entry:
61  %len.zext = zext i32 %len to i64
62  %len.sext = sext i32 %len to i64
63  br label %loop
64loop:
65  %iv = phi i64 [0, %entry], [%iv.next, %loop]
66  %iv.next = add i64 %iv, 1
67  %cmp1 = icmp ule i64 %len.zext, %len.sext
68  %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
69  %cmp2 = icmp ult i64 %iv, %sel
70  br i1 %cmp2, label %loop, label %exit
71exit:
72  ret void
73}
74
75define void @uge_sext_x_zext_x(i32 %len) {
76; CHECK-LABEL: 'uge_sext_x_zext_x'
77; CHECK-NEXT:  Classifying expressions for: @uge_sext_x_zext_x
78; CHECK-NEXT:    %len.zext = zext i32 %len to i64
79; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
80; CHECK-NEXT:    %len.sext = sext i32 %len to i64
81; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
82; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
83; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable }
84; CHECK-NEXT:    %iv.next = add i64 %iv, 1
85; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable }
86; CHECK-NEXT:    %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
87; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant }
88; CHECK-NEXT:  Determining loop execution counts for: @uge_sext_x_zext_x
89; CHECK-NEXT:  Loop %loop: backedge-taken count is (sext i32 %len to i64)
90; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
91; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
92; CHECK-NEXT:   Predicates:
93; CHECK:       Loop %loop: Trip multiple is 1
94;
95entry:
96  %len.zext = zext i32 %len to i64
97  %len.sext = sext i32 %len to i64
98  br label %loop
99loop:
100  %iv = phi i64 [0, %entry], [%iv.next, %loop]
101  %iv.next = add i64 %iv, 1
102  %cmp1 = icmp uge i64 %len.zext, %len.sext
103  %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
104  %cmp2 = icmp ult i64 %iv, %sel
105  br i1 %cmp2, label %loop, label %exit
106exit:
107  ret void
108}
109
110define void @ult_sext_x_zext_x(i32 %len) {
111; CHECK-LABEL: 'ult_sext_x_zext_x'
112; CHECK-NEXT:  Classifying expressions for: @ult_sext_x_zext_x
113; CHECK-NEXT:    %len.zext = zext i32 %len to i64
114; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
115; CHECK-NEXT:    %len.sext = sext i32 %len to i64
116; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
117; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
118; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
119; CHECK-NEXT:    %iv.next = add i64 %iv, 1
120; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
121; CHECK-NEXT:    %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext
122; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant }
123; CHECK-NEXT:  Determining loop execution counts for: @ult_sext_x_zext_x
124; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
125; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
126; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
127; CHECK-NEXT:   Predicates:
128; CHECK:       Loop %loop: Trip multiple is 1
129;
130entry:
131  %len.zext = zext i32 %len to i64
132  %len.sext = sext i32 %len to i64
133  br label %loop
134loop:
135  %iv = phi i64 [0, %entry], [%iv.next, %loop]
136  %iv.next = add i64 %iv, 1
137  %cmp1 = icmp ult i64 %len.zext, %len.sext
138  %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext
139  %cmp2 = icmp ult i64 %iv, %umin
140  br i1 %cmp2, label %loop, label %exit
141exit:
142  ret void
143}
144
145define void @ugt_sext_x_zext_x(i32 %len) {
146; CHECK-LABEL: 'ugt_sext_x_zext_x'
147; CHECK-NEXT:  Classifying expressions for: @ugt_sext_x_zext_x
148; CHECK-NEXT:    %len.zext = zext i32 %len to i64
149; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
150; CHECK-NEXT:    %len.sext = sext i32 %len to i64
151; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
152; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
153; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable }
154; CHECK-NEXT:    %iv.next = add i64 %iv, 1
155; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable }
156; CHECK-NEXT:    %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext
157; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant }
158; CHECK-NEXT:  Determining loop execution counts for: @ugt_sext_x_zext_x
159; CHECK-NEXT:  Loop %loop: backedge-taken count is (sext i32 %len to i64)
160; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
161; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
162; CHECK-NEXT:   Predicates:
163; CHECK:       Loop %loop: Trip multiple is 1
164;
165entry:
166  %len.zext = zext i32 %len to i64
167  %len.sext = sext i32 %len to i64
168  br label %loop
169loop:
170  %iv = phi i64 [0, %entry], [%iv.next, %loop]
171  %iv.next = add i64 %iv, 1
172  %cmp1 = icmp ugt i64 %len.zext, %len.sext
173  %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext
174  %cmp2 = icmp ult i64 %iv, %umax
175  br i1 %cmp2, label %loop, label %exit
176exit:
177  ret void
178}
179
180define void @sle_sext_x_zext_x(i32 %len) {
181; CHECK-LABEL: 'sle_sext_x_zext_x'
182; CHECK-NEXT:  Classifying expressions for: @sle_sext_x_zext_x
183; CHECK-NEXT:    %len.zext = zext i32 %len to i64
184; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
185; CHECK-NEXT:    %len.sext = sext i32 %len to i64
186; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
187; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
188; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
189; CHECK-NEXT:    %iv.next = add i64 %iv, 1
190; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
191; CHECK-NEXT:    %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
192; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant }
193; CHECK-NEXT:  Determining loop execution counts for: @sle_sext_x_zext_x
194; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
195; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
196; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
197; CHECK-NEXT:   Predicates:
198; CHECK:       Loop %loop: Trip multiple is 1
199;
200entry:
201  %len.zext = zext i32 %len to i64
202  %len.sext = sext i32 %len to i64
203  br label %loop
204loop:
205  %iv = phi i64 [0, %entry], [%iv.next, %loop]
206  %iv.next = add i64 %iv, 1
207  %cmp1 = icmp ule i64 %len.zext, %len.sext
208  %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
209  %cmp2 = icmp ult i64 %iv, %sel
210  br i1 %cmp2, label %loop, label %exit
211exit:
212  ret void
213}
214
215define void @sge_sext_x_zext_x(i32 %len) {
216; CHECK-LABEL: 'sge_sext_x_zext_x'
217; CHECK-NEXT:  Classifying expressions for: @sge_sext_x_zext_x
218; CHECK-NEXT:    %len.zext = zext i32 %len to i64
219; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
220; CHECK-NEXT:    %len.sext = sext i32 %len to i64
221; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
222; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
223; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
224; CHECK-NEXT:    %iv.next = add i64 %iv, 1
225; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
226; CHECK-NEXT:    %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
227; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant }
228; CHECK-NEXT:  Determining loop execution counts for: @sge_sext_x_zext_x
229; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
230; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
231; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
232; CHECK-NEXT:   Predicates:
233; CHECK:       Loop %loop: Trip multiple is 1
234;
235entry:
236  %len.zext = zext i32 %len to i64
237  %len.sext = sext i32 %len to i64
238  br label %loop
239loop:
240  %iv = phi i64 [0, %entry], [%iv.next, %loop]
241  %iv.next = add i64 %iv, 1
242  %cmp1 = icmp sge i64 %len.zext, %len.sext
243  %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext
244  %cmp2 = icmp ult i64 %iv, %sel
245  br i1 %cmp2, label %loop, label %exit
246exit:
247  ret void
248}
249
250define void @slt_sext_x_zext_x(i32 %len) {
251; CHECK-LABEL: 'slt_sext_x_zext_x'
252; CHECK-NEXT:  Classifying expressions for: @slt_sext_x_zext_x
253; CHECK-NEXT:    %len.zext = zext i32 %len to i64
254; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
255; CHECK-NEXT:    %len.sext = sext i32 %len to i64
256; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
257; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
258; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable }
259; CHECK-NEXT:    %iv.next = add i64 %iv, 1
260; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable }
261; CHECK-NEXT:    %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext
262; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant }
263; CHECK-NEXT:  Determining loop execution counts for: @slt_sext_x_zext_x
264; CHECK-NEXT:  Loop %loop: backedge-taken count is (sext i32 %len to i64)
265; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
266; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64)
267; CHECK-NEXT:   Predicates:
268; CHECK:       Loop %loop: Trip multiple is 1
269;
270entry:
271  %len.zext = zext i32 %len to i64
272  %len.sext = sext i32 %len to i64
273  br label %loop
274loop:
275  %iv = phi i64 [0, %entry], [%iv.next, %loop]
276  %iv.next = add i64 %iv, 1
277  %cmp1 = icmp slt i64 %len.zext, %len.sext
278  %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext
279  %cmp2 = icmp ult i64 %iv, %umin
280  br i1 %cmp2, label %loop, label %exit
281exit:
282  ret void
283}
284
285define void @sgt_sext_x_zext_x(i32 %len) {
286; CHECK-LABEL: 'sgt_sext_x_zext_x'
287; CHECK-NEXT:  Classifying expressions for: @sgt_sext_x_zext_x
288; CHECK-NEXT:    %len.zext = zext i32 %len to i64
289; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296)
290; CHECK-NEXT:    %len.sext = sext i32 %len to i64
291; CHECK-NEXT:    --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
292; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
293; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable }
294; CHECK-NEXT:    %iv.next = add i64 %iv, 1
295; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable }
296; CHECK-NEXT:    %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext
297; CHECK-NEXT:    --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant }
298; CHECK-NEXT:  Determining loop execution counts for: @sgt_sext_x_zext_x
299; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i32 %len to i64)
300; CHECK-NEXT:  Loop %loop: max backedge-taken count is 4294967295
301; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64)
302; CHECK-NEXT:   Predicates:
303; CHECK:       Loop %loop: Trip multiple is 1
304;
305entry:
306  %len.zext = zext i32 %len to i64
307  %len.sext = sext i32 %len to i64
308  br label %loop
309loop:
310  %iv = phi i64 [0, %entry], [%iv.next, %loop]
311  %iv.next = add i64 %iv, 1
312  %cmp1 = icmp sgt i64 %len.zext, %len.sext
313  %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext
314  %cmp2 = icmp ult i64 %iv, %umax
315  br i1 %cmp2, label %loop, label %exit
316exit:
317  ret void
318}
319