@@ -1235,6 +1235,126 @@ define i1 @neg_icmp_eq_range_call() {
12351235 ret i1 %cmp
12361236}
12371237
1238+ define i16 @return_range_for_edge_value_zext (i8 %a ) {
1239+ ; CHECK-LABEL: define range(i16 0, 98) i16 @return_range_for_edge_value_zext(
1240+ ; CHECK-SAME: i8 [[A:%.*]]) {
1241+ ; CHECK-NEXT: [[ENTRY:.*:]]
1242+ ; CHECK-NEXT: [[B:%.*]] = zext i8 [[A]] to i16
1243+ ; CHECK-NEXT: br label %[[DISPATCH:.*]]
1244+ ; CHECK: [[DISPATCH]]:
1245+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A]], 98
1246+ ; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
1247+ ; CHECK: [[TARGET]]:
1248+ ; CHECK-NEXT: ret i16 [[B]]
1249+ ;
1250+ entry:
1251+ %b = zext i8 %a to i16
1252+ br label %dispatch
1253+
1254+ dispatch:
1255+ %cmp = icmp ult i8 %a , 98
1256+ br i1 %cmp , label %target , label %dispatch
1257+
1258+ target:
1259+ ret i16 %b
1260+ }
1261+
1262+ define i16 @return_range_for_edge_value_sext (i8 %a ) {
1263+ ; CHECK-LABEL: define range(i16 -55, 0) i16 @return_range_for_edge_value_sext(
1264+ ; CHECK-SAME: i8 [[A:%.*]]) {
1265+ ; CHECK-NEXT: [[ENTRY:.*:]]
1266+ ; CHECK-NEXT: [[B:%.*]] = sext i8 [[A]] to i16
1267+ ; CHECK-NEXT: br label %[[DISPATCH:.*]]
1268+ ; CHECK: [[DISPATCH]]:
1269+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[A]], -56
1270+ ; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
1271+ ; CHECK: [[TARGET]]:
1272+ ; CHECK-NEXT: ret i16 [[B]]
1273+ ;
1274+ entry:
1275+ %b = sext i8 %a to i16
1276+ br label %dispatch
1277+
1278+ dispatch:
1279+ %cmp = icmp ugt i8 %a , -56
1280+ br i1 %cmp , label %target , label %dispatch
1281+
1282+ target:
1283+ ret i16 %b
1284+ }
1285+
1286+ define i8 @return_range_for_edge_value_trunc (i16 %a ) {
1287+ ; CHECK-LABEL: define range(i8 0, 98) i8 @return_range_for_edge_value_trunc(
1288+ ; CHECK-SAME: i16 [[A:%.*]]) {
1289+ ; CHECK-NEXT: [[ENTRY:.*:]]
1290+ ; CHECK-NEXT: [[B:%.*]] = trunc i16 [[A]] to i8
1291+ ; CHECK-NEXT: br label %[[DISPATCH:.*]]
1292+ ; CHECK: [[DISPATCH]]:
1293+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[A]], 98
1294+ ; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
1295+ ; CHECK: [[TARGET]]:
1296+ ; CHECK-NEXT: ret i8 [[B]]
1297+ ;
1298+ entry:
1299+ %b = trunc i16 %a to i8
1300+ br label %dispatch
1301+
1302+ dispatch:
1303+ %cmp = icmp ult i16 %a , 98
1304+ br i1 %cmp , label %target , label %dispatch
1305+
1306+ target:
1307+ ret i8 %b
1308+ }
1309+
1310+ define i8 @neg_return_range_for_edge_value_trunc (i16 %a ) {
1311+ ; CHECK-LABEL: define i8 @neg_return_range_for_edge_value_trunc(
1312+ ; CHECK-SAME: i16 [[A:%.*]]) {
1313+ ; CHECK-NEXT: [[ENTRY:.*:]]
1314+ ; CHECK-NEXT: [[B:%.*]] = trunc i16 [[A]] to i8
1315+ ; CHECK-NEXT: br label %[[DISPATCH:.*]]
1316+ ; CHECK: [[DISPATCH]]:
1317+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i16 [[A]], 200
1318+ ; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
1319+ ; CHECK: [[TARGET]]:
1320+ ; CHECK-NEXT: ret i8 [[B]]
1321+ ;
1322+ entry:
1323+ %b = trunc i16 %a to i8
1324+ br label %dispatch
1325+
1326+ dispatch:
1327+ %cmp = icmp ugt i16 %a , 200
1328+ br i1 %cmp , label %target , label %dispatch
1329+
1330+ target:
1331+ ret i8 %b
1332+ }
1333+
1334+ define i8 @return_range_for_edge_value_trunc_nuw (i16 %a ) {
1335+ ; CHECK-LABEL: define range(i8 -55, 0) i8 @return_range_for_edge_value_trunc_nuw(
1336+ ; CHECK-SAME: i16 [[A:%.*]]) {
1337+ ; CHECK-NEXT: [[ENTRY:.*:]]
1338+ ; CHECK-NEXT: [[B:%.*]] = trunc nuw i16 [[A]] to i8
1339+ ; CHECK-NEXT: br label %[[DISPATCH:.*]]
1340+ ; CHECK: [[DISPATCH]]:
1341+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i16 [[A]], 200
1342+ ; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
1343+ ; CHECK: [[TARGET]]:
1344+ ; CHECK-NEXT: ret i8 [[B]]
1345+ ;
1346+ entry:
1347+ %b = trunc nuw i16 %a to i8
1348+ br label %dispatch
1349+
1350+ dispatch:
1351+ %cmp = icmp ugt i16 %a , 200
1352+ br i1 %cmp , label %target , label %dispatch
1353+
1354+ target:
1355+ ret i8 %b
1356+ }
1357+
12381358declare i16 @llvm.ctlz.i16 (i16 , i1 )
12391359declare i16 @llvm.cttz.i16 (i16 , i1 )
12401360declare i16 @llvm.ctpop.i16 (i16 )
0 commit comments