[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