mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-27 13:40:43 +00:00
[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:
parent
78409abb65
commit
e30b1c0c22
@ -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(); }
|
||||
};
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user