@@ -544,3 +544,55 @@ define i32 @test10(i32 %v) {
544544 leave:
545545 ret i32 22
546546}
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