[llvm] r373128 - [PatternMatch] Add m_SExtOrSelf(), m_ZExtOrSExtOrSelf() matchers + unittests
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 27 14:53:04 PDT 2019
Author: lebedevri
Date: Fri Sep 27 14:53:04 2019
New Revision: 373128
URL: http://llvm.org/viewvc/llvm-project?rev=373128&view=rev
Log:
[PatternMatch] Add m_SExtOrSelf(), m_ZExtOrSExtOrSelf() matchers + unittests
m_SExtOrSelf() is for consistency.
m_ZExtOrSExtOrSelf() is motivated by the D68103/r373106 :
sometimes it is useful to look past any extensions of the shift amount,
and m_ZExtOrSExtOrSelf() may be exactly the tool to do that.
Modified:
llvm/trunk/include/llvm/IR/PatternMatch.h
llvm/trunk/unittests/IR/PatternMatch.cpp
Modified: llvm/trunk/include/llvm/IR/PatternMatch.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PatternMatch.h?rev=373128&r1=373127&r2=373128&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/PatternMatch.h (original)
+++ llvm/trunk/include/llvm/IR/PatternMatch.h Fri Sep 27 14:53:04 2019
@@ -1320,12 +1320,27 @@ m_ZExtOrSelf(const OpTy &Op) {
}
template <typename OpTy>
+inline match_combine_or<CastClass_match<OpTy, Instruction::SExt>, OpTy>
+m_SExtOrSelf(const OpTy &Op) {
+ return m_CombineOr(m_SExt(Op), Op);
+}
+
+template <typename OpTy>
inline match_combine_or<CastClass_match<OpTy, Instruction::ZExt>,
CastClass_match<OpTy, Instruction::SExt>>
m_ZExtOrSExt(const OpTy &Op) {
return m_CombineOr(m_ZExt(Op), m_SExt(Op));
}
+template <typename OpTy>
+inline match_combine_or<
+ match_combine_or<CastClass_match<OpTy, Instruction::ZExt>,
+ CastClass_match<OpTy, Instruction::SExt>>,
+ OpTy>
+m_ZExtOrSExtOrSelf(const OpTy &Op) {
+ return m_CombineOr(m_ZExtOrSExt(Op), Op);
+}
+
/// Matches UIToFP.
template <typename OpTy>
inline CastClass_match<OpTy, Instruction::UIToFP> m_UIToFP(const OpTy &Op) {
Modified: llvm/trunk/unittests/IR/PatternMatch.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PatternMatch.cpp?rev=373128&r1=373127&r2=373128&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/PatternMatch.cpp (original)
+++ llvm/trunk/unittests/IR/PatternMatch.cpp Fri Sep 27 14:53:04 2019
@@ -471,6 +471,42 @@ TEST_F(PatternMatchTest, Unless) {
EXPECT_FALSE(m_Unless(m_c_Add(m_Zero(), m_One())).match(X));
}
+TEST_F(PatternMatchTest, ZExtSExtSelf) {
+ LLVMContext &Ctx = IRB.getContext();
+
+ Value *One32 = IRB.getInt32(1);
+ Value *One64Z = IRB.CreateZExt(One32, IntegerType::getInt64Ty(Ctx));
+ Value *One64S = IRB.CreateSExt(One32, IntegerType::getInt64Ty(Ctx));
+
+ EXPECT_TRUE(m_One().match(One32));
+ EXPECT_FALSE(m_One().match(One64Z));
+ EXPECT_FALSE(m_One().match(One64S));
+
+ EXPECT_FALSE(m_ZExt(m_One()).match(One32));
+ EXPECT_TRUE(m_ZExt(m_One()).match(One64Z));
+ EXPECT_FALSE(m_ZExt(m_One()).match(One64S));
+
+ EXPECT_FALSE(m_SExt(m_One()).match(One32));
+ EXPECT_FALSE(m_SExt(m_One()).match(One64Z));
+ EXPECT_TRUE(m_SExt(m_One()).match(One64S));
+
+ EXPECT_TRUE(m_ZExtOrSelf(m_One()).match(One32));
+ EXPECT_TRUE(m_ZExtOrSelf(m_One()).match(One64Z));
+ EXPECT_FALSE(m_ZExtOrSelf(m_One()).match(One64S));
+
+ EXPECT_TRUE(m_SExtOrSelf(m_One()).match(One32));
+ EXPECT_FALSE(m_SExtOrSelf(m_One()).match(One64Z));
+ EXPECT_TRUE(m_SExtOrSelf(m_One()).match(One64S));
+
+ EXPECT_FALSE(m_ZExtOrSExt(m_One()).match(One32));
+ EXPECT_TRUE(m_ZExtOrSExt(m_One()).match(One64Z));
+ EXPECT_TRUE(m_ZExtOrSExt(m_One()).match(One64S));
+
+ EXPECT_TRUE(m_ZExtOrSExtOrSelf(m_One()).match(One32));
+ EXPECT_TRUE(m_ZExtOrSExtOrSelf(m_One()).match(One64Z));
+ EXPECT_TRUE(m_ZExtOrSExtOrSelf(m_One()).match(One64S));
+}
+
TEST_F(PatternMatchTest, Power2) {
Value *C128 = IRB.getInt32(128);
Value *CNeg128 = ConstantExpr::getNeg(cast<Constant>(C128));
More information about the llvm-commits
mailing list