[llvm] [X86] matchLogicBlend - convert to SDPatternMatch matching. NFC. (PR #144546)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 17 08:28:42 PDT 2025
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/144546
Removes a LOT of commutative matching.
>From a7838cf9abc2cec787737f915548ed4c9a52b347 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Tue, 17 Jun 2025 16:25:25 +0100
Subject: [PATCH] [X86] matchLogicBlend - convert to SDPatternMatch matching.
NFC.
Removes a LOT of commutative matching.
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 36 +++++--------------------
1 file changed, 7 insertions(+), 29 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 12fcc614ab254..398556d158be1 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -52092,36 +52092,14 @@ static SDValue canonicalizeBitSelect(SDNode *N, const SDLoc &DL,
return DAG.getNode(ISD::OR, DL, VT, X, Y);
}
-// Try to match OR(AND(~MASK,X),AND(MASK,Y)) logic pattern.
+// Try to match OR(ANDNP(MASK,X),AND(MASK,Y)) logic pattern.
+// TODO: Try to match OR(AND(~MASK,X),AND(MASK,Y)) logic pattern.
+// Waiting for ANDNP combine allows other combines to happen that prevent
+// matching.
static bool matchLogicBlend(SDNode *N, SDValue &X, SDValue &Y, SDValue &Mask) {
- if (N->getOpcode() != ISD::OR)
- return false;
-
- SDValue N0 = N->getOperand(0);
- SDValue N1 = N->getOperand(1);
-
- // Canonicalize AND to LHS.
- if (N1.getOpcode() == ISD::AND)
- std::swap(N0, N1);
-
- // Attempt to match OR(AND(M,Y),ANDNP(M,X)).
- if (N0.getOpcode() != ISD::AND || N1.getOpcode() != X86ISD::ANDNP)
- return false;
-
- Mask = N1.getOperand(0);
- X = N1.getOperand(1);
-
- // Check to see if the mask appeared in both the AND and ANDNP.
- if (N0.getOperand(0) == Mask)
- Y = N0.getOperand(1);
- else if (N0.getOperand(1) == Mask)
- Y = N0.getOperand(0);
- else
- return false;
-
- // TODO: Attempt to match against AND(XOR(-1,M),Y) as well, waiting for
- // ANDNP combine allows other combines to happen that prevent matching.
- return true;
+ using namespace SDPatternMatch;
+ return sd_match(N, m_Or(m_BinOp(X86ISD::ANDNP, m_Value(Mask), m_Value(X)),
+ m_And(m_Deferred(Mask), m_Value(Y))));
}
// Try to fold:
More information about the llvm-commits
mailing list