Skip to content

Commit 9824d5c

Browse files
committed
[Test] Add test showing that we fail to eliminate implied exit conditions
1 parent 568035a commit 9824d5c

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,4 +942,111 @@ leave:
942942
ret void
943943
}
944944

945+
declare i1 @cond_func()
946+
947+
define i32 @func_25(i32 %start) {
948+
; CHECK-LABEL: @func_25(
949+
; CHECK-NEXT: entry:
950+
; CHECK-NEXT: br label [[LOOP:%.*]]
951+
; CHECK: loop:
952+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
953+
; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[IV]], 0
954+
; CHECK-NEXT: br i1 [[C1]], label [[CHECKED_1:%.*]], label [[FAIL:%.*]]
955+
; CHECK: checked.1:
956+
; CHECK-NEXT: [[C2:%.*]] = icmp ne i32 [[IV]], 0
957+
; CHECK-NEXT: br i1 [[C2]], label [[CHECKED_2:%.*]], label [[FAIL]]
958+
; CHECK: checked.2:
959+
; CHECK-NEXT: [[C3:%.*]] = icmp ne i32 [[IV]], 0
960+
; CHECK-NEXT: br i1 [[C3]], label [[BACKEDGE]], label [[FAIL]]
961+
; CHECK: backedge:
962+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 758394
963+
; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond_func()
964+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
965+
; CHECK: fail:
966+
; CHECK-NEXT: unreachable
967+
; CHECK: exit:
968+
; CHECK-NEXT: [[IV_LCSSA1:%.*]] = phi i32 [ [[IV]], [[BACKEDGE]] ]
969+
; CHECK-NEXT: ret i32 [[IV_LCSSA1]]
970+
;
971+
entry:
972+
br label %loop
973+
974+
loop:
975+
%iv = phi i32 [%start, %entry], [%iv.next, %backedge]
976+
%c1 = icmp ne i32 %iv, 0
977+
br i1 %c1, label %checked.1, label %fail
978+
979+
checked.1:
980+
%c2 = icmp ne i32 %iv, 0
981+
br i1 %c2, label %checked.2, label %fail
982+
983+
checked.2:
984+
%c3 = icmp ne i32 %iv, 0
985+
br i1 %c3, label %backedge, label %fail
986+
987+
backedge:
988+
%iv.next = add i32 %iv, 758394
989+
%loop.cond = call i1 @cond_func()
990+
br i1 %loop.cond, label %loop, label %exit
991+
992+
fail:
993+
unreachable
994+
995+
exit:
996+
ret i32 %iv
997+
}
998+
999+
define i32 @func_26(i32 %start) {
1000+
; CHECK-LABEL: @func_26(
1001+
; CHECK-NEXT: entry:
1002+
; CHECK-NEXT: br label [[LOOP:%.*]]
1003+
; CHECK: loop:
1004+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
1005+
; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[IV]], 0
1006+
; CHECK-NEXT: br i1 [[C1]], label [[CHECKED_1:%.*]], label [[FAIL:%.*]]
1007+
; CHECK: checked.1:
1008+
; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[IV]], 1
1009+
; CHECK-NEXT: br i1 [[C2]], label [[CHECKED_2:%.*]], label [[FAIL]]
1010+
; CHECK: checked.2:
1011+
; CHECK-NEXT: [[C3:%.*]] = icmp slt i32 [[IV]], 2
1012+
; CHECK-NEXT: br i1 [[C3]], label [[BACKEDGE]], label [[FAIL]]
1013+
; CHECK: backedge:
1014+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 758394
1015+
; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond_func()
1016+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
1017+
; CHECK: fail:
1018+
; CHECK-NEXT: unreachable
1019+
; CHECK: exit:
1020+
; CHECK-NEXT: [[IV_LCSSA1:%.*]] = phi i32 [ [[IV]], [[BACKEDGE]] ]
1021+
; CHECK-NEXT: ret i32 [[IV_LCSSA1]]
1022+
;
1023+
entry:
1024+
br label %loop
1025+
1026+
loop:
1027+
%iv = phi i32 [%start, %entry], [%iv.next, %backedge]
1028+
%c1 = icmp slt i32 %iv, 0
1029+
br i1 %c1, label %checked.1, label %fail
1030+
1031+
checked.1:
1032+
%c2 = icmp slt i32 %iv, 1
1033+
br i1 %c2, label %checked.2, label %fail
1034+
1035+
checked.2:
1036+
%c3 = icmp slt i32 %iv, 2
1037+
br i1 %c3, label %backedge, label %fail
1038+
1039+
backedge:
1040+
%iv.next = add i32 %iv, 758394
1041+
%loop.cond = call i1 @cond_func()
1042+
br i1 %loop.cond, label %loop, label %exit
1043+
1044+
fail:
1045+
unreachable
1046+
1047+
exit:
1048+
ret i32 %iv
1049+
}
1050+
1051+
9451052
!0 = !{i32 0, i32 2147483647}

0 commit comments

Comments
 (0)