diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-12-23 21:34:03 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-12-23 21:34:03 +0000 |
| commit | 398932a619d4b170a324cc20fb73754861e14893 (patch) | |
| tree | 91f909512ed090bfdc424ab5d18990661bc7db3c /llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | |
| parent | f0a9ba37d46144947c215482f033e110acca2c12 (diff) | |
| download | bcm5719-llvm-398932a619d4b170a324cc20fb73754861e14893.tar.gz bcm5719-llvm-398932a619d4b170a324cc20fb73754861e14893.zip | |
Move kill flags when the same register occurs more than once in a sequence.
llvm-svn: 92058
Diffstat (limited to 'llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index 755f0a04919..b13f98acb78 100644 --- a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -282,9 +282,22 @@ MergeOpsUpdate(MachineBasicBlock &MBB, // First calculate which of the registers should be killed by the merged // instruction. SmallVector<std::pair<unsigned, bool>, 8> Regs; + const unsigned insertPos = memOps[insertAfter].Position; for (unsigned i = memOpsBegin; i < memOpsEnd; ++i) { const MachineOperand &MO = memOps[i].MBBI->getOperand(0); - Regs.push_back(std::make_pair(MO.getReg(), MO.isKill())); + unsigned Reg = MO.getReg(); + bool isKill = MO.isKill(); + + // If we are inserting the merged operation after an unmerged operation that + // uses the same register, make sure to transfer any kill flag. + for (unsigned j = memOpsEnd, e = memOps.size(); !isKill && j != e; ++j) + if (memOps[j].Position<insertPos) { + const MachineOperand &MOJ = memOps[j].MBBI->getOperand(0); + if (MOJ.getReg() == Reg && MOJ.isKill()) + isKill = true; + } + + Regs.push_back(std::make_pair(Reg, isKill)); } // Try to do the merge. @@ -297,6 +310,14 @@ MergeOpsUpdate(MachineBasicBlock &MBB, // Merge succeeded, update records. Merges.push_back(prior(Loc)); for (unsigned i = memOpsBegin; i < memOpsEnd; ++i) { + // Remove kill flags from any unmerged memops that come before insertPos. + if (Regs[i-memOpsBegin].second) + for (unsigned j = memOpsEnd, e = memOps.size(); j != e; ++j) + if (memOps[j].Position<insertPos) { + MachineOperand &MOJ = memOps[j].MBBI->getOperand(0); + if (MOJ.getReg() == Regs[i-memOpsBegin].first && MOJ.isKill()) + MOJ.setIsKill(false); + } MBB.erase(memOps[i].MBBI); memOps[i].Merged = true; } |

