@@ -614,7 +614,7 @@ TEST_F(PatternMatchTest, BitCast) {
614
614
TEST_F (PatternMatchTest, CheckedInt) {
615
615
Type *I8Ty = IRB.getInt8Ty ();
616
616
const APInt *Res = nullptr ;
617
-
617
+ const Constant * CRes = nullptr ;
618
618
auto CheckUgt1 = [](const APInt &C) { return C.ugt (1 ); };
619
619
auto CheckTrue = [](const APInt &) { return true ; };
620
620
auto CheckFalse = [](const APInt &) { return false ; };
@@ -625,39 +625,49 @@ TEST_F(PatternMatchTest, CheckedInt) {
625
625
APInt APVal (8 , Val);
626
626
Constant *C = ConstantInt::get (I8Ty, Val);
627
627
628
+ CRes = nullptr ;
628
629
Res = nullptr ;
629
630
EXPECT_TRUE (m_CheckedInt (CheckTrue).match (C));
630
- EXPECT_TRUE (m_CheckedInt (Res, CheckTrue).match (C));
631
+ EXPECT_TRUE (m_CheckedInt (CRes, CheckTrue).match (C));
632
+ EXPECT_NE (CRes, nullptr );
633
+ EXPECT_TRUE (match (CRes, m_APIntAllowPoison (Res)));
631
634
EXPECT_EQ (*Res, APVal);
632
635
636
+ CRes = nullptr ;
633
637
Res = nullptr ;
634
638
EXPECT_FALSE (m_CheckedInt (CheckFalse).match (C));
635
- EXPECT_FALSE (m_CheckedInt (Res, CheckFalse).match (C));
639
+ EXPECT_FALSE (m_CheckedInt (CRes, CheckFalse).match (C));
640
+ EXPECT_EQ (CRes, nullptr );
636
641
642
+ CRes = nullptr ;
637
643
Res = nullptr ;
638
644
EXPECT_EQ (CheckUgt1 (APVal), m_CheckedInt (CheckUgt1).match (C));
639
- EXPECT_EQ (CheckUgt1 (APVal), m_CheckedInt (Res , CheckUgt1).match (C));
645
+ EXPECT_EQ (CheckUgt1 (APVal), m_CheckedInt (CRes , CheckUgt1).match (C));
640
646
if (CheckUgt1 (APVal)) {
641
- EXPECT_NE (Res, nullptr );
647
+ EXPECT_NE (CRes, nullptr );
648
+ EXPECT_TRUE (match (CRes, m_APIntAllowPoison (Res)));
642
649
EXPECT_EQ (*Res, APVal);
643
650
}
644
651
652
+ CRes = nullptr ;
645
653
Res = nullptr ;
646
654
EXPECT_EQ (CheckNonZero (APVal), m_CheckedInt (CheckNonZero).match (C));
647
- EXPECT_EQ (CheckNonZero (APVal), m_CheckedInt (Res , CheckNonZero).match (C));
655
+ EXPECT_EQ (CheckNonZero (APVal), m_CheckedInt (CRes , CheckNonZero).match (C));
648
656
if (CheckNonZero (APVal)) {
649
- EXPECT_NE (Res, nullptr );
657
+ EXPECT_NE (CRes, nullptr );
658
+ EXPECT_TRUE (match (CRes, m_APIntAllowPoison (Res)));
650
659
EXPECT_EQ (*Res, APVal);
651
660
}
652
661
662
+ CRes = nullptr ;
653
663
Res = nullptr ;
654
664
EXPECT_EQ (CheckPow2 (APVal), m_CheckedInt (CheckPow2).match (C));
655
- EXPECT_EQ (CheckPow2 (APVal), m_CheckedInt (Res , CheckPow2).match (C));
665
+ EXPECT_EQ (CheckPow2 (APVal), m_CheckedInt (CRes , CheckPow2).match (C));
656
666
if (CheckPow2 (APVal)) {
657
- EXPECT_NE (Res, nullptr );
667
+ EXPECT_NE (CRes, nullptr );
668
+ EXPECT_TRUE (match (CRes, m_APIntAllowPoison (Res)));
658
669
EXPECT_EQ (*Res, APVal);
659
670
}
660
-
661
671
};
662
672
663
673
DoScalarCheck (0 );
@@ -666,20 +676,20 @@ TEST_F(PatternMatchTest, CheckedInt) {
666
676
DoScalarCheck (3 );
667
677
668
678
EXPECT_FALSE (m_CheckedInt (CheckTrue).match (UndefValue::get (I8Ty)));
669
- EXPECT_FALSE (m_CheckedInt (Res , CheckTrue).match (UndefValue::get (I8Ty)));
670
- EXPECT_EQ (Res , nullptr );
679
+ EXPECT_FALSE (m_CheckedInt (CRes , CheckTrue).match (UndefValue::get (I8Ty)));
680
+ EXPECT_EQ (CRes , nullptr );
671
681
672
682
EXPECT_FALSE (m_CheckedInt (CheckFalse).match (UndefValue::get (I8Ty)));
673
- EXPECT_FALSE (m_CheckedInt (Res , CheckFalse).match (UndefValue::get (I8Ty)));
674
- EXPECT_EQ (Res , nullptr );
683
+ EXPECT_FALSE (m_CheckedInt (CRes , CheckFalse).match (UndefValue::get (I8Ty)));
684
+ EXPECT_EQ (CRes , nullptr );
675
685
676
686
EXPECT_FALSE (m_CheckedInt (CheckTrue).match (PoisonValue::get (I8Ty)));
677
- EXPECT_FALSE (m_CheckedInt (Res , CheckTrue).match (PoisonValue::get (I8Ty)));
678
- EXPECT_EQ (Res , nullptr );
687
+ EXPECT_FALSE (m_CheckedInt (CRes , CheckTrue).match (PoisonValue::get (I8Ty)));
688
+ EXPECT_EQ (CRes , nullptr );
679
689
680
690
EXPECT_FALSE (m_CheckedInt (CheckFalse).match (PoisonValue::get (I8Ty)));
681
- EXPECT_FALSE (m_CheckedInt (Res , CheckFalse).match (PoisonValue::get (I8Ty)));
682
- EXPECT_EQ (Res , nullptr );
691
+ EXPECT_FALSE (m_CheckedInt (CRes , CheckFalse).match (PoisonValue::get (I8Ty)));
692
+ EXPECT_EQ (CRes , nullptr );
683
693
684
694
auto DoVecCheckImpl = [&](ArrayRef<std::optional<int8_t >> Vals,
685
695
function_ref<bool (const APInt &)> CheckFn,
@@ -711,13 +721,16 @@ TEST_F(PatternMatchTest, CheckedInt) {
711
721
EXPECT_EQ (!(HasUndef && !UndefAsPoison) && Okay.value_or (false ),
712
722
m_CheckedInt (CheckFn).match (C));
713
723
724
+ CRes = nullptr ;
714
725
Res = nullptr ;
715
726
bool Expec =
716
- !(HasUndef && !UndefAsPoison) && AllSame && Okay.value_or (false );
717
- EXPECT_EQ (Expec, m_CheckedInt (Res , CheckFn).match (C));
727
+ !(HasUndef && !UndefAsPoison) && Okay.value_or (false );
728
+ EXPECT_EQ (Expec, m_CheckedInt (CRes , CheckFn).match (C));
718
729
if (Expec) {
719
- EXPECT_NE (Res, nullptr );
720
- EXPECT_EQ (*Res, *First);
730
+ EXPECT_NE (CRes, nullptr );
731
+ EXPECT_EQ (match (CRes, m_APIntAllowPoison (Res)), AllSame);
732
+ if (AllSame)
733
+ EXPECT_EQ (*Res, *First);
721
734
}
722
735
};
723
736
auto DoVecCheck = [&](ArrayRef<std::optional<int8_t >> Vals) {
@@ -1559,24 +1572,25 @@ TEST_F(PatternMatchTest, VectorUndefFloat) {
1559
1572
EXPECT_FALSE (match (VectorNaNPoison, m_CheckedFp (CheckNonNaN)));
1560
1573
1561
1574
const APFloat *C;
1575
+ const Constant *CC;
1562
1576
// Regardless of whether poison is allowed,
1563
1577
// a fully undef/poison constant does not match.
1564
1578
EXPECT_FALSE (match (ScalarUndef, m_APFloat (C)));
1565
1579
EXPECT_FALSE (match (ScalarUndef, m_APFloatForbidPoison (C)));
1566
1580
EXPECT_FALSE (match (ScalarUndef, m_APFloatAllowPoison (C)));
1567
- EXPECT_FALSE (match (ScalarUndef, m_CheckedFp (C , CheckTrue)));
1581
+ EXPECT_FALSE (match (ScalarUndef, m_CheckedFp (CC , CheckTrue)));
1568
1582
EXPECT_FALSE (match (VectorUndef, m_APFloat (C)));
1569
1583
EXPECT_FALSE (match (VectorUndef, m_APFloatForbidPoison (C)));
1570
1584
EXPECT_FALSE (match (VectorUndef, m_APFloatAllowPoison (C)));
1571
- EXPECT_FALSE (match (VectorUndef, m_CheckedFp (C , CheckTrue)));
1585
+ EXPECT_FALSE (match (VectorUndef, m_CheckedFp (CC , CheckTrue)));
1572
1586
EXPECT_FALSE (match (ScalarPoison, m_APFloat (C)));
1573
1587
EXPECT_FALSE (match (ScalarPoison, m_APFloatForbidPoison (C)));
1574
1588
EXPECT_FALSE (match (ScalarPoison, m_APFloatAllowPoison (C)));
1575
- EXPECT_FALSE (match (ScalarPoison, m_CheckedFp (C , CheckTrue)));
1589
+ EXPECT_FALSE (match (ScalarPoison, m_CheckedFp (CC , CheckTrue)));
1576
1590
EXPECT_FALSE (match (VectorPoison, m_APFloat (C)));
1577
1591
EXPECT_FALSE (match (VectorPoison, m_APFloatForbidPoison (C)));
1578
1592
EXPECT_FALSE (match (VectorPoison, m_APFloatAllowPoison (C)));
1579
- EXPECT_FALSE (match (VectorPoison, m_CheckedFp (C , CheckTrue)));
1593
+ EXPECT_FALSE (match (VectorPoison, m_CheckedFp (CC , CheckTrue)));
1580
1594
1581
1595
// We can always match simple constants and simple splats.
1582
1596
C = nullptr ;
@@ -1597,12 +1611,13 @@ TEST_F(PatternMatchTest, VectorUndefFloat) {
1597
1611
C = nullptr ;
1598
1612
EXPECT_TRUE (match (VectorZero, m_APFloatAllowPoison (C)));
1599
1613
EXPECT_TRUE (C->isZero ());
1600
- C = nullptr ;
1601
- EXPECT_TRUE (match (VectorZero, m_CheckedFp (C, CheckTrue)));
1602
- EXPECT_TRUE (C->isZero ());
1603
- C = nullptr ;
1604
- EXPECT_TRUE (match (VectorZero, m_CheckedFp (C, CheckNonNaN)));
1605
- EXPECT_TRUE (C->isZero ());
1614
+
1615
+ CC = nullptr ;
1616
+ EXPECT_TRUE (match (VectorZero, m_CheckedFp (CC, CheckTrue)));
1617
+ EXPECT_TRUE (CC->isNullValue ());
1618
+ CC = nullptr ;
1619
+ EXPECT_TRUE (match (VectorZero, m_CheckedFp (CC, CheckNonNaN)));
1620
+ EXPECT_TRUE (CC->isNullValue ());
1606
1621
1607
1622
// Splats with undef are never allowed.
1608
1623
// Whether splats with poison can be matched depends on the matcher.
@@ -1627,11 +1642,17 @@ TEST_F(PatternMatchTest, VectorUndefFloat) {
1627
1642
C = nullptr ;
1628
1643
EXPECT_TRUE (match (VectorZeroPoison, m_Finite (C)));
1629
1644
EXPECT_TRUE (C->isZero ());
1645
+ CC = nullptr ;
1630
1646
C = nullptr ;
1631
- EXPECT_TRUE (match (VectorZeroPoison, m_CheckedFp (C, CheckTrue)));
1647
+ EXPECT_TRUE (match (VectorZeroPoison, m_CheckedFp (CC, CheckTrue)));
1648
+ EXPECT_NE (CC, nullptr );
1649
+ EXPECT_TRUE (match (CC, m_APFloatAllowPoison (C)));
1632
1650
EXPECT_TRUE (C->isZero ());
1651
+ CC = nullptr ;
1633
1652
C = nullptr ;
1634
- EXPECT_TRUE (match (VectorZeroPoison, m_CheckedFp (C, CheckNonNaN)));
1653
+ EXPECT_TRUE (match (VectorZeroPoison, m_CheckedFp (CC, CheckNonNaN)));
1654
+ EXPECT_NE (CC, nullptr );
1655
+ EXPECT_TRUE (match (CC, m_APFloatAllowPoison (C)));
1635
1656
EXPECT_TRUE (C->isZero ());
1636
1657
}
1637
1658
0 commit comments