Skip to content

Commit 8db2001

Browse files
committed
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
1 parent 025e03d commit 8db2001

File tree

2 files changed

+21
-26
lines changed

2 files changed

+21
-26
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -568,20 +568,18 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
568568
LLT OffsetTy = LLT::scalar(
569569
MRI.getType(MI.getOperand(1).getReg()).getScalarSizeInBits());
570570

571+
MachineFunction &MF = MIRBuilder.getMF();
571572
SmallVector<unsigned, 2> DstRegs;
572573
for (int i = 0; i < NumParts; ++i) {
573574
unsigned PartDstReg = MRI.createGenericVirtualRegister(NarrowTy);
574575
unsigned SrcReg = 0;
575-
unsigned Adjustment = i * NarrowSize / 8;
576-
unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment);
576+
unsigned Offset = i * NarrowSize / 8;
577577

578-
MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand(
579-
MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(),
580-
NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(),
581-
MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering());
578+
MachineMemOperand *SplitMMO =
579+
MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8);
582580

583581
MIRBuilder.materializeGEP(SrcReg, MI.getOperand(1).getReg(), OffsetTy,
584-
Adjustment);
582+
Offset);
585583

586584
MIRBuilder.buildLoad(PartDstReg, SrcReg, *SplitMMO);
587585

@@ -684,18 +682,16 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
684682
SmallVector<unsigned, 2> SrcRegs;
685683
extractParts(MI.getOperand(0).getReg(), NarrowTy, NumParts, SrcRegs);
686684

685+
MachineFunction &MF = MIRBuilder.getMF();
687686
for (int i = 0; i < NumParts; ++i) {
688687
unsigned DstReg = 0;
689-
unsigned Adjustment = i * NarrowSize / 8;
690-
unsigned Alignment = MinAlign(MMO.getAlignment(), Adjustment);
688+
unsigned Offset = i * NarrowSize / 8;
691689

692-
MachineMemOperand *SplitMMO = MIRBuilder.getMF().getMachineMemOperand(
693-
MMO.getPointerInfo().getWithOffset(Adjustment), MMO.getFlags(),
694-
NarrowSize / 8, Alignment, MMO.getAAInfo(), MMO.getRanges(),
695-
MMO.getSyncScopeID(), MMO.getOrdering(), MMO.getFailureOrdering());
690+
MachineMemOperand *SplitMMO =
691+
MF.getMachineMemOperand(&MMO, Offset, NarrowSize / 8);
696692

697693
MIRBuilder.materializeGEP(DstReg, MI.getOperand(1).getReg(), OffsetTy,
698-
Adjustment);
694+
Offset);
699695

700696
MIRBuilder.buildStore(SrcRegs[i], DstReg, *SplitMMO);
701697
}

llvm/lib/CodeGen/MachineFunction.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -395,19 +395,18 @@ MachineMemOperand *MachineFunction::getMachineMemOperand(
395395
MachineMemOperand *
396396
MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
397397
int64_t Offset, uint64_t Size) {
398-
if (MMO->getValue())
399-
return new (Allocator)
400-
MachineMemOperand(MachinePointerInfo(MMO->getValue(),
401-
MMO->getOffset()+Offset),
402-
MMO->getFlags(), Size, MMO->getBaseAlignment(),
403-
AAMDNodes(), nullptr, MMO->getSyncScopeID(),
404-
MMO->getOrdering(), MMO->getFailureOrdering());
398+
const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
399+
400+
// If there is no pointer value, the offset isn't tracked so we need to adjust
401+
// the base alignment.
402+
unsigned Align = PtrInfo.V.isNull()
403+
? MinAlign(MMO->getBaseAlignment(), Offset)
404+
: MMO->getBaseAlignment();
405+
405406
return new (Allocator)
406-
MachineMemOperand(MachinePointerInfo(MMO->getPseudoValue(),
407-
MMO->getOffset()+Offset),
408-
MMO->getFlags(), Size, MMO->getBaseAlignment(),
409-
AAMDNodes(), nullptr, MMO->getSyncScopeID(),
410-
MMO->getOrdering(), MMO->getFailureOrdering());
407+
MachineMemOperand(PtrInfo.getWithOffset(Offset), MMO->getFlags(), Size,
408+
Align, AAMDNodes(), nullptr, MMO->getSyncScopeID(),
409+
MMO->getOrdering(), MMO->getFailureOrdering());
411410
}
412411

413412
MachineMemOperand *

0 commit comments

Comments
 (0)