@@ -1330,3 +1330,137 @@ entry:
1330
1330
%cmp = icmp ult i8 %mul1 , %mul2
1331
1331
ret i1 %cmp
1332
1332
}
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