1 ; RUN: opt -analyze -scalar-evolution %s -enable-new-pm=0 | FileCheck %s
2 ; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
4 ; Test cases that require rewriting zext SCEV expression with infomration from
7 define void @rewrite_zext(i32 %n) {
8 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext
9 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
10 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 2
11 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
12 ; CHECK-NEXT: Predicates:
13 ; CHECK: Loop %loop: Trip multiple is 1
16 %ext = zext i32 %n to i64
17 %cmp5 = icmp ule i64 %ext, 24
18 br i1 %cmp5, label %check, label %exit
20 check: ; preds = %entry
21 %min.iters.check = icmp ult i64 %ext, 8
22 %n.vec = and i64 %ext, -8
23 br i1 %min.iters.check, label %exit, label %loop
26 %index = phi i64 [ 0, %check ], [ %index.next, %loop ]
27 %index.next = add nuw nsw i64 %index, 8
28 %ec = icmp eq i64 %index.next, %n.vec
29 br i1 %ec, label %exit, label %loop
35 ; Test case from PR40961.
36 define i32 @rewrite_zext_min_max(i32 %N, i32* %arr) {
37 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext_min_max
38 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-4 + (4 * ((zext i32 (16 umin %N) to i64) /u 4))<nuw><nsw>)<nsw> /u 4)
39 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 3
40 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (4 * ((zext i32 (16 umin %N) to i64) /u 4))<nuw><nsw>)<nsw> /u 4)
41 ; CHECK-NEXT: Predicates:
42 ; CHECK: Loop %loop: Trip multiple is 1
45 %umin = call i32 @llvm.umin.i32(i32 %N, i32 16)
46 %ext = zext i32 %umin to i64
47 %min.iters.check = icmp ult i64 %ext, 4
48 br i1 %min.iters.check, label %exit, label %loop.ph
51 %n.vec = and i64 %ext, 28
54 ; %n.vec is [4, 16) and a multiple of 4.
56 %index = phi i64 [ 0, %loop.ph ], [ %index.next, %loop ]
57 %gep = getelementptr inbounds i32, i32* %arr, i64 %index
58 store i32 0, i32* %gep
59 %index.next = add nuw i64 %index, 4
60 %ec = icmp eq i64 %index.next, %n.vec
61 br i1 %ec, label %exit, label %loop
67 ; Test case from PR52464. applyLoopGuards needs to apply information about %and
68 ; to %ext, which requires rewriting the zext.
69 define i32 @rewrite_zext_with_info_from_icmp_ne(i32 %N) {
70 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext_with_info_from_icmp_ne
71 ; CHECK-NEXT: Loop %loop: backedge-taken count is 0
72 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 0
73 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 0
74 ; CHECK-NEXT: Predicates:
76 ; CHECK-NEXT: Loop %loop: Trip multiple is 1
80 %cmp6.not = icmp eq i32 %and, 0
81 br i1 %cmp6.not, label %exit, label %loop.ph
84 %and.sub.1 = add nsw i32 %and, -1
85 %ext = zext i32 %and.sub.1 to i64
86 %n.rnd.up = add nuw nsw i64 %ext, 4
87 %n.vec = and i64 %n.rnd.up, 8589934588
91 %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop ]
92 %iv.next = add i64 %iv, 4
93 call void @use(i64 %iv.next)
94 %ec = icmp eq i64 %iv.next, %n.vec
95 br i1 %ec, label %exit, label %loop
101 ; Similar to @rewrite_zext_with_info_from_icmp_ne, but the loop is not guarded by %and != 0,
102 ; hence the subsequent subtraction may yield a negative number.
103 define i32 @rewrite_zext_no_icmp_ne(i32 %N) {
104 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext_no_icmp_ne
105 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-4 + (4 * ((4 + (zext i32 (-1 + (zext i2 (trunc i32 %N to i2) to i32))<nsw> to i64))<nuw><nsw> /u 4))<nuw><nsw>)<nsw> /u 4)
106 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 1073741823
107 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (4 * ((4 + (zext i32 (-1 + (zext i2 (trunc i32 %N to i2) to i32))<nsw> to i64))<nuw><nsw> /u 4))<nuw><nsw>)<nsw> /u 4)
108 ; CHECK-NEXT: Predicates:
110 ; CHECK-NEXT: Loop %loop: Trip multiple is 1
117 %and.sub.1 = add nsw i32 %and, -1
118 %ext = zext i32 %and.sub.1 to i64
119 %n.rnd.up = add nuw nsw i64 %ext, 4
120 %n.vec = and i64 %n.rnd.up, 8589934588
124 %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop ]
125 %iv.next = add i64 %iv, 4
126 call void @use(i64 %iv.next)
127 %ec = icmp eq i64 %iv.next, %n.vec
128 br i1 %ec, label %exit, label %loop
134 ; Make sure no information is lost for conditions on both %n and (zext %n).
135 define void @rewrite_zext_and_base_1(i32 %n) {
136 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext_and_base
137 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
138 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 3
139 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
140 ; CHECK-NEXT: Predicates:
141 ; CHECK: Loop %loop: Trip multiple is 1
144 %ext = zext i32 %n to i64
145 %cmp5 = icmp ule i64 %ext, 48
146 br i1 %cmp5, label %check.1, label %exit
149 %cmp.2 = icmp ule i32 %n, 32
150 br i1 %cmp.2, label %check, label %exit
153 check: ; preds = %entry
154 %min.iters.check = icmp ult i64 %ext, 8
155 %n.vec = and i64 %ext, -8
156 br i1 %min.iters.check, label %exit, label %loop
159 %index = phi i64 [ 0, %check ], [ %index.next, %loop ]
160 %index.next = add nuw nsw i64 %index, 8
161 %ec = icmp eq i64 %index.next, %n.vec
162 br i1 %ec, label %exit, label %loop
168 ; Make sure no information is lost for conditions on both %n and (zext %n).
169 define void @rewrite_zext_and_base_2(i32 %n) {
170 ; CHECK-LABEL: Determining loop execution counts for: @rewrite_zext_and_base
171 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
172 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 3
173 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-8 + (8 * ((zext i32 %n to i64) /u 8))<nuw><nsw>)<nsw> /u 8)
174 ; CHECK-NEXT: Predicates:
175 ; CHECK: Loop %loop: Trip multiple is 1
178 %ext = zext i32 %n to i64
179 %cmp5 = icmp ule i64 %ext, 32
180 br i1 %cmp5, label %check.1, label %exit
183 %cmp.2 = icmp ule i32 %n, 48
184 br i1 %cmp.2, label %check, label %exit
186 check: ; preds = %entry
187 %min.iters.check = icmp ult i64 %ext, 8
188 %n.vec = and i64 %ext, -8
189 br i1 %min.iters.check, label %exit, label %loop
192 %index = phi i64 [ 0, %check ], [ %index.next, %loop ]
193 %index.next = add nuw nsw i64 %index, 8
194 %ec = icmp eq i64 %index.next, %n.vec
195 br i1 %ec, label %exit, label %loop
201 define void @guard_pessimizes_analysis_step2(i1 %c, i32 %N) {
202 ; CHECK-LABEL: 'guard_pessimizes_analysis_step2'
203 ; CHECK: Determining loop execution counts for: @guard_pessimizes_analysis_step2
204 ; CHECK-NEXT: Loop %loop: backedge-taken count is ((14 + (-1 * %init)<nsw>)<nsw> /u 2)
205 ; CHECK-NEXT: Loop %loop: max backedge-taken count is 6
206 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((14 + (-1 * %init)<nsw>)<nsw> /u 2)
207 ; CHECK-NEXT: Predicates:
209 ; CHECK-NEXT: Loop %loop: Trip multiple is 1
212 %N.ext = zext i32 %N to i64
213 br i1 %c, label %bb1, label %guard
219 %init = phi i64 [ 2, %entry ], [ 4, %bb1 ]
220 %c.1 = icmp ult i64 %init, %N.ext
221 br i1 %c.1, label %loop.ph, label %exit
227 %iv = phi i64 [ %iv.next, %loop ], [ %init, %loop.ph ]
228 %iv.next = add i64 %iv, 2
229 %exitcond = icmp eq i64 %iv.next, 16
230 br i1 %exitcond, label %exit, label %loop
235 declare void @use(i64)
237 declare i32 @llvm.umin.i32(i32, i32)