[llvm] [X86] Fold X * 1 + Z --> X + Z for VPMADD52L (PR #158516)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 15 02:27:13 PDT 2025


================
@@ -44978,19 +44979,33 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
       return true;
 
     KnownBits KnownMul;
-    KnownOp0 = KnownOp0.trunc(52);
-    KnownOp1 = KnownOp1.trunc(52);
+    KnownOp0 = OrigKnownOp0.trunc(52);
+    KnownOp1 = OrigKnownOp1.trunc(52);
     KnownMul = Opc == X86ISD::VPMADD52L ? KnownBits::mul(KnownOp0, KnownOp1)
                                         : KnownBits::mulhu(KnownOp0, KnownOp1);
     KnownMul = KnownMul.zext(64);
 
+    SDLoc DL(Op);
     // lo/hi(X * Y) + Z --> C + Z
     if (KnownMul.isConstant()) {
-      SDLoc DL(Op);
       SDValue C = TLO.DAG.getConstant(KnownMul.getConstant(), DL, VT);
       return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::ADD, DL, VT, C, Op2));
     }
 
+    // C * X --> X * C
+    if (KnownOp0.isConstant()) {
+      std::swap(OrigKnownOp0, OrigKnownOp1);
+      std::swap(KnownOp0, KnownOp1);
+      std::swap(Op0, Op1);
+    }
+
+    // lo(X * 1) + Z --> lo(X) + Z --> X iff X == lo(X)
----------------
RKSimon wrote:

`lo(X * 1) + Z --> lo(X) + Z iff X == lo(X)`

https://github.com/llvm/llvm-project/pull/158516


More information about the llvm-commits mailing list