aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2010-11-15 03:30:30 +0000
committerEvan Cheng <evan.cheng@apple.com>2010-11-15 03:30:30 +0000
commitfbc8c67992d8c8b0f4ea07b29cf31a4f0c1b28fe (patch)
tree96bd4b8d32ad043e739ea537300deb2988994ab1 /lib
parent3a4dd305ac7a3ddce109b359c8994c1a7868316a (diff)
downloadexternal_llvm-fbc8c67992d8c8b0f4ea07b29cf31a4f0c1b28fe.zip
external_llvm-fbc8c67992d8c8b0f4ea07b29cf31a4f0c1b28fe.tar.gz
external_llvm-fbc8c67992d8c8b0f4ea07b29cf31a4f0c1b28fe.tar.bz2
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')
-rw-r--r--lib/Target/ARM/ARMLoadStoreOptimizer.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp
index b136788..bda92e6 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);