[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:26 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.
- bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse();
- Combiner.CombineTo(N, ExtLoad);
+ bool NoReplaceTrunc = Frozen ? N0->hasOneUse() : Load->hasOneUse();
+ SDValue Res;
+ if (Frozen) {
+ Res = DAG.getFreeze(ExtLoad);
+ Res = DAG.getNode(ExtLoadType == ISD::SEXTLOAD ? ISD::AssertSext
+ : ISD::AssertZext,
+ DL, Res.getValueType(), Res,
+ DAG.getValueType(Load->getValueType(0).getScalarType()));
+ } else {
+ Res = ExtLoad;
+ }
----------------
david-arm wrote:
Done
https://github.com/llvm/llvm-project/pull/175022
More information about the llvm-commits
mailing list