Skip to content

Commit a6f70e8

Browse files
committed
added a test case with users from different blocks of the loop
1 parent c70edff commit a6f70e8

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

llvm/test/Transforms/LoopUnroll/AArch64/apple-unrolling.ll

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,84 @@ exit:
285285
ret void
286286
}
287287

288+
define void @load_op_store_loop_multiblock(ptr %src, ptr %dst, i64 %N, i64 %scale, float %k) {
289+
; APPLE-LABEL: define void @load_op_store_loop_multiblock(
290+
; APPLE-SAME: ptr [[SRC:%.*]], ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[SCALE:%.*]], float [[K:%.*]]) #[[ATTR0]] {
291+
; APPLE-NEXT: [[ENTRY:.*]]:
292+
; APPLE-NEXT: br label %[[LOOP:.*]]
293+
; APPLE: [[LOOP]]:
294+
; APPLE-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOPCONT:.*]] ]
295+
; APPLE-NEXT: [[SCALED_IV:%.*]] = mul nuw nsw i64 [[IV]], [[SCALE]]
296+
; APPLE-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 [[SCALED_IV]]
297+
; APPLE-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
298+
; APPLE-NEXT: [[AND:%.*]] = and i64 [[IV]], 1
299+
; APPLE-NEXT: [[ODD:%.*]] = icmp eq i64 [[AND]], 1
300+
; APPLE-NEXT: br i1 [[ODD]], label %[[LOOPODD:.*]], label %[[LOOPCONT]]
301+
; APPLE: [[LOOPCONT]]:
302+
; APPLE-NEXT: [[D:%.*]] = phi float [ [[L2:%.*]], %[[LOOPODD]] ], [ [[L]], %[[LOOP]] ]
303+
; APPLE-NEXT: [[O:%.*]] = fadd float [[D]], [[K]]
304+
; APPLE-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[IV]]
305+
; APPLE-NEXT: store float [[O]], ptr [[GEP_DST]], align 4
306+
; APPLE-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
307+
; APPLE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
308+
; APPLE-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
309+
; APPLE: [[LOOPODD]]:
310+
; APPLE-NEXT: [[L2]] = fneg float [[L]]
311+
; APPLE-NEXT: br label %[[LOOPCONT]]
312+
; APPLE: [[EXIT]]:
313+
; APPLE-NEXT: ret void
314+
;
315+
; OTHER-LABEL: define void @load_op_store_loop_multiblock(
316+
; OTHER-SAME: ptr [[SRC:%.*]], ptr [[DST:%.*]], i64 [[N:%.*]], i64 [[SCALE:%.*]], float [[K:%.*]]) #[[ATTR0]] {
317+
; OTHER-NEXT: [[ENTRY:.*]]:
318+
; OTHER-NEXT: br label %[[LOOP:.*]]
319+
; OTHER: [[LOOP]]:
320+
; OTHER-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOPCONT:.*]] ]
321+
; OTHER-NEXT: [[SCALED_IV:%.*]] = mul nuw nsw i64 [[IV]], [[SCALE]]
322+
; OTHER-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 [[SCALED_IV]]
323+
; OTHER-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
324+
; OTHER-NEXT: [[AND:%.*]] = and i64 [[IV]], 1
325+
; OTHER-NEXT: [[ODD:%.*]] = icmp eq i64 [[AND]], 1
326+
; OTHER-NEXT: br i1 [[ODD]], label %[[LOOPODD:.*]], label %[[LOOPCONT]]
327+
; OTHER: [[LOOPCONT]]:
328+
; OTHER-NEXT: [[D:%.*]] = phi float [ [[L2:%.*]], %[[LOOPODD]] ], [ [[L]], %[[LOOP]] ]
329+
; OTHER-NEXT: [[O:%.*]] = fadd float [[D]], [[K]]
330+
; OTHER-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[IV]]
331+
; OTHER-NEXT: store float [[O]], ptr [[GEP_DST]], align 4
332+
; OTHER-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
333+
; OTHER-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
334+
; OTHER-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
335+
; OTHER: [[LOOPODD]]:
336+
; OTHER-NEXT: [[L2]] = fneg float [[L]]
337+
; OTHER-NEXT: br label %[[LOOPCONT]]
338+
; OTHER: [[EXIT]]:
339+
; OTHER-NEXT: ret void
340+
;
341+
entry:
342+
br label %loop
343+
loop:
344+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loopcont ]
345+
%scaled.iv = mul nuw nsw i64 %iv, %scale
346+
%gep.src = getelementptr inbounds float, ptr %src, i64 %scaled.iv
347+
%l1 = load float, ptr %gep.src, align 4
348+
%and = and i64 %iv, 1
349+
%odd = icmp eq i64 %and, 1
350+
br i1 %odd, label %loopodd, label %loopcont
351+
loopcont:
352+
%d = phi float [ %l2, %loopodd ], [ %l1, %loop]
353+
%o = fadd float %d, %k
354+
%gep.dst = getelementptr inbounds float, ptr %dst, i64 %iv
355+
store float %o, ptr %gep.dst, align 4
356+
%iv.next = add nuw nsw i64 %iv, 1
357+
%ec = icmp eq i64 %iv.next, %N
358+
br i1 %ec, label %exit, label %loop
359+
loopodd:
360+
%l2 = fneg float %l1
361+
br label %loopcont
362+
exit:
363+
ret void
364+
}
365+
288366
@A = external constant [9 x i8], align 1
289367
@B = external constant [8 x i32], align 4
290368
@C = external constant [8 x i32], align 4

0 commit comments

Comments
 (0)