[llvm] [X86] Fold X * 1 + Z --> X + Z for VPMADD52L (PR #158516)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 16 01:37:36 PDT 2025
================
@@ -60186,8 +60186,37 @@ static SDValue combineVPMADD(SDNode *N, SelectionDAG &DAG,
static SDValue combineVPMADD52LH(SDNode *N, SelectionDAG &DAG,
TargetLowering::DAGCombinerInfo &DCI) {
MVT VT = N->getSimpleValueType(0);
- unsigned NumEltBits = VT.getScalarSizeInBits();
+
+ bool AddLow = N->getOpcode() == X86ISD::VPMADD52L;
+ SDValue Op0 = N->getOperand(0);
+ SDValue Op1 = N->getOperand(1);
+ SDValue Op2 = N->getOperand(2);
+ SDLoc DL(N);
+
+ APInt C0, C1;
+ bool HasC0 = X86::isConstantSplat(Op0, C0),
+ HasC1 = X86::isConstantSplat(Op1, C1);
+
+ // lo/hi(C * X) + Z --> lo/hi(X * C) + Z
+ if (HasC0 && !HasC1)
+ return DAG.getNode(N->getOpcode(), DL, VT, Op1, Op0, Op2);
+
+ // Only keep the low 52 bits of C1
+ if (HasC1 && C1.countLeadingZeros() < 12) {
+ C1.clearBits(52, 64);
+ SDValue LowC1 = DAG.getConstant(C1, DL, VT);
+ return DAG.getNode(N->getOpcode(), DL, VT, Op0, LowC1, Op2);
+ }
+
+ // lo(X * 1) + Z --> lo(X) + Z iff X == lo(X)
+ if (AddLow && HasC1 && C1.isOne()) {
----------------
RKSimon wrote:
Can we just do `C1.trunc(52).isOne()` and skip the low 52 constant canonicalisation above?
https://github.com/llvm/llvm-project/pull/158516
More information about the llvm-commits
mailing list