@@ -1330,3 +1330,137 @@ entry:
13301330 %cmp = icmp ult i8 %mul1 , %mul2
13311331 ret i1 %cmp
13321332}
1333+
1334+ define i1 @icmp_mul_nsw_slt (i8 %x , i8 %y ) {
1335+ ; CHECK-LABEL: @icmp_mul_nsw_slt(
1336+ ; CHECK-NEXT: entry:
1337+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
1338+ ; CHECK-NEXT: ret i1 [[CMP]]
1339+ ;
1340+ entry:
1341+ %mul1 = mul nsw i8 %x , 7
1342+ %mul2 = mul nsw i8 %y , 7
1343+ %cmp = icmp slt i8 %mul1 , %mul2
1344+ ret i1 %cmp
1345+ }
1346+
1347+ define i1 @icmp_mul_nsw_sle (i8 %x , i8 %y ) {
1348+ ; CHECK-LABEL: @icmp_mul_nsw_sle(
1349+ ; CHECK-NEXT: entry:
1350+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
1351+ ; CHECK-NEXT: ret i1 [[CMP]]
1352+ ;
1353+ entry:
1354+ %mul1 = mul nsw i8 %x , 7
1355+ %mul2 = mul nsw i8 %y , 7
1356+ %cmp = icmp sle i8 %mul1 , %mul2
1357+ ret i1 %cmp
1358+ }
1359+
1360+ define i1 @icmp_mul_nsw_sgt (i8 %x , i8 %y ) {
1361+ ; CHECK-LABEL: @icmp_mul_nsw_sgt(
1362+ ; CHECK-NEXT: entry:
1363+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1364+ ; CHECK-NEXT: ret i1 [[CMP]]
1365+ ;
1366+ entry:
1367+ %mul1 = mul nsw i8 %x , 7
1368+ %mul2 = mul nsw i8 %y , 7
1369+ %cmp = icmp sgt i8 %mul1 , %mul2
1370+ ret i1 %cmp
1371+ }
1372+
1373+ define i1 @icmp_mul_nsw_sge (i8 %x , i8 %y ) {
1374+ ; CHECK-LABEL: @icmp_mul_nsw_sge(
1375+ ; CHECK-NEXT: entry:
1376+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
1377+ ; CHECK-NEXT: ret i1 [[CMP]]
1378+ ;
1379+ entry:
1380+ %mul1 = mul nsw i8 %x , 7
1381+ %mul2 = mul nsw i8 %y , 7
1382+ %cmp = icmp sge i8 %mul1 , %mul2
1383+ ret i1 %cmp
1384+ }
1385+
1386+ define i1 @icmp_mul_nsw_slt_neg (i8 %x , i8 %y ) {
1387+ ; CHECK-LABEL: @icmp_mul_nsw_slt_neg(
1388+ ; CHECK-NEXT: entry:
1389+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1390+ ; CHECK-NEXT: ret i1 [[CMP]]
1391+ ;
1392+ entry:
1393+ %mul1 = mul nsw i8 %x , -7
1394+ %mul2 = mul nsw i8 %y , -7
1395+ %cmp = icmp slt i8 %mul1 , %mul2
1396+ ret i1 %cmp
1397+ }
1398+
1399+ define i1 @icmp_mul_nsw_slt_neg_var (i8 %x , i8 %y , i8 %z ) {
1400+ ; CHECK-LABEL: @icmp_mul_nsw_slt_neg_var(
1401+ ; CHECK-NEXT: entry:
1402+ ; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[Z:%.*]], 0
1403+ ; CHECK-NEXT: call void @llvm.assume(i1 [[COND]])
1404+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1405+ ; CHECK-NEXT: ret i1 [[CMP]]
1406+ ;
1407+ entry:
1408+ %cond = icmp slt i8 %z , 0
1409+ call void @llvm.assume (i1 %cond )
1410+ %mul1 = mul nsw i8 %x , %z
1411+ %mul2 = mul nsw i8 %y , %z
1412+ %cmp = icmp slt i8 %mul1 , %mul2
1413+ ret i1 %cmp
1414+ }
1415+
1416+ ; Negative tests
1417+
1418+ define i1 @icmp_mul_nonsw_slt (i8 %x , i8 %y ) {
1419+ ; CHECK-LABEL: @icmp_mul_nonsw_slt(
1420+ ; CHECK-NEXT: entry:
1421+ ; CHECK-NEXT: [[MUL1:%.*]] = mul i8 [[X:%.*]], 7
1422+ ; CHECK-NEXT: [[MUL2:%.*]] = mul nsw i8 [[Y:%.*]], 7
1423+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[MUL1]], [[MUL2]]
1424+ ; CHECK-NEXT: ret i1 [[CMP]]
1425+ ;
1426+ entry:
1427+ %mul1 = mul i8 %x , 7
1428+ %mul2 = mul nsw i8 %y , 7
1429+ %cmp = icmp slt i8 %mul1 , %mul2
1430+ ret i1 %cmp
1431+ }
1432+
1433+ define i1 @icmp_mul_nsw_slt_unknown_sign (i8 %x , i8 %y , i8 %z ) {
1434+ ; CHECK-LABEL: @icmp_mul_nsw_slt_unknown_sign(
1435+ ; CHECK-NEXT: entry:
1436+ ; CHECK-NEXT: [[MUL1:%.*]] = mul nsw i8 [[X:%.*]], [[Z:%.*]]
1437+ ; CHECK-NEXT: [[MUL2:%.*]] = mul nsw i8 [[Y:%.*]], [[Z]]
1438+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[MUL1]], [[MUL2]]
1439+ ; CHECK-NEXT: ret i1 [[CMP]]
1440+ ;
1441+ entry:
1442+ %mul1 = mul nsw i8 %x , %z
1443+ %mul2 = mul nsw i8 %y , %z
1444+ %cmp = icmp slt i8 %mul1 , %mul2
1445+ ret i1 %cmp
1446+ }
1447+
1448+ define i1 @icmp_mul_nsw_slt_may_be_zero (i8 %x , i8 %y , i8 %z ) {
1449+ ; CHECK-LABEL: @icmp_mul_nsw_slt_may_be_zero(
1450+ ; CHECK-NEXT: entry:
1451+ ; CHECK-NEXT: [[COND:%.*]] = icmp sgt i8 [[Z:%.*]], -1
1452+ ; CHECK-NEXT: call void @llvm.assume(i1 [[COND]])
1453+ ; CHECK-NEXT: [[MUL1:%.*]] = mul nsw i8 [[X:%.*]], [[Z]]
1454+ ; CHECK-NEXT: [[MUL2:%.*]] = mul nsw i8 [[Y:%.*]], [[Z]]
1455+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[MUL1]], [[MUL2]]
1456+ ; CHECK-NEXT: ret i1 [[CMP]]
1457+ ;
1458+ entry:
1459+ %cond = icmp sgt i8 %z , -1
1460+ call void @llvm.assume (i1 %cond )
1461+
1462+ %mul1 = mul nsw i8 %x , %z
1463+ %mul2 = mul nsw i8 %y , %z
1464+ %cmp = icmp slt i8 %mul1 , %mul2
1465+ ret i1 %cmp
1466+ }
0 commit comments