@@ -942,4 +942,111 @@ leave:
942
942
ret void
943
943
}
944
944
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
+
945
1052
!0 = !{i32 0 , i32 2147483647 }
0 commit comments