[llvm] [LLVM][DAGCombiner] Look through freeze when combining extensions of extending-masked-loads. (PR #172484)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 19 01:43:01 PST 2025
================
@@ -7518,27 +7518,23 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
return N0;
// fold (and (masked_load) (splat_vec (x, ...))) to zext_masked_load
- auto *MLoad = dyn_cast<MaskedLoadSDNode>(N0);
+ bool Frozen = N0.getOpcode() == ISD::FREEZE;
+ auto *MLoad = dyn_cast<MaskedLoadSDNode>(Frozen ? N0.getOperand(0) : N0);
ConstantSDNode *Splat = isConstOrConstSplat(N1, true, true);
if (MLoad && MLoad->getExtensionType() == ISD::EXTLOAD && Splat) {
- EVT LoadVT = MLoad->getMemoryVT();
- EVT ExtVT = VT;
- if (TLI.isLoadExtLegal(ISD::ZEXTLOAD, ExtVT, LoadVT)) {
+ EVT MemVT = MLoad->getMemoryVT();
+ if (TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, MemVT)) {
// For this AND to be a zero extension of the masked load the elements
// of the BuildVec must mask the bottom bits of the extended element
// type
- uint64_t ElementSize =
- LoadVT.getVectorElementType().getScalarSizeInBits();
- if (Splat->getAPIntValue().isMask(ElementSize)) {
+ if (Splat->getAPIntValue().isMask(MemVT.getScalarSizeInBits())) {
SDValue NewLoad = DAG.getMaskedLoad(
- ExtVT, DL, MLoad->getChain(), MLoad->getBasePtr(),
- MLoad->getOffset(), MLoad->getMask(), MLoad->getPassThru(),
- LoadVT, MLoad->getMemOperand(), MLoad->getAddressingMode(),
- ISD::ZEXTLOAD, MLoad->isExpandingLoad());
- bool LoadHasOtherUsers = !N0.hasOneUse();
- CombineTo(N, NewLoad);
- if (LoadHasOtherUsers)
- CombineTo(MLoad, NewLoad.getValue(0), NewLoad.getValue(1));
+ VT, DL, MLoad->getChain(), MLoad->getBasePtr(),
+ MLoad->getOffset(), MLoad->getMask(), MLoad->getPassThru(), MemVT,
+ MLoad->getMemOperand(), MLoad->getAddressingMode(), ISD::ZEXTLOAD,
+ MLoad->isExpandingLoad());
----------------
david-arm wrote:
Do we need a freeze test for expanding loads too?
https://github.com/llvm/llvm-project/pull/172484
More information about the llvm-commits
mailing list