diff options
author | Hao Liu <Hao.Liu@arm.com> | 2013-04-18 09:11:08 +0000 |
---|---|---|
committer | Hao Liu <Hao.Liu@arm.com> | 2013-04-18 09:11:08 +0000 |
commit | a2ff69863e21ae7cabd1372700b6a5baf117558f (patch) | |
tree | 38f95750fa3dffdacbb42d858ff38fed68e17e04 /llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | |
parent | 81af06e0033573c479c79b4559d41fcde854df8f (diff) | |
download | llvm-a2ff69863e21ae7cabd1372700b6a5baf117558f.zip llvm-a2ff69863e21ae7cabd1372700b6a5baf117558f.tar.gz llvm-a2ff69863e21ae7cabd1372700b6a5baf117558f.tar.bz2 |
Fix for PR14824, An ARM Load/Store Optimization bug
llvm-svn: 179751
Diffstat (limited to 'llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index e4e683c..c8ed576 100644 --- a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -1258,6 +1258,22 @@ bool ARMLoadStoreOpt::LoadStoreMultipleOpti(MachineBasicBlock &MBB) { // merge the ldr's so far, including this one. But don't try to // combine the following ldr(s). Clobber = (isi32Load(Opcode) && Base == MBBI->getOperand(0).getReg()); + + // Watch out for: + // r4 := ldr [r0, #8] + // r4 := ldr [r0, #4] + // + // The optimization may reorder the second ldr in front of the first + // ldr, which violates write after write(WAW) dependence. The same as + // str. Try to merge inst(s) already in MemOps. + bool Overlap = false; + for (MemOpQueueIter I = MemOps.begin(), E = MemOps.end(); I != E; ++I) { + if (TRI->regsOverlap(Reg, I->MBBI->getOperand(0).getReg())) { + Overlap = true; + break; + } + } + if (CurrBase == 0 && !Clobber) { // Start of a new chain. CurrBase = Base; @@ -1268,7 +1284,7 @@ bool ARMLoadStoreOpt::LoadStoreMultipleOpti(MachineBasicBlock &MBB) { MemOps.push_back(MemOpQueueEntry(Offset, Reg, isKill, Position, MBBI)); ++NumMemOps; Advance = true; - } else { + } else if (!Overlap) { if (Clobber) { TryMerge = true; Advance = true; |