[llvm] 6e60d54 - [DAG] Add foldSelectToABD helper. NFC.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 05:32:10 PDT 2024
Author: Simon Pilgrim
Date: 2024-08-06T13:31:53+01:00
New Revision: 6e60d549d41f5651e9e0eded978810a170d0e42c
URL: https://github.com/llvm/llvm-project/commit/6e60d549d41f5651e9e0eded978810a170d0e42c
DIFF: https://github.com/llvm/llvm-project/commit/6e60d549d41f5651e9e0eded978810a170d0e42c.diff
LOG: [DAG] Add foldSelectToABD helper. NFC.
Pull out of visitVSELECT to allow reuse in the future.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 9b61d83612fde..8cc920c16552e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -598,6 +598,8 @@ namespace {
const SDLoc &DL);
SDValue foldSubToUSubSat(EVT DstVT, SDNode *N, const SDLoc &DL);
SDValue foldABSToABD(SDNode *N, const SDLoc &DL);
+ SDValue foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
+ SDValue False, ISD::CondCode CC, const SDLoc &DL);
SDValue unfoldMaskedMerge(SDNode *N);
SDValue unfoldExtremeBitClearingToShifts(SDNode *N);
SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
@@ -11568,6 +11570,45 @@ static SDValue foldVSelectToSignBitSplatMask(SDNode *N, SelectionDAG &DAG) {
return SDValue();
}
+// Match SELECTs with absolute
diff erence patterns.
+// (select (setcc a, b, set?gt), (sub a, b), (sub b, a)) --> (abd? a, b)
+// (select (setcc a, b, set?ge), (sub a, b), (sub b, a)) --> (abd? a, b)
+// (select (setcc a, b, set?lt), (sub b, a), (sub a, b)) --> (abd? a, b)
+// (select (setcc a, b, set?le), (sub b, a), (sub a, b)) --> (abd? a, b)
+SDValue DAGCombiner::foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
+ SDValue False, ISD::CondCode CC,
+ const SDLoc &DL) {
+ bool IsSigned = isSignedIntSetCC(CC);
+ unsigned ABDOpc = IsSigned ? ISD::ABDS : ISD::ABDU;
+ EVT VT = LHS.getValueType();
+
+ if (LegalOperations && !hasOperation(ABDOpc, VT))
+ return SDValue();
+
+ switch (CC) {
+ case ISD::SETGT:
+ case ISD::SETGE:
+ case ISD::SETUGT:
+ case ISD::SETUGE:
+ if (sd_match(True, m_Sub(m_Specific(LHS), m_Specific(RHS))) &&
+ sd_match(False, m_Sub(m_Specific(RHS), m_Specific(LHS))))
+ return DAG.getNode(ABDOpc, DL, VT, LHS, RHS);
+ break;
+ case ISD::SETLT:
+ case ISD::SETLE:
+ case ISD::SETULT:
+ case ISD::SETULE:
+ if (sd_match(True, m_Sub(m_Specific(RHS), m_Specific(LHS))) &&
+ sd_match(False, m_Sub(m_Specific(LHS), m_Specific(RHS))))
+ return DAG.getNode(ABDOpc, DL, VT, LHS, RHS);
+ break;
+ default:
+ break;
+ }
+
+ return SDValue();
+}
+
SDValue DAGCombiner::visitSELECT(SDNode *N) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
@@ -12368,37 +12409,8 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
}
}
- // Match VSELECTs with absolute
diff erence patterns.
- // (vselect (setcc a, b, set?gt), (sub a, b), (sub b, a)) --> (abd? a, b)
- // (vselect (setcc a, b, set?ge), (sub a, b), (sub b, a)) --> (abd? a, b)
- // (vselect (setcc a, b, set?lt), (sub b, a), (sub a, b)) --> (abd? a, b)
- // (vselect (setcc a, b, set?le), (sub b, a), (sub a, b)) --> (abd? a, b)
- if (N1.getOpcode() == ISD::SUB && N2.getOpcode() == ISD::SUB &&
- N1.getOperand(0) == N2.getOperand(1) &&
- N1.getOperand(1) == N2.getOperand(0)) {
- bool IsSigned = isSignedIntSetCC(CC);
- unsigned ABDOpc = IsSigned ? ISD::ABDS : ISD::ABDU;
- if (!LegalOperations || hasOperation(ABDOpc, VT)) {
- switch (CC) {
- case ISD::SETGT:
- case ISD::SETGE:
- case ISD::SETUGT:
- case ISD::SETUGE:
- if (LHS == N1.getOperand(0) && RHS == N1.getOperand(1))
- return DAG.getNode(ABDOpc, DL, VT, LHS, RHS);
- break;
- case ISD::SETLT:
- case ISD::SETLE:
- case ISD::SETULT:
- case ISD::SETULE:
- if (RHS == N1.getOperand(0) && LHS == N1.getOperand(1) )
- return DAG.getNode(ABDOpc, DL, VT, LHS, RHS);
- break;
- default:
- break;
- }
- }
- }
+ if (SDValue ABD = foldSelectToABD(LHS, RHS, N1, N2, CC, DL))
+ return ABD;
// Match VSELECTs into add with unsigned saturation.
if (hasOperation(ISD::UADDSAT, VT)) {
More information about the llvm-commits
mailing list