@@ -1456,6 +1456,131 @@ define <2 x i32> @select_icmp_slt0_xor_vec(<2 x i32> %x) {
1456
1456
ret <2 x i32 > %x.xor
1457
1457
}
1458
1458
1459
+ define i8 @select_icmp_eq_mul_and (i8 noundef %a , i8 %b ) {
1460
+ ; CHECK-LABEL: @select_icmp_eq_mul_and(
1461
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1462
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1463
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A]], -2
1464
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[DIV7]], [[DIV7]]
1465
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[B:%.*]]
1466
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1467
+ ;
1468
+ %1 = and i8 %a , 1
1469
+ %cmp = icmp eq i8 %1 , 0
1470
+ %div7 = and i8 %a , -2
1471
+ %mul = mul i8 %div7 , %div7
1472
+ %retval.0 = select i1 %cmp , i8 %mul , i8 %b
1473
+ ret i8 %retval.0
1474
+ }
1475
+
1476
+ define i8 @select_icmp_eq_shl_and (i8 noundef %a , i8 %b ) {
1477
+ ; CHECK-LABEL: @select_icmp_eq_shl_and(
1478
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1479
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1480
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A]], -2
1481
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[DIV7]], [[DIV7]]
1482
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[SHL]], i8 [[B:%.*]]
1483
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1484
+ ;
1485
+ %1 = and i8 %a , 1
1486
+ %cmp = icmp eq i8 %1 , 0
1487
+ %div7 = and i8 %a , -2
1488
+ %shl = shl i8 %div7 , %div7
1489
+ %retval.0 = select i1 %cmp , i8 %shl , i8 %b
1490
+ ret i8 %retval.0
1491
+ }
1492
+
1493
+ define i8 @select_icmp_eq_and (i8 noundef %a , i8 %b ) {
1494
+ ; CHECK-LABEL: @select_icmp_eq_and(
1495
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1496
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1497
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A]], -2
1498
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[DIV7]], i8 [[B:%.*]]
1499
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1500
+ ;
1501
+ %1 = and i8 %a , 1
1502
+ %cmp = icmp eq i8 %1 , 0
1503
+ %div7 = and i8 %a , -2
1504
+ %retval.0 = select i1 %cmp , i8 %div7 , i8 %b
1505
+ ret i8 %retval.0
1506
+ }
1507
+
1508
+ ;negative test
1509
+ define i8 @select_icmp_eq_mul_and_undef (i8 %a , i8 %b ) {
1510
+ ; CHECK-LABEL: @select_icmp_eq_mul_and_undef(
1511
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1512
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1513
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A]], -2
1514
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[DIV7]], [[DIV7]]
1515
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[B:%.*]]
1516
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1517
+ ;
1518
+ %1 = and i8 %a , 1
1519
+ %cmp = icmp eq i8 %1 , 0
1520
+ %div7 = and i8 %a , -2
1521
+ %mul = mul i8 %div7 , %div7
1522
+ %retval.0 = select i1 %cmp , i8 %mul , i8 %b
1523
+ ret i8 %retval.0
1524
+ }
1525
+
1526
+ ;negative test
1527
+ define i8 @select_icmp_eq_and_undef (i8 %a , i8 %b ) {
1528
+ ; CHECK-LABEL: @select_icmp_eq_and_undef(
1529
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1530
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1531
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A]], -2
1532
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[DIV7]], i8 [[B:%.*]]
1533
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1534
+ ;
1535
+ %1 = and i8 %a , 1
1536
+ %cmp = icmp eq i8 %1 , 0
1537
+ %div7 = and i8 %a , -2
1538
+ %retval.0 = select i1 %cmp , i8 %div7 , i8 %b
1539
+ ret i8 %retval.0
1540
+ }
1541
+
1542
+ ;negative test
1543
+ define i8 @select_and (i8 noundef %a , i8 %b , i1 %cmp ) {
1544
+ ; CHECK-LABEL: @select_and(
1545
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A:%.*]], -2
1546
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP:%.*]], i8 [[DIV7]], i8 [[B:%.*]]
1547
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1548
+ ;
1549
+ %div7 = and i8 %a , -2
1550
+ %retval.0 = select i1 %cmp , i8 %div7 , i8 %b
1551
+ ret i8 %retval.0
1552
+ }
1553
+
1554
+ ;negative test
1555
+ define i8 @select_mul_and (i8 noundef %a , i8 %b , i1 %cmp ) {
1556
+ ; CHECK-LABEL: @select_mul_and(
1557
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[A:%.*]], -2
1558
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[DIV7]], [[DIV7]]
1559
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP:%.*]], i8 [[MUL]], i8 [[B:%.*]]
1560
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1561
+ ;
1562
+ %div7 = and i8 %a , -2
1563
+ %mul = mul i8 %div7 , %div7
1564
+ %retval.0 = select i1 %cmp , i8 %mul , i8 %b
1565
+ ret i8 %retval.0
1566
+ }
1567
+
1568
+ ;negative test
1569
+ define i8 @select_icmp_eq_and_diff (i8 noundef %a , i8 %b , i8 %c ) {
1570
+ ; CHECK-LABEL: @select_icmp_eq_and_diff(
1571
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[A:%.*]], 1
1572
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
1573
+ ; CHECK-NEXT: [[DIV7:%.*]] = and i8 [[C:%.*]], -2
1574
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i8 [[DIV7]], i8 [[B:%.*]]
1575
+ ; CHECK-NEXT: ret i8 [[RETVAL_0]]
1576
+ ;
1577
+ %1 = and i8 %a , 1
1578
+ %cmp = icmp eq i8 %1 , 0
1579
+ %div7 = and i8 %c , -2
1580
+ %retval.0 = select i1 %cmp , i8 %div7 , i8 %b
1581
+ ret i8 %retval.0
1582
+ }
1583
+
1459
1584
define <4 x i32 > @canonicalize_to_shuffle (<4 x i32 > %a , <4 x i32 > %b ) {
1460
1585
; CHECK-LABEL: @canonicalize_to_shuffle(
1461
1586
; CHECK-NEXT: [[SEL:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 5, i32 6, i32 3>
0 commit comments