@@ -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+
502582declare void @llvm.memcpy.p0.p0.i64 (ptr , ptr , i64 , i1 )
0 commit comments