@@ -1302,9 +1302,9 @@ define i1 @lshr_neg_sgt_zero(i8 %x) {
1302
1302
1303
1303
define i1 @exactly_one_set_signbit (i8 %x , i8 %y ) {
1304
1304
; CHECK-LABEL: @exactly_one_set_signbit(
1305
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1306
- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1307
- ; CHECK-NEXT: ret i1 [[R ]]
1305
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1306
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1307
+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
1308
1308
;
1309
1309
%xsign = lshr i8 %x , 7
1310
1310
%ypos = icmp sgt i8 %y , -1
@@ -1317,9 +1317,9 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
1317
1317
; CHECK-LABEL: @exactly_one_set_signbit_use1(
1318
1318
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1319
1319
; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1320
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X]], [[Y:%.*]]
1321
- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1322
- ; CHECK-NEXT: ret i1 [[R ]]
1320
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X]], [[Y:%.*]]
1321
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1322
+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
1323
1323
;
1324
1324
%xsign = lshr i8 %x , 7
1325
1325
call void @use (i8 %xsign )
@@ -1331,9 +1331,9 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
1331
1331
1332
1332
define <2 x i1 > @same_signbit (<2 x i8 > %x , <2 x i8 > %y ) {
1333
1333
; CHECK-LABEL: @same_signbit(
1334
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1335
- ; CHECK-NEXT: [[R :%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS ]], <i8 -1, i8 -1>
1336
- ; CHECK-NEXT: ret <2 x i1> [[R ]]
1334
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1335
+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt <2 x i8> [[TMP1 ]], <i8 -1, i8 -1>
1336
+ ; CHECK-NEXT: ret <2 x i1> [[R1 ]]
1337
1337
;
1338
1338
%xsign = lshr <2 x i8 > %x , <i8 7 , i8 7 >
1339
1339
%ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 -1 >
@@ -1347,9 +1347,9 @@ define i1 @same_signbit_use2(i8 %x, i8 %y) {
1347
1347
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1348
1348
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1349
1349
; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1350
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y]]
1351
- ; CHECK-NEXT: [[R :%.*]] = icmp sgt i8 [[XOR_SIGNBITS ]], -1
1352
- ; CHECK-NEXT: ret i1 [[R ]]
1350
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y]]
1351
+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt i8 [[TMP1 ]], -1
1352
+ ; CHECK-NEXT: ret i1 [[R1 ]]
1353
1353
;
1354
1354
%xsign = lshr i8 %x , 7
1355
1355
%ypos = icmp sgt i8 %y , -1
@@ -1382,9 +1382,10 @@ define i1 @same_signbit_use3(i8 %x, i8 %y) {
1382
1382
1383
1383
define <2 x i1 > @same_signbit_poison_elts (<2 x i8 > %x , <2 x i8 > %y ) {
1384
1384
; CHECK-LABEL: @same_signbit_poison_elts(
1385
- ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1386
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1387
- ; CHECK-NEXT: ret <2 x i1> [[R]]
1385
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 poison>
1386
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <2 x i8> [[X:%.*]], zeroinitializer
1387
+ ; CHECK-NEXT: [[R1:%.*]] = xor <2 x i1> [[TMP1]], [[YPOS]]
1388
+ ; CHECK-NEXT: ret <2 x i1> [[R1]]
1388
1389
;
1389
1390
%xsign = lshr <2 x i8 > %x , <i8 7 , i8 poison>
1390
1391
%ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 poison>
@@ -1397,11 +1398,10 @@ define <2 x i1> @same_signbit_poison_elts(<2 x i8> %x, <2 x i8> %y) {
1397
1398
1398
1399
define i1 @same_signbit_wrong_type (i8 %x , i32 %y ) {
1399
1400
; CHECK-LABEL: @same_signbit_wrong_type(
1400
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1401
1401
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i32 [[Y:%.*]], -1
1402
- ; CHECK-NEXT: [[YPOSZ :%.*]] = zext i1 [[YPOS]] to i8
1403
- ; CHECK-NEXT: [[R :%.*]] = icmp ne i8 [[XSIGN ]], [[YPOSZ ]]
1404
- ; CHECK-NEXT: ret i1 [[R ]]
1402
+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i8 [[X:%.*]], 0
1403
+ ; CHECK-NEXT: [[R1 :%.*]] = xor i1 [[TMP1 ]], [[YPOS ]]
1404
+ ; CHECK-NEXT: ret i1 [[R1 ]]
1405
1405
;
1406
1406
%xsign = lshr i8 %x , 7
1407
1407
%ypos = icmp sgt i32 %y , -1
@@ -1450,11 +1450,9 @@ define i1 @exactly_one_set_signbit_wrong_shr(i8 %x, i8 %y) {
1450
1450
1451
1451
define i1 @exactly_one_set_signbit_wrong_pred (i8 %x , i8 %y ) {
1452
1452
; CHECK-LABEL: @exactly_one_set_signbit_wrong_pred(
1453
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1454
- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1455
- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1456
- ; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[XSIGN]], [[YPOSZ]]
1457
- ; CHECK-NEXT: ret i1 [[R]]
1453
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], [[X:%.*]]
1454
+ ; CHECK-NEXT: [[R1:%.*]] = icmp slt i8 [[TMP1]], 0
1455
+ ; CHECK-NEXT: ret i1 [[R1]]
1458
1456
;
1459
1457
%xsign = lshr i8 %x , 7
1460
1458
%ypos = icmp sgt i8 %y , -1
@@ -1465,9 +1463,9 @@ define i1 @exactly_one_set_signbit_wrong_pred(i8 %x, i8 %y) {
1465
1463
1466
1464
define i1 @exactly_one_set_signbit_signed (i8 %x , i8 %y ) {
1467
1465
; CHECK-LABEL: @exactly_one_set_signbit_signed(
1468
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1469
- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1470
- ; CHECK-NEXT: ret i1 [[R ]]
1466
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1467
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1468
+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
1471
1469
;
1472
1470
%xsign = ashr i8 %x , 7
1473
1471
%ypos = icmp sgt i8 %y , -1
@@ -1480,9 +1478,9 @@ define i1 @exactly_one_set_signbit_use1_signed(i8 %x, i8 %y) {
1480
1478
; CHECK-LABEL: @exactly_one_set_signbit_use1_signed(
1481
1479
; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
1482
1480
; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1483
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X]], [[Y:%.*]]
1484
- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1485
- ; CHECK-NEXT: ret i1 [[R ]]
1481
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X]], [[Y:%.*]]
1482
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1483
+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
1486
1484
;
1487
1485
%xsign = ashr i8 %x , 7
1488
1486
call void @use (i8 %xsign )
@@ -1494,9 +1492,9 @@ define i1 @exactly_one_set_signbit_use1_signed(i8 %x, i8 %y) {
1494
1492
1495
1493
define <2 x i1 > @same_signbit_signed (<2 x i8 > %x , <2 x i8 > %y ) {
1496
1494
; CHECK-LABEL: @same_signbit_signed(
1497
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1498
- ; CHECK-NEXT: [[R :%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS ]], <i8 -1, i8 -1>
1499
- ; CHECK-NEXT: ret <2 x i1> [[R ]]
1495
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1496
+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt <2 x i8> [[TMP1 ]], <i8 -1, i8 -1>
1497
+ ; CHECK-NEXT: ret <2 x i1> [[R1 ]]
1500
1498
;
1501
1499
%xsign = ashr <2 x i8 > %x , <i8 7 , i8 7 >
1502
1500
%ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 -1 >
@@ -1510,9 +1508,9 @@ define i1 @same_signbit_use2_signed(i8 %x, i8 %y) {
1510
1508
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1511
1509
; CHECK-NEXT: [[YPOSZ:%.*]] = sext i1 [[YPOS]] to i8
1512
1510
; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1513
- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y]]
1514
- ; CHECK-NEXT: [[R :%.*]] = icmp sgt i8 [[XOR_SIGNBITS ]], -1
1515
- ; CHECK-NEXT: ret i1 [[R ]]
1511
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y]]
1512
+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt i8 [[TMP1 ]], -1
1513
+ ; CHECK-NEXT: ret i1 [[R1 ]]
1516
1514
;
1517
1515
%xsign = ashr i8 %x , 7
1518
1516
%ypos = icmp sgt i8 %y , -1
@@ -1545,9 +1543,10 @@ define i1 @same_signbit_use3_signed(i8 %x, i8 %y) {
1545
1543
1546
1544
define <2 x i1 > @same_signbit_poison_elts_signed (<2 x i8 > %x , <2 x i8 > %y ) {
1547
1545
; CHECK-LABEL: @same_signbit_poison_elts_signed(
1548
- ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1549
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1550
- ; CHECK-NEXT: ret <2 x i1> [[R]]
1546
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 poison>
1547
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <2 x i8> [[X:%.*]], zeroinitializer
1548
+ ; CHECK-NEXT: [[R1:%.*]] = xor <2 x i1> [[TMP1]], [[YPOS]]
1549
+ ; CHECK-NEXT: ret <2 x i1> [[R1]]
1551
1550
;
1552
1551
%xsign = ashr <2 x i8 > %x , <i8 7 , i8 poison>
1553
1552
%ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 poison>
@@ -1560,11 +1559,10 @@ define <2 x i1> @same_signbit_poison_elts_signed(<2 x i8> %x, <2 x i8> %y) {
1560
1559
1561
1560
define i1 @same_signbit_wrong_type_signed (i8 %x , i32 %y ) {
1562
1561
; CHECK-LABEL: @same_signbit_wrong_type_signed(
1563
- ; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
1564
1562
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i32 [[Y:%.*]], -1
1565
- ; CHECK-NEXT: [[YPOSZ :%.*]] = sext i1 [[YPOS]] to i8
1566
- ; CHECK-NEXT: [[R :%.*]] = icmp ne i8 [[XSIGN ]], [[YPOSZ ]]
1567
- ; CHECK-NEXT: ret i1 [[R ]]
1563
+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i8 [[X:%.*]], 0
1564
+ ; CHECK-NEXT: [[R1 :%.*]] = xor i1 [[TMP1 ]], [[YPOS ]]
1565
+ ; CHECK-NEXT: ret i1 [[R1 ]]
1568
1566
;
1569
1567
%xsign = ashr i8 %x , 7
1570
1568
%ypos = icmp sgt i32 %y , -1
@@ -1589,3 +1587,80 @@ define i1 @exactly_one_set_signbit_wrong_shamt_signed(i8 %x, i8 %y) {
1589
1587
%r = icmp eq i8 %xsign , %yposz
1590
1588
ret i1 %r
1591
1589
}
1590
+
1591
+ define i1 @slt_zero_ult_i1 (i32 %a , i1 %b ) {
1592
+ ; CHECK-LABEL: @slt_zero_ult_i1(
1593
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0
1594
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[B:%.*]], true
1595
+ ; CHECK-NEXT: [[CMP21:%.*]] = and i1 [[TMP1]], [[TMP2]]
1596
+ ; CHECK-NEXT: ret i1 [[CMP21]]
1597
+ ;
1598
+ %conv = zext i1 %b to i32
1599
+ %cmp1 = lshr i32 %a , 31
1600
+ %cmp2 = icmp ult i32 %conv , %cmp1
1601
+ ret i1 %cmp2
1602
+ }
1603
+
1604
+ define i1 @slt_zero_ult_i1_fail1 (i32 %a , i1 %b ) {
1605
+ ; CHECK-LABEL: @slt_zero_ult_i1_fail1(
1606
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[B:%.*]] to i32
1607
+ ; CHECK-NEXT: [[CMP1:%.*]] = lshr i32 [[A:%.*]], 30
1608
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[CMP1]], [[CONV]]
1609
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1610
+ ;
1611
+ %conv = zext i1 %b to i32
1612
+ %cmp1 = lshr i32 %a , 30
1613
+ %cmp2 = icmp ult i32 %conv , %cmp1
1614
+ ret i1 %cmp2
1615
+ }
1616
+
1617
+ define i1 @slt_zero_ult_i1_fail2 (i32 %a , i1 %b ) {
1618
+ ; CHECK-LABEL: @slt_zero_ult_i1_fail2(
1619
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[B:%.*]] to i32
1620
+ ; CHECK-NEXT: [[CMP1:%.*]] = ashr i32 [[A:%.*]], 31
1621
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[CMP1]], [[CONV]]
1622
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1623
+ ;
1624
+ %conv = zext i1 %b to i32
1625
+ %cmp1 = ashr i32 %a , 31
1626
+ %cmp2 = icmp ult i32 %conv , %cmp1
1627
+ ret i1 %cmp2
1628
+ }
1629
+
1630
+ define i1 @slt_zero_slt_i1_fail (i32 %a , i1 %b ) {
1631
+ ; CHECK-LABEL: @slt_zero_slt_i1_fail(
1632
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0
1633
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[B:%.*]], true
1634
+ ; CHECK-NEXT: [[CMP21:%.*]] = and i1 [[TMP1]], [[TMP2]]
1635
+ ; CHECK-NEXT: ret i1 [[CMP21]]
1636
+ ;
1637
+ %conv = zext i1 %b to i32
1638
+ %cmp1 = lshr i32 %a , 31
1639
+ %cmp2 = icmp slt i32 %conv , %cmp1
1640
+ ret i1 %cmp2
1641
+ }
1642
+
1643
+ define i1 @slt_zero_eq_i1_signed (i32 %a , i1 %b ) {
1644
+ ; CHECK-LABEL: @slt_zero_eq_i1_signed(
1645
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1
1646
+ ; CHECK-NEXT: [[CMP21:%.*]] = xor i1 [[TMP1]], [[B:%.*]]
1647
+ ; CHECK-NEXT: ret i1 [[CMP21]]
1648
+ ;
1649
+ %conv = sext i1 %b to i32
1650
+ %cmp1 = ashr i32 %a , 31
1651
+ %cmp2 = icmp eq i32 %conv , %cmp1
1652
+ ret i1 %cmp2
1653
+ }
1654
+
1655
+ define i1 @slt_zero_eq_i1_fail_signed (i32 %a , i1 %b ) {
1656
+ ; CHECK-LABEL: @slt_zero_eq_i1_fail_signed(
1657
+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[B:%.*]] to i32
1658
+ ; CHECK-NEXT: [[CMP1:%.*]] = lshr i32 [[A:%.*]], 31
1659
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[CMP1]], [[CONV]]
1660
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1661
+ ;
1662
+ %conv = sext i1 %b to i32
1663
+ %cmp1 = lshr i32 %a , 31
1664
+ %cmp2 = icmp eq i32 %conv , %cmp1
1665
+ ret i1 %cmp2
1666
+ }
0 commit comments