[llvm] a4897aa - [SDPatternMatch] Add m_NU/SWAdd and m_NU/SWAddLike (#214876)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 8 12:45:03 PDT 2026
Author: Min-Yih Hsu
Date: 2026-08-08T12:44:56-07:00
New Revision: a4897aa410ebe7ff4f174c16698ac7b66db4304e
URL: https://github.com/llvm/llvm-project/commit/a4897aa410ebe7ff4f174c16698ac7b66db4304e
DIFF: https://github.com/llvm/llvm-project/commit/a4897aa410ebe7ff4f174c16698ac7b66db4304e.diff
LOG: [SDPatternMatch] Add m_NU/SWAdd and m_NU/SWAddLike (#214876)
These are the SDPatternMatch counterpart of `m_NU/SWAdd` and
`m_NU/SWAddLike` in IR PatternMatch.
Added:
Modified:
llvm/include/llvm/CodeGen/SDPatternMatch.h
llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index e2e20b14bb7f7..1affc9a1f6b49 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -827,6 +827,18 @@ inline BinaryOpc_match<LHS, RHS, true> m_Add(const LHS &L, const RHS &R) {
return BinaryOpc_match<LHS, RHS, true>(ISD::ADD, L, R);
}
+template <typename LHS, typename RHS>
+inline auto m_NUWAdd(const LHS &L, const RHS &R) {
+ return BinaryOpc_match<LHS, RHS, true>(ISD::ADD, L, R,
+ SDNodeFlags::NoUnsignedWrap);
+}
+
+template <typename LHS, typename RHS>
+inline auto m_NSWAdd(const LHS &L, const RHS &R) {
+ return BinaryOpc_match<LHS, RHS, true>(ISD::ADD, L, R,
+ SDNodeFlags::NoSignedWrap);
+}
+
template <typename LHS, typename RHS>
inline BinaryOpc_match<LHS, RHS> m_Sub(const LHS &L, const RHS &R) {
return BinaryOpc_match<LHS, RHS>(ISD::SUB, L, R);
@@ -858,6 +870,16 @@ inline auto m_AddLike(const LHS &L, const RHS &R) {
return m_AnyOf(m_Add(L, R), m_DisjointOr(L, R));
}
+template <typename LHS, typename RHS>
+inline auto m_NSWAddLike(const LHS &L, const RHS &R) {
+ return m_AnyOf(m_NSWAdd(L, R), m_DisjointOr(L, R));
+}
+
+template <typename LHS, typename RHS>
+inline auto m_NUWAddLike(const LHS &L, const RHS &R) {
+ return m_AnyOf(m_NUWAdd(L, R), m_DisjointOr(L, R));
+}
+
template <typename LHS, typename RHS>
inline BinaryOpc_match<LHS, RHS, true> m_Xor(const LHS &L, const RHS &R) {
return BinaryOpc_match<LHS, RHS, true>(ISD::XOR, L, R);
diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
index 6687308bda8cc..543b769b1a666 100644
--- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
@@ -221,6 +221,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
SDValue Or = DAG->getNode(ISD::OR, DL, Int32VT, Op0, Op1);
SDValue DisOr =
DAG->getNode(ISD::OR, DL, Int32VT, Op0, Op3, SDNodeFlags::Disjoint);
+ SDValue NUWAdd =
+ DAG->getNode(ISD::ADD, DL, Int32VT, Or, Xor, SDNodeFlags::NoUnsignedWrap);
+ SDValue NSWAdd =
+ DAG->getNode(ISD::ADD, DL, Int32VT, And, Xor, SDNodeFlags::NoSignedWrap);
SDValue SMax = DAG->getNode(ISD::SMAX, DL, Int32VT, Op0, Op1);
SDValue SMin = DAG->getNode(ISD::SMIN, DL, Int32VT, Op1, Op0);
SDValue UMax = DAG->getNode(ISD::UMAX, DL, Int32VT, Op0, Op1);
@@ -320,6 +324,20 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
EXPECT_TRUE(sd_match(Add, m_c_BinOp(ISD::ADD, m_Value(), m_Value())));
EXPECT_TRUE(sd_match(Add, m_Add(m_Value(), m_Value())));
EXPECT_TRUE(sd_match(Add, m_AddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NUWAdd, m_NUWAdd(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NSWAdd, m_NSWAdd(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(NUWAdd, m_NSWAdd(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(NSWAdd, m_NUWAdd(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NUWAdd, m_Add(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NSWAdd, m_Add(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NUWAdd, m_AddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NSWAdd, m_AddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NUWAdd, m_NUWAddLike(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(NSWAdd, m_NUWAddLike(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(Add, m_NUWAddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(NSWAdd, m_NSWAddLike(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(NUWAdd, m_NSWAddLike(m_Value(), m_Value())));
+ EXPECT_FALSE(sd_match(Add, m_NSWAddLike(m_Value(), m_Value())));
EXPECT_TRUE(sd_match(Mul, m_Mul(m_OneUse(m_SpecificOpc(ISD::SUB)),
m_NUses<2>(m_Specific(Add)))));
EXPECT_TRUE(
@@ -347,6 +365,8 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
EXPECT_TRUE(sd_match(DisOr, m_DisjointOr(m_Value(), m_Value())));
EXPECT_FALSE(sd_match(DisOr, m_Add(m_Value(), m_Value())));
EXPECT_TRUE(sd_match(DisOr, m_AddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(DisOr, m_NUWAddLike(m_Value(), m_Value())));
+ EXPECT_TRUE(sd_match(DisOr, m_NSWAddLike(m_Value(), m_Value())));
EXPECT_TRUE(sd_match(
DisOr, m_BinOp(ISD::OR, m_Value(), m_Value(), SDNodeFlags::Disjoint)));
EXPECT_TRUE(sd_match(
More information about the llvm-commits
mailing list