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 | dd96e97317064b21a882f15baf75cb2beb2b2e30 (patch) | |
tree | fb334e3e903cbb2116606e67f012df9b527b9b89 /llvm/lib/Target | |
parent | d7c2fc7a736acb470789e87eaf127821d3cd3d02 (diff) | |
download | bcm5719-llvm-dd96e97317064b21a882f15baf75cb2beb2b2e30.tar.gz bcm5719-llvm-dd96e97317064b21a882f15baf75cb2beb2b2e30.zip |
Make sure ARM multi load / store pass copies memoperands when forming ldrd / strd. pr8113.
llvm-svn: 119109
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index b1367883338..bda92e6e68c 100644 --- a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/llvm/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); |