1 ; RUN: opt -basicaa -loop-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5 ; CHECK-LABEL: fore_aft_less
10 define void @fore_aft_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
12 %cmp = icmp sgt i32 %N, 0
13 br i1 %cmp, label %for.outer, label %cleanup
16 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
17 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
18 store i32 1, i32* %arrayidx, align 4
22 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
23 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
24 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
25 %0 = load i32, i32* %arrayidx5, align 4
26 %mul = mul nsw i32 %0, %i
27 %add = add nsw i32 %mul, %sum
28 %add6 = add nuw nsw i32 %j, 1
29 %exitcond = icmp eq i32 %add6, %N
30 br i1 %exitcond, label %for.latch, label %for.inner
33 %add7 = add nuw nsw i32 %i, 1
34 %add72 = add nuw nsw i32 %i, -1
35 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
36 store i32 %add, i32* %arrayidx8, align 4
37 %exitcond29 = icmp eq i32 %add7, %N
38 br i1 %exitcond29, label %cleanup, label %for.outer
45 ; CHECK-LABEL: fore_aft_eq
50 define void @fore_aft_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
52 %cmp = icmp sgt i32 %N, 0
53 br i1 %cmp, label %for.outer, label %cleanup
56 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
57 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
58 store i32 1, i32* %arrayidx, align 4
62 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
63 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
64 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
65 %0 = load i32, i32* %arrayidx5, align 4
66 %mul = mul nsw i32 %0, %i
67 %add = add nsw i32 %mul, %sum
68 %add6 = add nuw nsw i32 %j, 1
69 %exitcond = icmp eq i32 %add6, %N
70 br i1 %exitcond, label %for.latch, label %for.inner
73 %add7 = add nuw nsw i32 %i, 1
74 %add72 = add nuw nsw i32 %i, 0
75 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %i
76 store i32 %add, i32* %arrayidx8, align 4
77 %exitcond29 = icmp eq i32 %add7, %N
78 br i1 %exitcond29, label %cleanup, label %for.outer
85 ; CHECK-LABEL: fore_aft_more
87 ; CHECK-NOT: %j.1 = phi
88 define void @fore_aft_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
90 %cmp = icmp sgt i32 %N, 0
91 br i1 %cmp, label %for.outer, label %cleanup
94 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
95 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
96 store i32 1, i32* %arrayidx, align 4
100 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
101 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
102 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
103 %0 = load i32, i32* %arrayidx5, align 4
104 %mul = mul nsw i32 %0, %i
105 %add = add nsw i32 %mul, %sum
106 %add6 = add nuw nsw i32 %j, 1
107 %exitcond = icmp eq i32 %add6, %N
108 br i1 %exitcond, label %for.latch, label %for.inner
111 %add7 = add nuw nsw i32 %i, 1
112 %add72 = add nuw nsw i32 %i, 1
113 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
114 store i32 %add, i32* %arrayidx8, align 4
115 %exitcond29 = icmp eq i32 %add7, %N
116 br i1 %exitcond29, label %cleanup, label %for.outer
123 ; CHECK-LABEL: fore_sub_less
128 define void @fore_sub_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
130 %cmp = icmp sgt i32 %N, 0
131 br i1 %cmp, label %for.outer, label %cleanup
134 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
135 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
136 store i32 1, i32* %arrayidx, align 4
140 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
141 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
142 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
143 %0 = load i32, i32* %arrayidx5, align 4
144 %mul = mul nsw i32 %0, %i
145 %add = add nsw i32 %mul, %sum
146 %add72 = add nuw nsw i32 %i, -1
147 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
148 store i32 %add, i32* %arrayidx8, align 4
149 %add6 = add nuw nsw i32 %j, 1
150 %exitcond = icmp eq i32 %add6, %N
151 br i1 %exitcond, label %for.latch, label %for.inner
154 %add7 = add nuw nsw i32 %i, 1
155 %exitcond29 = icmp eq i32 %add7, %N
156 br i1 %exitcond29, label %cleanup, label %for.outer
163 ; CHECK-LABEL: fore_sub_eq
168 define void @fore_sub_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
170 %cmp = icmp sgt i32 %N, 0
171 br i1 %cmp, label %for.outer, label %cleanup
174 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
175 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
176 store i32 1, i32* %arrayidx, align 4
180 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
181 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
182 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
183 %0 = load i32, i32* %arrayidx5, align 4
184 %mul = mul nsw i32 %0, %i
185 %add = add nsw i32 %mul, %sum
186 %add72 = add nuw nsw i32 %i, 0
187 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
188 store i32 %add, i32* %arrayidx8, align 4
189 %add6 = add nuw nsw i32 %j, 1
190 %exitcond = icmp eq i32 %add6, %N
191 br i1 %exitcond, label %for.latch, label %for.inner
194 %add7 = add nuw nsw i32 %i, 1
195 %exitcond29 = icmp eq i32 %add7, %N
196 br i1 %exitcond29, label %cleanup, label %for.outer
203 ; CHECK-LABEL: fore_sub_more
205 ; CHECK-NOT: %j.1 = phi
206 define void @fore_sub_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
208 %cmp = icmp sgt i32 %N, 0
209 br i1 %cmp, label %for.outer, label %cleanup
212 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
213 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
214 store i32 1, i32* %arrayidx, align 4
218 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
219 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
220 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
221 %0 = load i32, i32* %arrayidx5, align 4
222 %mul = mul nsw i32 %0, %i
223 %add = add nsw i32 %mul, %sum
224 %add72 = add nuw nsw i32 %i, 1
225 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
226 store i32 %add, i32* %arrayidx8, align 4
227 %add6 = add nuw nsw i32 %j, 1
228 %exitcond = icmp eq i32 %add6, %N
229 br i1 %exitcond, label %for.latch, label %for.inner
232 %add7 = add nuw nsw i32 %i, 1
233 %exitcond29 = icmp eq i32 %add7, %N
234 br i1 %exitcond29, label %cleanup, label %for.outer
241 ; CHECK-LABEL: sub_aft_less
246 define void @sub_aft_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
248 %cmp = icmp sgt i32 %N, 0
249 br i1 %cmp, label %for.outer, label %cleanup
252 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
256 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
257 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
258 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
259 %0 = load i32, i32* %arrayidx5, align 4
260 %mul = mul nsw i32 %0, %i
261 %add = add nsw i32 %mul, %sum
262 %add6 = add nuw nsw i32 %j, 1
263 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
264 store i32 1, i32* %arrayidx, align 4
265 %exitcond = icmp eq i32 %add6, %N
266 br i1 %exitcond, label %for.latch, label %for.inner
269 %add7 = add nuw nsw i32 %i, 1
270 %add72 = add nuw nsw i32 %i, -1
271 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
272 store i32 %add, i32* %arrayidx8, align 4
273 %exitcond29 = icmp eq i32 %add7, %N
274 br i1 %exitcond29, label %cleanup, label %for.outer
281 ; CHECK-LABEL: sub_aft_eq
286 define void @sub_aft_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
288 %cmp = icmp sgt i32 %N, 0
289 br i1 %cmp, label %for.outer, label %cleanup
292 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
296 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
297 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
298 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
299 %0 = load i32, i32* %arrayidx5, align 4
300 %mul = mul nsw i32 %0, %i
301 %add = add nsw i32 %mul, %sum
302 %add6 = add nuw nsw i32 %j, 1
303 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
304 store i32 1, i32* %arrayidx, align 4
305 %exitcond = icmp eq i32 %add6, %N
306 br i1 %exitcond, label %for.latch, label %for.inner
309 %add7 = add nuw nsw i32 %i, 1
310 %add72 = add nuw nsw i32 %i, 0
311 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %i
312 store i32 %add, i32* %arrayidx8, align 4
313 %exitcond29 = icmp eq i32 %add7, %N
314 br i1 %exitcond29, label %cleanup, label %for.outer
321 ; CHECK-LABEL: sub_aft_more
323 ; CHECK-NOT: %j.1 = phi
324 define void @sub_aft_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
326 %cmp = icmp sgt i32 %N, 0
327 br i1 %cmp, label %for.outer, label %cleanup
330 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
334 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
335 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
336 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
337 %0 = load i32, i32* %arrayidx5, align 4
338 %mul = mul nsw i32 %0, %i
339 %add = add nsw i32 %mul, %sum
340 %add6 = add nuw nsw i32 %j, 1
341 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
342 store i32 1, i32* %arrayidx, align 4
343 %exitcond = icmp eq i32 %add6, %N
344 br i1 %exitcond, label %for.latch, label %for.inner
347 %add7 = add nuw nsw i32 %i, 1
348 %add72 = add nuw nsw i32 %i, 1
349 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
350 store i32 %add, i32* %arrayidx8, align 4
351 %exitcond29 = icmp eq i32 %add7, %N
352 br i1 %exitcond29, label %cleanup, label %for.outer
359 ; CHECK-LABEL: sub_sub_less
361 ; CHECK-NOT: %j.1 = phi
362 define void @sub_sub_less(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
364 %cmp = icmp sgt i32 %N, 0
365 br i1 %cmp, label %for.outer, label %cleanup
368 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
372 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
373 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
374 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
375 %0 = load i32, i32* %arrayidx5, align 4
376 %mul = mul nsw i32 %0, %i
377 %add = add nsw i32 %mul, %sum
378 %add6 = add nuw nsw i32 %j, 1
379 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
380 store i32 1, i32* %arrayidx, align 4
381 %add72 = add nuw nsw i32 %i, -1
382 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
383 store i32 %add, i32* %arrayidx8, align 4
384 %exitcond = icmp eq i32 %add6, %N
385 br i1 %exitcond, label %for.latch, label %for.inner
388 %add7 = add nuw nsw i32 %i, 1
389 %exitcond29 = icmp eq i32 %add7, %N
390 br i1 %exitcond29, label %cleanup, label %for.outer
397 ; CHECK-LABEL: sub_sub_eq
400 define void @sub_sub_eq(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
402 %cmp = icmp sgt i32 %N, 0
403 br i1 %cmp, label %for.outer, label %cleanup
406 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
410 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
411 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
412 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
413 %0 = load i32, i32* %arrayidx5, align 4
414 %mul = mul nsw i32 %0, %i
415 %add = add nsw i32 %mul, %sum
416 %add6 = add nuw nsw i32 %j, 1
417 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
418 store i32 1, i32* %arrayidx, align 4
419 %add72 = add nuw nsw i32 %i, 0
420 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
421 store i32 %add, i32* %arrayidx8, align 4
422 %exitcond = icmp eq i32 %add6, %N
423 br i1 %exitcond, label %for.latch, label %for.inner
426 %add7 = add nuw nsw i32 %i, 1
427 %exitcond29 = icmp eq i32 %add7, %N
428 br i1 %exitcond29, label %cleanup, label %for.outer
435 ; CHECK-LABEL: sub_sub_more
437 ; CHECK-NOT: %j.1 = phi
438 define void @sub_sub_more(i32* noalias nocapture %A, i32 %N, i32* noalias nocapture readonly %B) {
440 %cmp = icmp sgt i32 %N, 0
441 br i1 %cmp, label %for.outer, label %cleanup
444 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
448 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
449 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
450 %arrayidx5 = getelementptr inbounds i32, i32* %B, i32 %j
451 %0 = load i32, i32* %arrayidx5, align 4
452 %mul = mul nsw i32 %0, %i
453 %add = add nsw i32 %mul, %sum
454 %add6 = add nuw nsw i32 %j, 1
455 %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i
456 store i32 1, i32* %arrayidx, align 4
457 %add72 = add nuw nsw i32 %i, 1
458 %arrayidx8 = getelementptr inbounds i32, i32* %A, i32 %add72
459 store i32 %add, i32* %arrayidx8, align 4
460 %exitcond = icmp eq i32 %add6, %N
461 br i1 %exitcond, label %for.latch, label %for.inner
464 %add7 = add nuw nsw i32 %i, 1
465 %exitcond29 = icmp eq i32 %add7, %N
466 br i1 %exitcond29, label %cleanup, label %for.outer