@@ -499,4 +499,84 @@ define i32 @twoalloc_with_lifetimes() {
499
499
ret i32 %r
500
500
}
501
501
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
+
502
582
declare void @llvm.memcpy.p0.p0.i64 (ptr , ptr , i64 , i1 )
0 commit comments