Skip to content

Commit bc70f60

Browse files
ZiCong-Wangarsenm
andauthored
[SelectionDAG] Add m_Neg and m_Not pattern matcher and update DAGCombiner (llvm#85365)
Resolves llvm#85065 --------- Co-authored-by: Matt Arsenault <[email protected]>
1 parent a10aa44 commit bc70f60

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

+12
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,18 @@ inline auto m_False() {
725725
},
726726
m_Value()};
727727
}
728+
729+
/// Match a negate as a sub(0, v)
730+
template <typename ValTy>
731+
inline BinaryOpc_match<SpecificInt_match, ValTy> m_Neg(const ValTy &V) {
732+
return m_Sub(m_Zero(), V);
733+
}
734+
735+
/// Match a Not as a xor(v, -1) or xor(-1, v)
736+
template <typename ValTy>
737+
inline BinaryOpc_match<ValTy, SpecificInt_match, true> m_Not(const ValTy &V) {
738+
return m_Xor(V, m_AllOnes());
739+
}
728740
} // namespace SDPatternMatch
729741
} // namespace llvm
730742
#endif

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2703,11 +2703,11 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
27032703
SDValue A, B, C;
27042704

27052705
// fold ((0-A) + B) -> B-A
2706-
if (sd_match(N0, m_Sub(m_Zero(), m_Value(A))))
2706+
if (sd_match(N0, m_Neg(m_Value(A))))
27072707
return DAG.getNode(ISD::SUB, DL, VT, N1, A);
27082708

27092709
// fold (A + (0-B)) -> A-B
2710-
if (sd_match(N1, m_Sub(m_Zero(), m_Value(B))))
2710+
if (sd_match(N1, m_Neg(m_Value(B))))
27112711
return DAG.getNode(ISD::SUB, DL, VT, N0, B);
27122712

27132713
// fold (A+(B-A)) -> B
@@ -3812,7 +3812,7 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
38123812
return DAG.getNode(ISD::AND, DL, VT, N0, DAG.getNOT(DL, B, VT));
38133813

38143814
// fold (A - (-B * C)) -> (A + (B * C))
3815-
if (sd_match(N1, m_OneUse(m_Mul(m_Sub(m_Zero(), m_Value(B)), m_Value(C)))))
3815+
if (sd_match(N1, m_OneUse(m_Mul(m_Neg(m_Value(B)), m_Value(C)))))
38163816
return DAG.getNode(ISD::ADD, DL, VT, N0,
38173817
DAG.getNode(ISD::MUL, DL, VT, B, C));
38183818

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,20 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
187187
SDValue SExt = DAG->getNode(ISD::SIGN_EXTEND, DL, Int64VT, Op0);
188188
SDValue Trunc = DAG->getNode(ISD::TRUNCATE, DL, Int32VT, Op1);
189189

190+
SDValue Sub = DAG->getNode(ISD::SUB, DL, Int32VT, Trunc, Op0);
191+
SDValue Neg = DAG->getNegative(Op0, DL, Int32VT);
192+
SDValue Not = DAG->getNOT(DL, Op0, Int32VT);
193+
190194
using namespace SDPatternMatch;
191195
EXPECT_TRUE(sd_match(ZExt, m_UnaryOp(ISD::ZERO_EXTEND, m_Value())));
192196
EXPECT_TRUE(sd_match(SExt, m_SExt(m_Value())));
193197
EXPECT_TRUE(sd_match(Trunc, m_Trunc(m_Specific(Op1))));
198+
199+
EXPECT_TRUE(sd_match(Neg, m_Neg(m_Value())));
200+
EXPECT_TRUE(sd_match(Not, m_Not(m_Value())));
201+
EXPECT_FALSE(sd_match(ZExt, m_Neg(m_Value())));
202+
EXPECT_FALSE(sd_match(Sub, m_Neg(m_Value())));
203+
EXPECT_FALSE(sd_match(Neg, m_Not(m_Value())));
194204
}
195205

196206
TEST_F(SelectionDAGPatternMatchTest, matchConstants) {

0 commit comments

Comments
 (0)