diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-11-15 03:30:30 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-11-15 03:30:30 +0000 |
commit | fbc8c67992d8c8b0f4ea07b29cf31a4f0c1b28fe (patch) | |
tree | 96bd4b8d32ad043e739ea537300deb2988994ab1 /lib/Target/ARM/ARMLoadStoreOptimizer.cpp | |
parent | 3a4dd305ac7a3ddce109b359c8994c1a7868316a (diff) |
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
Diffstat (limited to 'lib/Target/ARM/ARMLoadStoreOptimizer.cpp')
-rw-r--r-- | lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index b136788333..bda92e6e68 100644 --- a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -1380,6 +1380,14 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1, 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, SmallVector<MachineInstr*, 4> &Ops, unsigned Base, bool isLd, @@ -1487,6 +1495,11 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB, if (!isT2) MIB.addReg(0); 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; } else { MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos, @@ -1500,6 +1513,10 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB, if (!isT2) MIB.addReg(0); 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; } MBB->erase(Op0); |