GlobalISel: Use helper function for MMO splitting

Also fix an alignment bug getMachineMemOperand. If the
tracked value is null, the offset isn't tracked so the
base alignment needs to be reduced.

llvm-svn: 352716
This commit is contained in:
Matt Arsenault 2019-01-31 01:49:58 +00:00
parent 025e03d62b
commit 8db2001d52
2 changed files with 21 additions and 26 deletions

View File

@ -568,20 +568,18 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
LLT OffsetTy = LLT::scalar( LLT OffsetTy = LLT::scalar(
MRI.getType(MI.getOperand(1).getReg()).getScalarSizeInBits()); MRI.getType(MI.getOperand(1).getReg()).getScalarSizeInBits());
MachineFunction &MF = MIRBuilder.getMF();
SmallVector<unsigned, 2> DstRegs; SmallVector<unsigned, 2> DstRegs;
for (int i = 0; i < NumParts; ++i) { for (int i = 0; i < NumParts; ++i) {
unsigned PartDstReg = MRI.createGenericVirtualRegister(NarrowTy); unsigned PartDstReg = MRI.createGenericVirtualRegister(NarrowTy);
unsigned SrcReg = 0; unsigned SrcReg = 0;
unsigned Adjustment = i * NarrowSize / 8; unsigned Offset = i * NarrowSize / 8;
unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment);
MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand( MachineMemOperand *SplitMMO =
MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(), MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8);
NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(),
MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering());
MIRBuilder.materializeGEP(SrcReg, MI.getOperand(1).getReg(), OffsetTy, MIRBuilder.materializeGEP(SrcReg, MI.getOperand(1).getReg(), OffsetTy,
Adjustment); Offset);
MIRBuilder.buildLoad(PartDstReg, SrcReg, *SplitMMO); MIRBuilder.buildLoad(PartDstReg, SrcReg, *SplitMMO);
@ -684,18 +682,16 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
SmallVector<unsigned, 2> SrcRegs; SmallVector<unsigned, 2> SrcRegs;
extractParts(MI.getOperand(0).getReg(), NarrowTy, NumParts, SrcRegs); extractParts(MI.getOperand(0).getReg(), NarrowTy, NumParts, SrcRegs);
MachineFunction &MF = MIRBuilder.getMF();
for (int i = 0; i < NumParts; ++i) { for (int i = 0; i < NumParts; ++i) {
unsigned DstReg = 0; unsigned DstReg = 0;
unsigned Adjustment = i * NarrowSize / 8; unsigned Offset = i * NarrowSize / 8;
unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment);
MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand( MachineMemOperand *SplitMMO =
MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(), MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8);
NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(),
MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering());
MIRBuilder.materializeGEP(DstReg, MI.getOperand(1).getReg(), OffsetTy, MIRBuilder.materializeGEP(DstReg, MI.getOperand(1).getReg(), OffsetTy,
Adjustment); Offset);
MIRBuilder.buildStore(SrcRegs[i], DstReg, *SplitMMO); MIRBuilder.buildStore(SrcRegs[i], DstReg, *SplitMMO);
} }

View File

@ -395,19 +395,18 @@ MachineMemOperand *MachineFunction::getMachineMemOperand(
MachineMemOperand * MachineMemOperand *
MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO, MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
int64_t Offset, uint64_t Size) { int64_t Offset, uint64_t Size) {
if (MMO->getValue()) const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
return new (Allocator)
MachineMemOperand(MachinePointerInfo(MMO->getValue(), // If there is no pointer value, the offset isn't tracked so we need to adjust
MMO->getOffset()+Offset), // the base alignment.
MMO->getFlags(), Size, MMO->getBaseAlignment(), unsigned Align = PtrInfo.V.isNull()
AAMDNodes(), nullptr, MMO->getSyncScopeID(), ? MinAlign(MMO->getBaseAlignment(), Offset)
MMO->getOrdering(), MMO->getFailureOrdering()); : MMO->getBaseAlignment();
return new (Allocator) return new (Allocator)
MachineMemOperand(MachinePointerInfo(MMO->getPseudoValue(), MachineMemOperand(PtrInfo.getWithOffset(Offset), MMO->getFlags(), Size,
MMO->getOffset()+Offset), Align, AAMDNodes(), nullptr, MMO->getSyncScopeID(),
MMO->getFlags(), Size, MMO->getBaseAlignment(), MMO->getOrdering(), MMO->getFailureOrdering());
AAMDNodes(), nullptr, MMO->getSyncScopeID(),
MMO->getOrdering(), MMO->getFailureOrdering());
} }
MachineMemOperand * MachineMemOperand *