[llvm] [X86] combineCMov - fold CMOV(LOAD(PTR0),LOAD(PTR1)) -> LOAD(CMOV(PTR0,PTR1)) (PR #182084)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 18 12:29:43 PST 2026


================
@@ -49933,6 +49933,36 @@ static SDValue combineCMov(SDNode *N, SelectionDAG &DAG,
     }
   }
 
+  // Attempt to fold CMOV(LOAD(PTR0),LOAD(PTR1)) -> LOAD(CMOV(PTR0,PTR1))
+  // TODO: Allow matching extloads?
+  if (TrueOp.getResNo() == 0 && ISD::isNormalLoad(TrueOp.getNode()) &&
+      FalseOp.getResNo() == 0 && ISD::isNormalLoad(FalseOp.getNode()) &&
+      TrueOp.hasOneUse() && FalseOp.hasOneUse()) {
+    auto *TrueLd = cast<LoadSDNode>(TrueOp);
+    auto *FalseLd = cast<LoadSDNode>(FalseOp);
+    // Ensure the loads and pointers are as similar as possible.
+    EVT PtrVT = FalseLd->getBasePtr().getValueType();
+    if (TrueLd->getChain() == FalseLd->getChain() &&
+        TrueLd->getPointerInfo().getAddrSpace() ==
+            FalseLd->getPointerInfo().getAddrSpace() &&
+        TrueLd->getMemOperand()->getFlags() ==
+            FalseLd->getMemOperand()->getFlags() &&
+        TrueLd->isSimple() && FalseLd->isSimple()) {
+      SDValue Ops[] = {FalseLd->getBasePtr(), TrueLd->getBasePtr(),
+                       DAG.getTargetConstant(CC, DL, MVT::i8), Cond};
+      SDValue NewPtr = DAG.getNode(X86ISD::CMOV, DL, PtrVT, Ops);
+      SDValue NewLd = DAG.getLoad(
+          VT, DL, FalseLd->getChain(), NewPtr,
+          MachinePointerInfo(FalseLd->getPointerInfo().getAddrSpace()),
+          Align(MinAlign(FalseLd->getAlign().value(),
----------------
RKSimon wrote:

I'll check - I was surprised I couldn't just use commonAlignment

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


More information about the llvm-commits mailing list