@@ -1057,6 +1057,60 @@ check_failed:
1057
1057
ret i32 -1
1058
1058
}
1059
1059
1060
+ ; Check that fake wide exit doesn't inhibit the transform.
1061
+ define i16 @test_fake_wide_exit (i64 %x ) {
1062
+ ; CHECK-LABEL: define i16 @test_fake_wide_exit
1063
+ ; CHECK-SAME: (i64 [[X:%.*]]) {
1064
+ ; CHECK-NEXT: entry:
1065
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1066
+ ; CHECK: loop:
1067
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
1068
+ ; CHECK-NEXT: [[IV_WIDE:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[IV_WIDE_NEXT:%.*]], [[BACKEDGE]] ]
1069
+ ; CHECK-NEXT: [[RC:%.*]] = icmp slt i32 [[IV]], 100
1070
+ ; CHECK-NEXT: br i1 true, label [[CHECKED:%.*]], label [[CHECK_FAILED:%.*]]
1071
+ ; CHECK: checked:
1072
+ ; CHECK-NEXT: [[RC_WIDE:%.*]] = icmp ult i64 [[IV_WIDE]], [[X]]
1073
+ ; CHECK-NEXT: br i1 [[RC_WIDE]], label [[BACKEDGE]], label [[CHECK_FAILED]]
1074
+ ; CHECK: backedge:
1075
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1076
+ ; CHECK-NEXT: [[IV_WIDE_NEXT]] = add i64 [[IV_WIDE]], 1
1077
+ ; CHECK-NEXT: [[NARROW_IV:%.*]] = trunc i32 [[IV_NEXT]] to i16
1078
+ ; CHECK-NEXT: [[LATCH_COND:%.*]] = icmp slt i16 [[NARROW_IV]], 100
1079
+ ; CHECK-NEXT: br i1 [[LATCH_COND]], label [[LOOP]], label [[EXIT:%.*]]
1080
+ ; CHECK: exit:
1081
+ ; CHECK-NEXT: [[NARROW_IV_LCSSA:%.*]] = phi i16 [ [[NARROW_IV]], [[BACKEDGE]] ]
1082
+ ; CHECK-NEXT: ret i16 [[NARROW_IV_LCSSA]]
1083
+ ; CHECK: check_failed:
1084
+ ; CHECK-NEXT: ret i16 -1
1085
+ ;
1086
+ entry:
1087
+ br label %loop
1088
+
1089
+ loop:
1090
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %backedge ]
1091
+ %iv.wide = phi i64 [ 0 , %entry ], [ %iv.wide.next , %backedge ]
1092
+ %rc = icmp slt i32 %iv , 100
1093
+ br i1 %rc , label %checked , label %check_failed
1094
+
1095
+ checked:
1096
+ %rc.wide = icmp ult i64 %iv.wide , %x
1097
+ br i1 %rc.wide , label %backedge , label %check_failed
1098
+
1099
+ backedge:
1100
+ %iv.next = add i32 %iv , 1
1101
+ %iv.wide.next = add i64 %iv.wide , 1
1102
+ %narrow.iv = trunc i32 %iv.next to i16
1103
+ %latch.cond = icmp slt i16 %narrow.iv , 100
1104
+ br i1 %latch.cond , label %loop , label %exit
1105
+
1106
+ exit:
1107
+ ret i16 %narrow.iv
1108
+
1109
+ check_failed:
1110
+ ret i16 -1
1111
+ }
1112
+
1113
+
1060
1114
!0 = !{i32 0 , i32 2147483647 }
1061
1115
!1 = !{i64 0 , i64 9223372036854775807 }
1062
1116
!2 = !{i32 1 , i32 2147483647 }
0 commit comments