Skip to content

Commit 1e2dc5b

Browse files
committed
[SROA] Add load-only promotion tests with dynamic offset load
1 parent a947419 commit 1e2dc5b

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

llvm/test/Transforms/SROA/readonlynocapture.ll

+80
Original file line numberDiff line numberDiff line change
@@ -499,4 +499,84 @@ define i32 @twoalloc_with_lifetimes() {
499499
ret i32 %r
500500
}
501501

502+
declare void @use.i32(i32)
503+
504+
define void @load_dyn_offset(ptr %ary) {
505+
; CHECK-LABEL: @load_dyn_offset(
506+
; CHECK-NEXT: [[A:%.*]] = alloca { i64, [4 x i32] }, align 8
507+
; CHECK-NEXT: store i64 0, ptr [[A]], align 4
508+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 8
509+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[GEP]], ptr [[ARY:%.*]], i64 16, i1 false)
510+
; CHECK-NEXT: br label [[LOOP:%.*]]
511+
; CHECK: loop:
512+
; CHECK-NEXT: [[I:%.*]] = load i64, ptr [[A]], align 4
513+
; CHECK-NEXT: [[I_NEXT:%.*]] = add i64 [[I]], 1
514+
; CHECK-NEXT: store i64 [[I_NEXT]], ptr [[A]], align 4
515+
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr i32, ptr [[GEP]], i64 [[I]]
516+
; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[GEP_I]], align 4
517+
; CHECK-NEXT: call void @use.i32(i32 [[VAL]])
518+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[I_NEXT]], 6
519+
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
520+
; CHECK: exit:
521+
; CHECK-NEXT: ret void
522+
;
523+
%a = alloca {i64, [4 x i32]}
524+
store i64 0, ptr %a
525+
%gep = getelementptr i8, ptr %a, i64 8
526+
call void @llvm.memcpy(ptr %gep, ptr %ary, i64 16, i1 false)
527+
br label %loop
528+
529+
loop:
530+
%i = load i64, ptr %a
531+
%i.next = add i64 %i, 1
532+
store i64 %i.next, ptr %a
533+
%gep.i = getelementptr i32, ptr %gep, i64 %i
534+
%val = load i32, ptr %gep.i
535+
call void @use.i32(i32 %val)
536+
%cmp = icmp eq i64 %i.next, 6
537+
br i1 %cmp, label %exit, label %loop
538+
539+
exit:
540+
ret void
541+
}
542+
543+
define void @store_dyn_offset(ptr %ary) {
544+
; CHECK-LABEL: @store_dyn_offset(
545+
; CHECK-NEXT: [[A:%.*]] = alloca { i64, [4 x i32] }, align 8
546+
; CHECK-NEXT: store i64 0, ptr [[A]], align 4
547+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 8
548+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[GEP]], ptr [[ARY:%.*]], i64 16, i1 false)
549+
; CHECK-NEXT: br label [[LOOP:%.*]]
550+
; CHECK: loop:
551+
; CHECK-NEXT: [[I:%.*]] = load i64, ptr [[A]], align 4
552+
; CHECK-NEXT: [[I_NEXT:%.*]] = add i64 [[I]], 1
553+
; CHECK-NEXT: store i64 [[I_NEXT]], ptr [[A]], align 4
554+
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr i32, ptr [[GEP]], i64 [[I]]
555+
; CHECK-NEXT: [[I_TRUNC:%.*]] = trunc i64 [[I]] to i32
556+
; CHECK-NEXT: store i32 [[I_TRUNC]], ptr [[GEP_I]], align 4
557+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[I_NEXT]], 6
558+
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
559+
; CHECK: exit:
560+
; CHECK-NEXT: ret void
561+
;
562+
%a = alloca {i64, [4 x i32]}
563+
store i64 0, ptr %a
564+
%gep = getelementptr i8, ptr %a, i64 8
565+
call void @llvm.memcpy(ptr %gep, ptr %ary, i64 16, i1 false)
566+
br label %loop
567+
568+
loop:
569+
%i = load i64, ptr %a
570+
%i.next = add i64 %i, 1
571+
store i64 %i.next, ptr %a
572+
%gep.i = getelementptr i32, ptr %gep, i64 %i
573+
%i.trunc = trunc i64 %i to i32
574+
store i32 %i.trunc, ptr %gep.i
575+
%cmp = icmp eq i64 %i.next, 6
576+
br i1 %cmp, label %exit, label %loop
577+
578+
exit:
579+
ret void
580+
}
581+
502582
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)

0 commit comments

Comments
 (0)