[IR][Patternmatch] Add m_SpecificInt_ULT() predicate

Summary:
Match an integer or vector with every element unsigned less than the
Threshold. For vectors, this includes constants with undefined elements.

FIXME: is it worth generalizing this to simply take ICmpInst::Predicate?

Reviewers: craig.topper, spatel, nikic

Reviewed By: spatel

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D63811

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364711 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Roman Lebedev 2019-06-29 11:51:37 +00:00
parent 78409abb65
commit e30b1c0c22
2 changed files with 35 additions and 0 deletions

View File

@ -418,6 +418,20 @@ inline cst_pred_ty<is_lowbit_mask> m_LowBitMask() {
return cst_pred_ty<is_lowbit_mask>();
}
struct is_unsigned_less_than {
const APInt *Thr;
bool isValue(const APInt &C) { return C.ult(*Thr); }
};
/// Match an integer or vector with every element unsigned less than the
/// Threshold. For vectors, this includes constants with undefined elements.
/// FIXME: is it worth generalizing this to simply take ICmpInst::Predicate?
inline cst_pred_ty<is_unsigned_less_than>
m_SpecificInt_ULT(const APInt &Threshold) {
cst_pred_ty<is_unsigned_less_than> P;
P.Thr = &Threshold;
return P;
}
struct is_nan {
bool isValue(const APFloat &C) { return C.isNaN(); }
};

View File

@ -64,6 +64,27 @@ TEST_F(PatternMatchTest, OneUse) {
EXPECT_FALSE(m_OneUse(m_Value()).match(Leaf));
}
TEST_F(PatternMatchTest, SpecificIntULT) {
Type *IntTy = IRB.getInt32Ty();
unsigned BitWidth = IntTy->getScalarSizeInBits();
Value *Zero = ConstantInt::get(IntTy, 0);
Value *One = ConstantInt::get(IntTy, 1);
Value *NegOne = ConstantInt::get(IntTy, -1);
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, 0)).match(Zero));
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, 0)).match(One));
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, 0)).match(NegOne));
EXPECT_TRUE(m_SpecificInt_ULT(APInt(BitWidth, 1)).match(Zero));
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, 1)).match(One));
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, 1)).match(NegOne));
EXPECT_TRUE(m_SpecificInt_ULT(APInt(BitWidth, -1)).match(Zero));
EXPECT_TRUE(m_SpecificInt_ULT(APInt(BitWidth, -1)).match(One));
EXPECT_FALSE(m_SpecificInt_ULT(APInt(BitWidth, -1)).match(NegOne));
}
TEST_F(PatternMatchTest, CommutativeDeferredValue) {
Value *X = IRB.getInt32(1);
Value *Y = IRB.getInt32(2);