Make sure ARM multi load / store pass copies memoperands when forming ldrd / strd. pr8113.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119109 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2010-11-15 03:30:30 +00:00
parent 3a4dd305ac
commit fbc8c67992

View File

@ -1380,6 +1380,14 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
return true; return true;
} }
static MachineMemOperand *CopyMMO(const MachineMemOperand *MMO,
unsigned NewSize, MachineFunction *MF) {
return MF->getMachineMemOperand(MachinePointerInfo(MMO->getValue(),
MMO->getOffset()),
MMO->getFlags(), NewSize,
MMO->getAlignment(), MMO->getTBAAInfo());
}
bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB, bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
SmallVector<MachineInstr*, 4> &Ops, SmallVector<MachineInstr*, 4> &Ops,
unsigned Base, bool isLd, unsigned Base, bool isLd,
@ -1487,6 +1495,11 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
if (!isT2) if (!isT2)
MIB.addReg(0); MIB.addReg(0);
MIB.addImm(Offset).addImm(Pred).addReg(PredReg); MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
// Copy memoperands bug change size to 8.
for (MachineInstr::mmo_iterator mmo = Op0->memoperands_begin();
mmo != Op0->memoperands_end(); ++mmo)
MIB.addMemOperand(CopyMMO(*mmo, 8, MF));
++NumLDRDFormed; ++NumLDRDFormed;
} else { } else {
MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos,
@ -1500,6 +1513,10 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
if (!isT2) if (!isT2)
MIB.addReg(0); MIB.addReg(0);
MIB.addImm(Offset).addImm(Pred).addReg(PredReg); MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
// Copy memoperands bug change size to 8.
for (MachineInstr::mmo_iterator mmo = Op0->memoperands_begin();
mmo != Op0->memoperands_end(); ++mmo)
MIB.addMemOperand(CopyMMO(*mmo, 8, MF));
++NumSTRDFormed; ++NumSTRDFormed;
} }
MBB->erase(Op0); MBB->erase(Op0);