Index: include/llvm/CodeGen/MachineMemOperand.h =================================================================== --- include/llvm/CodeGen/MachineMemOperand.h +++ include/llvm/CodeGen/MachineMemOperand.h @@ -286,6 +286,10 @@ void setValue(const PseudoSourceValue *NewSV) { PtrInfo.V = NewSV; } void setOffset(int64_t NewOffset) { PtrInfo.Offset = NewOffset; } + /// Create new MachineMemOperand that represents a \p Size byte subset located + /// at \p Offset. + MachineMemOperand *copyWithSizeAndOffset(MachineFunction &MF, unsigned Size, + unsigned Offset) const; /// Profile - Gather unique data for the object. /// void Profile(FoldingSetNodeID &ID) const; Index: lib/CodeGen/GlobalISel/LegalizerHelper.cpp =================================================================== --- lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -493,16 +493,13 @@ for (int i = 0; i < NumParts; ++i) { unsigned DstReg = MRI.createGenericVirtualRegister(NarrowTy); unsigned SrcReg = 0; - unsigned Adjustment = i * NarrowSize / 8; - unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment); + unsigned Offset = i * NarrowSize / 8; - MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand( - MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(), - NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(), - MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering()); + MachineMemOperand *SplitMMO = MMO.copyWithSizeAndOffset( + MIRBuilder.getMF(), NarrowSize / 8, Offset); MIRBuilder.materializeGEP(SrcReg, MI.getOperand(1).getReg(), OffsetTy, - Adjustment); + Offset); MIRBuilder.buildLoad(DstReg, SrcReg, *SplitMMO); @@ -565,16 +562,13 @@ for (int i = 0; i < NumParts; ++i) { unsigned DstReg = 0; - unsigned Adjustment = i * NarrowSize / 8; - unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment); + unsigned Offset = i * NarrowSize / 8; - MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand( - MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(), - NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(), - MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering()); + MachineMemOperand *SplitMMO = + MMO.copyWithSizeAndOffset(MIRBuilder.getMF(), NarrowSize / 8, Offset); MIRBuilder.materializeGEP(DstReg, MI.getOperand(1).getReg(), OffsetTy, - Adjustment); + Offset); MIRBuilder.buildStore(SrcRegs[i], DstReg, *SplitMMO); } Index: lib/CodeGen/MachineOperand.cpp =================================================================== --- lib/CodeGen/MachineOperand.cpp +++ lib/CodeGen/MachineOperand.cpp @@ -1004,6 +1004,14 @@ assert(getFailureOrdering() == FailureOrdering && "Value truncated"); } +MachineMemOperand * +MachineMemOperand::copyWithSizeAndOffset(MachineFunction &MF, unsigned Size, + unsigned Offset) const { + return MF.getMachineMemOperand(getPointerInfo().getWithOffset(Offset), + getFlags(), Size, + MinAlign(getAlignment(), Offset)); +} + /// Profile - Gather unique data for the object. /// void MachineMemOperand::Profile(FoldingSetNodeID &ID) const {