[llvm] [LLVM][DAGCombiner] Look through freeze when combining extensions of loads (PR #175022)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 29 02:24:27 PST 2026
================
@@ -14552,35 +14556,49 @@ static SDValue tryToFoldExtOfLoad(SelectionDAG &DAG, DAGCombiner &Combiner,
// TODO: isFixedLengthVector() should be removed and any negative effects on
// code generation being the result of that target's implementation of
// isVectorLoadExtDesirable().
- if ((LegalOperations || VT.isFixedLengthVector() ||
- !cast<LoadSDNode>(N0)->isSimple()) &&
- !TLI.isLoadExtLegal(ExtLoadType, VT, N0.getValueType()))
+ if ((LegalOperations || VT.isFixedLengthVector() || !Load->isSimple()) &&
+ !TLI.isLoadExtLegal(ExtLoadType, VT, Load->getValueType(0)))
return {};
bool DoXform = true;
SmallVector<SDNode *, 4> SetCCs;
- if (!N0.hasOneUse())
- DoXform = ExtendUsesToFormExtLoad(VT, N, N0, ExtOpc, SetCCs, TLI);
+ if (!Load->hasOneUse() || (Frozen && !N0->hasOneUse()))
+ DoXform = ExtendUsesToFormExtLoad(VT, N, Frozen ? N0 : SDValue(Load, 0),
+ ExtOpc, SetCCs, TLI);
if (VT.isVector())
DoXform &= TLI.isVectorLoadExtDesirable(SDValue(N, 0));
if (!DoXform)
return {};
- LoadSDNode *LN0 = cast<LoadSDNode>(N0);
- SDValue ExtLoad = DAG.getExtLoad(ExtLoadType, SDLoc(LN0), VT, LN0->getChain(),
- LN0->getBasePtr(), N0.getValueType(),
- LN0->getMemOperand());
- Combiner.ExtendSetCCUses(SetCCs, N0, ExtLoad, ExtOpc);
+ SDLoc DL(Load);
+ SDValue ExtLoad =
+ DAG.getExtLoad(ExtLoadType, DL, VT, Load->getChain(), Load->getBasePtr(),
+ Load->getValueType(0), Load->getMemOperand());
// If the load value is used only by N, replace it via CombineTo N.
----------------
david-arm wrote:
Following your suggestion above about initialising `Res` as `ExtLoad` it's not possible to move this any lower than just above the declaration of `Res`.
https://github.com/llvm/llvm-project/pull/175022
More information about the llvm-commits
mailing list