1 ; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
2 ; RUN: opt -aa-pipeline=basic-aa -passes='loop-unroll-and-jam' -allow-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
6 ; CHECK-LABEL: fore_aft_less
11 define void @fore_aft_less(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
13 %cmp = icmp sgt i32 %N, 0
14 br i1 %cmp, label %for.outer, label %cleanup
17 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
18 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
19 store i32 1, ptr %arrayidx, align 4
23 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
24 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
25 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
26 %0 = load i32, ptr %arrayidx5, align 4
27 %mul = mul nsw i32 %0, %i
28 %add = add nsw i32 %mul, %sum
29 %add6 = add nuw nsw i32 %j, 1
30 %exitcond = icmp eq i32 %add6, %N
31 br i1 %exitcond, label %for.latch, label %for.inner
34 %add7 = add nuw nsw i32 %i, 1
35 %add72 = add nuw nsw i32 %i, -1
36 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
37 store i32 %add, ptr %arrayidx8, align 4
38 %exitcond29 = icmp eq i32 %add7, %N
39 br i1 %exitcond29, label %cleanup, label %for.outer
46 ; CHECK-LABEL: fore_aft_eq
51 define void @fore_aft_eq(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
53 %cmp = icmp sgt i32 %N, 0
54 br i1 %cmp, label %for.outer, label %cleanup
57 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
58 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
59 store i32 1, ptr %arrayidx, align 4
63 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
64 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
65 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
66 %0 = load i32, ptr %arrayidx5, align 4
67 %mul = mul nsw i32 %0, %i
68 %add = add nsw i32 %mul, %sum
69 %add6 = add nuw nsw i32 %j, 1
70 %exitcond = icmp eq i32 %add6, %N
71 br i1 %exitcond, label %for.latch, label %for.inner
74 %add7 = add nuw nsw i32 %i, 1
75 %add72 = add nuw nsw i32 %i, 0
76 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %i
77 store i32 %add, ptr %arrayidx8, align 4
78 %exitcond29 = icmp eq i32 %add7, %N
79 br i1 %exitcond29, label %cleanup, label %for.outer
86 ; CHECK-LABEL: fore_aft_more
88 ; CHECK-NOT: %j.1 = phi
89 define void @fore_aft_more(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
91 %cmp = icmp sgt i32 %N, 0
92 br i1 %cmp, label %for.outer, label %cleanup
95 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
96 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
97 store i32 1, ptr %arrayidx, align 4
101 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
102 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
103 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
104 %0 = load i32, ptr %arrayidx5, align 4
105 %mul = mul nsw i32 %0, %i
106 %add = add nsw i32 %mul, %sum
107 %add6 = add nuw nsw i32 %j, 1
108 %exitcond = icmp eq i32 %add6, %N
109 br i1 %exitcond, label %for.latch, label %for.inner
112 %add7 = add nuw nsw i32 %i, 1
113 %add72 = add nuw nsw i32 %i, 1
114 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
115 store i32 %add, ptr %arrayidx8, align 4
116 %exitcond29 = icmp eq i32 %add7, %N
117 br i1 %exitcond29, label %cleanup, label %for.outer
124 ; CHECK-LABEL: fore_sub_less
129 define void @fore_sub_less(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
131 %cmp = icmp sgt i32 %N, 0
132 br i1 %cmp, label %for.outer, label %cleanup
135 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
136 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
137 store i32 1, ptr %arrayidx, align 4
141 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
142 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
143 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
144 %0 = load i32, ptr %arrayidx5, align 4
145 %mul = mul nsw i32 %0, %i
146 %add = add nsw i32 %mul, %sum
147 %add72 = add nuw nsw i32 %i, -1
148 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
149 store i32 %add, ptr %arrayidx8, align 4
150 %add6 = add nuw nsw i32 %j, 1
151 %exitcond = icmp eq i32 %add6, %N
152 br i1 %exitcond, label %for.latch, label %for.inner
155 %add7 = add nuw nsw i32 %i, 1
156 %exitcond29 = icmp eq i32 %add7, %N
157 br i1 %exitcond29, label %cleanup, label %for.outer
164 ; CHECK-LABEL: fore_sub_eq
169 define void @fore_sub_eq(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
171 %cmp = icmp sgt i32 %N, 0
172 br i1 %cmp, label %for.outer, label %cleanup
175 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
176 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
177 store i32 1, ptr %arrayidx, align 4
181 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
182 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
183 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
184 %0 = load i32, ptr %arrayidx5, align 4
185 %mul = mul nsw i32 %0, %i
186 %add = add nsw i32 %mul, %sum
187 %add72 = add nuw nsw i32 %i, 0
188 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
189 store i32 %add, ptr %arrayidx8, align 4
190 %add6 = add nuw nsw i32 %j, 1
191 %exitcond = icmp eq i32 %add6, %N
192 br i1 %exitcond, label %for.latch, label %for.inner
195 %add7 = add nuw nsw i32 %i, 1
196 %exitcond29 = icmp eq i32 %add7, %N
197 br i1 %exitcond29, label %cleanup, label %for.outer
204 ; CHECK-LABEL: fore_sub_more
206 ; CHECK-NOT: %j.1 = phi
207 define void @fore_sub_more(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
209 %cmp = icmp sgt i32 %N, 0
210 br i1 %cmp, label %for.outer, label %cleanup
213 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
214 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
215 store i32 1, ptr %arrayidx, align 4
219 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
220 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
221 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
222 %0 = load i32, ptr %arrayidx5, align 4
223 %mul = mul nsw i32 %0, %i
224 %add = add nsw i32 %mul, %sum
225 %add72 = add nuw nsw i32 %i, 1
226 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
227 store i32 %add, ptr %arrayidx8, align 4
228 %add6 = add nuw nsw i32 %j, 1
229 %exitcond = icmp eq i32 %add6, %N
230 br i1 %exitcond, label %for.latch, label %for.inner
233 %add7 = add nuw nsw i32 %i, 1
234 %exitcond29 = icmp eq i32 %add7, %N
235 br i1 %exitcond29, label %cleanup, label %for.outer
242 ; CHECK-LABEL: sub_aft_less
247 define void @sub_aft_less(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
249 %cmp = icmp sgt i32 %N, 0
250 br i1 %cmp, label %for.outer, label %cleanup
253 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
257 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
258 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
259 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
260 %0 = load i32, ptr %arrayidx5, align 4
261 %mul = mul nsw i32 %0, %i
262 %add = add nsw i32 %mul, %sum
263 %add6 = add nuw nsw i32 %j, 1
264 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
265 store i32 1, ptr %arrayidx, align 4
266 %exitcond = icmp eq i32 %add6, %N
267 br i1 %exitcond, label %for.latch, label %for.inner
270 %add7 = add nuw nsw i32 %i, 1
271 %add72 = add nuw nsw i32 %i, -1
272 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
273 store i32 %add, ptr %arrayidx8, align 4
274 %exitcond29 = icmp eq i32 %add7, %N
275 br i1 %exitcond29, label %cleanup, label %for.outer
282 ; CHECK-LABEL: sub_aft_eq
287 define void @sub_aft_eq(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
289 %cmp = icmp sgt i32 %N, 0
290 br i1 %cmp, label %for.outer, label %cleanup
293 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
297 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
298 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
299 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
300 %0 = load i32, ptr %arrayidx5, align 4
301 %mul = mul nsw i32 %0, %i
302 %add = add nsw i32 %mul, %sum
303 %add6 = add nuw nsw i32 %j, 1
304 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
305 store i32 1, ptr %arrayidx, align 4
306 %exitcond = icmp eq i32 %add6, %N
307 br i1 %exitcond, label %for.latch, label %for.inner
310 %add7 = add nuw nsw i32 %i, 1
311 %add72 = add nuw nsw i32 %i, 0
312 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %i
313 store i32 %add, ptr %arrayidx8, align 4
314 %exitcond29 = icmp eq i32 %add7, %N
315 br i1 %exitcond29, label %cleanup, label %for.outer
322 ; CHECK-LABEL: sub_aft_more
324 ; CHECK-NOT: %j.1 = phi
325 define void @sub_aft_more(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
327 %cmp = icmp sgt i32 %N, 0
328 br i1 %cmp, label %for.outer, label %cleanup
331 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
335 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
336 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
337 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
338 %0 = load i32, ptr %arrayidx5, align 4
339 %mul = mul nsw i32 %0, %i
340 %add = add nsw i32 %mul, %sum
341 %add6 = add nuw nsw i32 %j, 1
342 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
343 store i32 1, ptr %arrayidx, align 4
344 %exitcond = icmp eq i32 %add6, %N
345 br i1 %exitcond, label %for.latch, label %for.inner
348 %add7 = add nuw nsw i32 %i, 1
349 %add72 = add nuw nsw i32 %i, 1
350 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
351 store i32 %add, ptr %arrayidx8, align 4
352 %exitcond29 = icmp eq i32 %add7, %N
353 br i1 %exitcond29, label %cleanup, label %for.outer
360 ; CHECK-LABEL: sub_sub_less
362 ; CHECK-NOT: %j.1 = phi
363 define void @sub_sub_less(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
365 %cmp = icmp sgt i32 %N, 0
366 br i1 %cmp, label %for.outer, label %cleanup
369 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
373 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
374 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
375 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
376 %0 = load i32, ptr %arrayidx5, align 4
377 %mul = mul nsw i32 %0, %i
378 %add = add nsw i32 %mul, %sum
379 %add6 = add nuw nsw i32 %j, 1
380 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
381 store i32 1, ptr %arrayidx, align 4
382 %add72 = add nuw nsw i32 %i, -1
383 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
384 store i32 %add, ptr %arrayidx8, align 4
385 %exitcond = icmp eq i32 %add6, %N
386 br i1 %exitcond, label %for.latch, label %for.inner
389 %add7 = add nuw nsw i32 %i, 1
390 %exitcond29 = icmp eq i32 %add7, %N
391 br i1 %exitcond29, label %cleanup, label %for.outer
398 ; CHECK-LABEL: sub_sub_eq
403 define void @sub_sub_eq(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
405 %cmp = icmp sgt i32 %N, 0
406 br i1 %cmp, label %for.outer, label %cleanup
409 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
413 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
414 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
415 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
416 %0 = load i32, ptr %arrayidx5, align 4
417 %mul = mul nsw i32 %0, %i
418 %add = add nsw i32 %mul, %sum
419 %add6 = add nuw nsw i32 %j, 1
420 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
421 store i32 1, ptr %arrayidx, align 4
422 %add72 = add nuw nsw i32 %i, 0
423 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
424 store i32 %add, ptr %arrayidx8, align 4
425 %exitcond = icmp eq i32 %add6, %N
426 br i1 %exitcond, label %for.latch, label %for.inner
429 %add7 = add nuw nsw i32 %i, 1
430 %exitcond29 = icmp eq i32 %add7, %N
431 br i1 %exitcond29, label %cleanup, label %for.outer
438 ; CHECK-LABEL: sub_sub_more
440 ; CHECK-NOT: %j.1 = phi
441 define void @sub_sub_more(ptr noalias nocapture %A, i32 %N, ptr noalias nocapture readonly %B) {
443 %cmp = icmp sgt i32 %N, 0
444 br i1 %cmp, label %for.outer, label %cleanup
447 %i = phi i32 [ %add7, %for.latch ], [ 0, %entry ]
451 %j = phi i32 [ %add6, %for.inner ], [ 0, %for.outer ]
452 %sum = phi i32 [ %add, %for.inner ], [ 0, %for.outer ]
453 %arrayidx5 = getelementptr inbounds i32, ptr %B, i32 %j
454 %0 = load i32, ptr %arrayidx5, align 4
455 %mul = mul nsw i32 %0, %i
456 %add = add nsw i32 %mul, %sum
457 %add6 = add nuw nsw i32 %j, 1
458 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
459 store i32 1, ptr %arrayidx, align 4
460 %add72 = add nuw nsw i32 %i, 1
461 %arrayidx8 = getelementptr inbounds i32, ptr %A, i32 %add72
462 store i32 %add, ptr %arrayidx8, align 4
463 %exitcond = icmp eq i32 %add6, %N
464 br i1 %exitcond, label %for.latch, label %for.inner
467 %add7 = add nuw nsw i32 %i, 1
468 %exitcond29 = icmp eq i32 %add7, %N
469 br i1 %exitcond29, label %cleanup, label %for.outer