Skip to content

Commit 0c009e0

Browse files
committed
[Test] Add test showing that we can avoid inserting trunc/zext
1 parent 5a3f6bf commit 0c009e0

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)