forked from OSchip/llvm-project
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:
parent
025e03d62b
commit
8db2001d52
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -395,18 +395,17 @@ MachineMemOperand *MachineFunction::getMachineMemOperand(
|
|||
MachineMemOperand *
|
||||
MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
|
||||
int64_t Offset, uint64_t Size) {
|
||||
if (MMO->getValue())
|
||||
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->getValue(),
|
||||
MMO->getOffset()+Offset),
|
||||
MMO->getFlags(), Size, MMO->getBaseAlignment(),
|
||||
AAMDNodes(), nullptr, MMO->getSyncScopeID(),
|
||||
MMO->getOrdering(), MMO->getFailureOrdering());
|
||||
return new (Allocator)
|
||||
MachineMemOperand(MachinePointerInfo(MMO->getPseudoValue(),
|
||||
MMO->getOffset()+Offset),
|
||||
MMO->getFlags(), Size, MMO->getBaseAlignment(),
|
||||
AAMDNodes(), nullptr, MMO->getSyncScopeID(),
|
||||
MachineMemOperand(PtrInfo.getWithOffset(Offset), MMO->getFlags(), Size,
|
||||
Align, AAMDNodes(), nullptr, MMO->getSyncScopeID(),
|
||||
MMO->getOrdering(), MMO->getFailureOrdering());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue