@@ -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