[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