Skip to content

Commit

Permalink
[DAG] Add SDPatternMatch m_ZExtOrSelf/m_SExtOrSelf/m_AExtOrSelf/m_Tru…
Browse files Browse the repository at this point in the history
…ncOrSelf matchers
  • Loading branch information
marcauberer committed Mar 16, 2024
1 parent 9d5edfd commit e5c7999
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
33 changes: 33 additions & 0 deletions llvm/include/llvm/CodeGen/SDPatternMatch.h
Expand Up @@ -725,6 +725,39 @@ inline auto m_False() {
},
m_Value()};
}

/// Match a zext or identity
/// Allows to peek through optional extensions
template <typename ValTy>
inline BinaryOpc_match<UnaryOpc_match<ValTy>, ValTy, true>
m_ZExtOrSelf(const ValTy &V) {
return m_Or(m_ZExt(V), V);
}

/// Match a sext or identity
/// Allows to peek through optional extensions
template <typename ValTy>
inline BinaryOpc_match<UnaryOpc_match<ValTy>, ValTy, true>
m_SExtOrSelf(const ValTy &V) {
return m_Or(m_SExt(V), V);
}

/// Match a aext or identity
/// Allows to peek through optional extensions
template <typename ValTy>
inline BinaryOpc_match<UnaryOpc_match<ValTy>, ValTy, true>
m_AExtOrSelf(const ValTy &V) {
return m_Or(m_AnyExt(V), V);
}

/// Match a trunc or identity
/// Allows to peek through optional truncations
template <typename ValTy>
inline BinaryOpc_match<UnaryOpc_match<ValTy>, ValTy, true>
m_TruncOrSelf(const ValTy &V) {
return m_Or(m_Trunc(V), V);
}

} // namespace SDPatternMatch
} // namespace llvm
#endif
37 changes: 37 additions & 0 deletions llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
Expand Up @@ -241,6 +241,43 @@ TEST_F(SelectionDAGPatternMatchTest, patternCombinators) {
EXPECT_TRUE(sd_match(Add, m_AllOf(m_Opc(ISD::ADD), m_OneUse())));
}

TEST_F(SelectionDAGPatternMatchTest, optionalResizing) {
SDLoc DL;
auto Int32VT = EVT::getIntegerVT(Context, 32);

SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT);

// zero extend
SDValue ZExt = DAG->getNode(ISD::ZERO_EXTEND, DL, Int32VT, Op0);
SDValue OptionalZExtLhs = DAG->getNode(ISD::OR, DL, Int32VT, ZExt, Op0);
SDValue OptionalZExtRhs = DAG->getNode(ISD::OR, DL, Int32VT, Op0, ZExt);

// sign extend
SDValue SExt = DAG->getNode(ISD::SIGN_EXTEND, DL, Int32VT, Op0);
SDValue OptionalSExtLhs = DAG->getNode(ISD::OR, DL, Int32VT, SExt, Op0);
SDValue OptionalSExtRhs = DAG->getNode(ISD::OR, DL, Int32VT, Op0, SExt);

// any extend
SDValue AExt = DAG->getNode(ISD::ANY_EXTEND, DL, Int32VT, Op0);
SDValue OptionalAExtLhs = DAG->getNode(ISD::OR, DL, Int32VT, AExt, Op0);
SDValue OptionalAExtRhs = DAG->getNode(ISD::OR, DL, Int32VT, Op0, AExt);

// truncate
SDValue Trunc = DAG->getNode(ISD::TRUNCATE, DL, Int32VT, Op0);
SDValue OptionalTruncLhs = DAG->getNode(ISD::OR, DL, Int32VT, Trunc, Op0);
SDValue OptionalTruncRhs = DAG->getNode(ISD::OR, DL, Int32VT, Op0, Trunc);

using namespace SDPatternMatch;
EXPECT_TRUE(sd_match(OptionalZExtLhs, m_ZExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalZExtRhs, m_ZExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalSExtLhs, m_SExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalSExtRhs, m_SExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalAExtLhs, m_AExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalAExtRhs, m_AExtOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalTruncLhs, m_TruncOrSelf(m_Specific(Op0))));
EXPECT_TRUE(sd_match(OptionalTruncRhs, m_TruncOrSelf(m_Specific(Op0))));
}

TEST_F(SelectionDAGPatternMatchTest, matchNode) {
SDLoc DL;
auto Int32VT = EVT::getIntegerVT(Context, 32);
Expand Down

0 comments on commit e5c7999

Please sign in to comment.