diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineFunction.cpp | 23 |
2 files changed, 21 insertions, 26 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 91c436bf2c0..38dedc55883 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -568,20 +568,18 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI, LLT OffsetTy = LLT::scalar( MRI.getType(MI.getOperand(1).getReg()).getScalarSizeInBits()); + MachineFunction &MF = MIRBuilder.getMF(); SmallVector<unsigned, 2> DstRegs; for (int i = 0; i < NumParts; ++i) { unsigned PartDstReg = 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 = + MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8); MIRBuilder.materializeGEP(SrcReg, MI.getOperand(1).getReg(), OffsetTy, - Adjustment); + Offset); MIRBuilder.buildLoad(PartDstReg, SrcReg, *SplitMMO); @@ -684,18 +682,16 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI, SmallVector<unsigned, 2> SrcRegs; extractParts(MI.getOperand(0).getReg(), NarrowTy, NumParts, SrcRegs); + MachineFunction &MF = MIRBuilder.getMF(); 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 = + MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8); MIRBuilder.materializeGEP(DstReg, MI.getOperand(1).getReg(), OffsetTy, - Adjustment); + Offset); MIRBuilder.buildStore(SrcRegs[i], DstReg, *SplitMMO); } diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index e332396a466..84a20762d62 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -395,19 +395,18 @@ MachineMemOperand *MachineFunction::getMachineMemOperand( MachineMemOperand * MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO, int64_t Offset, uint64_t Size) { - if (MMO->getValue()) - return new (Allocator) - MachineMemOperand(MachinePointerInfo(MMO->getValue(), - MMO->getOffset()+Offset), - MMO->getFlags(), Size, MMO->getBaseAlignment(), - AAMDNodes(), nullptr, MMO->getSyncScopeID(), - MMO->getOrdering(), MMO->getFailureOrdering()); + const MachinePointerInfo &PtrInfo = MMO->getPointerInfo(); + + // If there is no pointer value, the offset isn't tracked so we need to adjust + // the base alignment. + unsigned Align = PtrInfo.V.isNull() + ? MinAlign(MMO->getBaseAlignment(), Offset) + : MMO->getBaseAlignment(); + return new (Allocator) - MachineMemOperand(MachinePointerInfo(MMO->getPseudoValue(), - MMO->getOffset()+Offset), - MMO->getFlags(), Size, MMO->getBaseAlignment(), - AAMDNodes(), nullptr, MMO->getSyncScopeID(), - MMO->getOrdering(), MMO->getFailureOrdering()); + MachineMemOperand(PtrInfo.getWithOffset(Offset), MMO->getFlags(), Size, + Align, AAMDNodes(), nullptr, MMO->getSyncScopeID(), + MMO->getOrdering(), MMO->getFailureOrdering()); } MachineMemOperand * |

