[llvm] [AMDGPU][SDAG] Try folding "lshr i64 + mad" to "mad_u64_u32" (PR #119218)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 9 02:34:24 PST 2025
================
@@ -13857,6 +13857,37 @@ static SDValue getMad64_32(SelectionDAG &DAG, const SDLoc &SL, EVT VT,
return DAG.getNode(ISD::TRUNCATE, SL, VT, Mad);
}
+// Fold
+// y = lshr i64 x, 32
+// res = add (mul i64 y, Const), x where "Const" is a 64-bit constant
+// with Const.hi == -1
+// To
+// res = mad_u64_u32 y.lo ,Const.lo, x.lo
+static SDValue tryFoldMADwithSRL(SelectionDAG &DAG, const SDLoc &SL,
+ SDValue MulLHS, SDValue MulRHS,
+ SDValue AddRHS) {
+ if (MulRHS.getOpcode() == ISD::SRL)
+ std::swap(MulLHS, MulRHS);
+
+ if (MulLHS.getValueType() != MVT::i64 || MulLHS.getOpcode() != ISD::SRL)
+ return SDValue();
+
+ ConstantSDNode *ShiftVal = dyn_cast<ConstantSDNode>(MulLHS.getOperand(1));
+ if (!ShiftVal || ShiftVal->getAsZExtVal() != 32 ||
+ MulLHS.getOperand(0) != AddRHS)
+ return SDValue();
+
+ ConstantSDNode *Const = dyn_cast<ConstantSDNode>(MulRHS.getNode());
+ if (!Const || Hi_32(Const->getZExtValue()) != -1)
+ return SDValue();
+
+ SDValue ConstMul =
+ DAG.getConstant(Const->getZExtValue() & 0x00000000FFFFFFFF, SL, MVT::i32);
----------------
jayfoad wrote:
Use `Lo_32`
https://github.com/llvm/llvm-project/pull/119218
More information about the llvm-commits
mailing list