@@ -544,3 +544,55 @@ define i32 @test10(i32 %v) {
544
544
leave:
545
545
ret i32 22
546
546
}
547
+
548
+ ; TODO: We don't really need trunc/zext here because when iv.next overflows,
549
+ ; its value is not used.
550
+ define i32 @test11 (i32 %start , i32* %p , i32* %q ) {
551
+ ; CHECK-LABEL: @test11(
552
+ ; CHECK-NEXT: entry:
553
+ ; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
554
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
555
+ ; CHECK: loop:
556
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[TMP0]], [[ENTRY:%.*]] ]
557
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV]] to i32
558
+ ; CHECK-NEXT: [[IV_NEXT:%.*]] = add i32 [[TMP1]], -1
559
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[INDVARS_IV]], 0
560
+ ; CHECK-NEXT: br i1 [[COND]], label [[EXIT:%.*]], label [[BACKEDGE]]
561
+ ; CHECK: backedge:
562
+ ; CHECK-NEXT: [[INDEX:%.*]] = zext i32 [[IV_NEXT]] to i64
563
+ ; CHECK-NEXT: [[STORE_ADDR:%.*]] = getelementptr i32, i32* [[P:%.*]], i64 [[INDEX]]
564
+ ; CHECK-NEXT: store i32 1, i32* [[STORE_ADDR]], align 4
565
+ ; CHECK-NEXT: [[LOAD_ADDR:%.*]] = getelementptr i32, i32* [[Q:%.*]], i64 [[INDEX]]
566
+ ; CHECK-NEXT: [[STOP:%.*]] = load i32, i32* [[Q]], align 4
567
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp eq i32 [[STOP]], 0
568
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
569
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[FAILURE:%.*]]
570
+ ; CHECK: exit:
571
+ ; CHECK-NEXT: ret i32 0
572
+ ; CHECK: failure:
573
+ ; CHECK-NEXT: unreachable
574
+ ;
575
+ entry:
576
+ br label %loop
577
+
578
+ loop:
579
+ %iv = phi i32 [%start , %entry ], [%iv.next , %backedge ]
580
+ %iv.next = add i32 %iv , -1
581
+ %cond = icmp eq i32 %iv , 0
582
+ br i1 %cond , label %exit , label %backedge
583
+
584
+ backedge:
585
+ %index = zext i32 %iv.next to i64
586
+ %store.addr = getelementptr i32 , i32* %p , i64 %index
587
+ store i32 1 , i32* %store.addr
588
+ %load.addr = getelementptr i32 , i32* %q , i64 %index
589
+ %stop = load i32 , i32* %q
590
+ %loop.cond = icmp eq i32 %stop , 0
591
+ br i1 %loop.cond , label %loop , label %failure
592
+
593
+ exit:
594
+ ret i32 0
595
+
596
+ failure:
597
+ unreachable
598
+ }
0 commit comments