[llvm] [Hexagon] Correctly split masked loads/stores after widening (PR #190689)
Yashas Andaluri via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 22 10:47:55 PDT 2026
================
@@ -3443,41 +3443,60 @@ HexagonTargetLowering::SplitVectorOp(SDValue Op, SelectionDAG &DAG) const {
SDValue
HexagonTargetLowering::SplitHvxMemOp(SDValue Op, SelectionDAG &DAG) const {
auto *MemN = cast<MemSDNode>(Op.getNode());
+ unsigned MemOpc = MemN->getOpcode();
+ EVT MemTy = MemN->getMemoryVT();
- if (!MemN->getMemoryVT().isSimple())
+ if ((MemOpc == ISD::STORE || MemOpc == ISD::LOAD) &&
+ (!MemTy.isSimple() || !isHvxPairTy(MemTy.getSimpleVT())))
return Op;
- MVT MemTy = MemN->getMemoryVT().getSimpleVT();
- if (!isHvxPairTy(MemTy))
- return Op;
+ EVT ValueType;
+ if (MemOpc == ISD::STORE)
+ ValueType = ty(cast<StoreSDNode>(Op)->getValue());
+ else if (MemOpc == ISD::MSTORE)
+ ValueType = ty(cast<MaskedStoreSDNode>(Op)->getValue());
+ else // ISD::LOAD, ISD::MLOAD.
+ ValueType = MemN->getValueType(0);
+
+ EVT LoVT, HiVT;
+ std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(ValueType);
+
+ EVT LoMemVT, HiMemVT;
+ bool HiIsEmpty = false;
+ std::tie(LoMemVT, HiMemVT) =
+ DAG.GetDependentSplitDestVTs(MemTy, LoVT, &HiIsEmpty);
+
+ uint64_t LoSize = LoMemVT.getSizeInBits().getFixedValue() / 8;
+ uint64_t HiSize = HiMemVT.getSizeInBits().getFixedValue() / 8;
const SDLoc &dl(Op);
- unsigned HwLen = Subtarget.getVectorLength();
- MVT SingleTy = typeSplit(MemTy).first;
SDValue Chain = MemN->getChain();
SDValue Base0 = MemN->getBasePtr();
SDValue Base1 =
- DAG.getMemBasePlusOffset(Base0, TypeSize::getFixed(HwLen), dl);
- unsigned MemOpc = MemN->getOpcode();
+ DAG.getMemBasePlusOffset(Base0, TypeSize::getFixed(LoSize), dl);
MachineMemOperand *MOp0 = nullptr, *MOp1 = nullptr;
if (MachineMemOperand *MMO = MemN->getMemOperand()) {
MachineFunction &MF = DAG.getMachineFunction();
- uint64_t MemSize = (MemOpc == ISD::MLOAD || MemOpc == ISD::MSTORE)
- ? (uint64_t)MemoryLocation::UnknownSize
- : HwLen;
- MOp0 = MF.getMachineMemOperand(MMO, 0, MemSize);
- MOp1 = MF.getMachineMemOperand(MMO, HwLen, MemSize);
+ auto MemSize = [=](uint64_t Size) {
+ return (MemOpc == ISD::MLOAD || MemOpc == ISD::MSTORE)
+ ? (uint64_t)MemoryLocation::UnknownSize
+ : Size;
+ };
+ MOp0 = MF.getMachineMemOperand(MMO, 0, MemSize(LoSize));
+ MOp1 = MF.getMachineMemOperand(MMO, LoSize, MemSize(HiSize));
----------------
yandalur wrote:
HiIsEmpty cannot be true, when isHvxPairTy holds for ISD::LOAD and ISD::STORE? We can have an assert for !HiIsEmpty
https://github.com/llvm/llvm-project/pull/190689
More information about the llvm-commits
mailing list