aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-10-02 19:40:33 +0000
committerOwen Anderson <resistor@mac.com>2008-10-02 19:40:33 +0000
commit8481ee7f521de7e5c82b4c0773e37ce8410271cd (patch)
tree1963c85c47c39620cdc254b4351147583214a398
parent48c1bc2ace6481d3272ab5c18e1f19352c563be8 (diff)
Use a multimap rather than a map for holding the list of copies to insert, so we don't lose copies when two of them have
the same source. I don't know what I was thinking when I wrote this originally. Note: There's probably a more efficient way to do this, but I need to think about it some more, and about what determinism guarantees need to be present. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56964 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/StrongPHIElimination.cpp31
1 files changed, 19 insertions, 12 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp
index c277d56f7c..15e097b1a4 100644
--- a/lib/CodeGen/StrongPHIElimination.cpp
+++ b/lib/CodeGen/StrongPHIElimination.cpp
@@ -44,7 +44,7 @@ namespace {
// Waiting stores, for each MBB, the set of copies that need to
// be inserted into that MBB
DenseMap<MachineBasicBlock*,
- std::map<unsigned, unsigned> > Waiting;
+ std::multimap<unsigned, unsigned> > Waiting;
// Stacks holds the renaming stack for each register
std::map<unsigned, std::vector<unsigned> > Stacks;
@@ -647,9 +647,9 @@ void StrongPHIElimination::processPHIUnion(MachineInstr* Inst,
void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
std::set<unsigned>& pushed) {
// FIXME: This function needs to update LiveIntervals
- std::map<unsigned, unsigned>& copy_set= Waiting[MBB];
+ std::multimap<unsigned, unsigned>& copy_set= Waiting[MBB];
- std::map<unsigned, unsigned> worklist;
+ std::multimap<unsigned, unsigned> worklist;
std::map<unsigned, unsigned> map;
// Setup worklist of initial copies
@@ -662,9 +662,9 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
worklist.insert(*I);
// Avoid iterator invalidation
- unsigned first = I->first;
+ std::multimap<unsigned, unsigned>::iterator OI = I;
++I;
- copy_set.erase(first);
+ copy_set.erase(OI);
} else {
++I;
}
@@ -680,8 +680,9 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
// Iterate over the worklist, inserting copies
while (!worklist.empty() || !copy_set.empty()) {
while (!worklist.empty()) {
- std::pair<unsigned, unsigned> curr = *worklist.begin();
- worklist.erase(curr.first);
+ std::multimap<unsigned, unsigned>::iterator WI = worklist.begin();
+ std::pair<unsigned, unsigned> curr = *WI;
+ worklist.erase(WI);
const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(curr.first);
@@ -695,6 +696,8 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
TII->copyRegToReg(*PI->getParent(), PI, t,
curr.second, RC, RC);
+ DOUT << "Inserted copy from " << curr.second << " to " << t << "\n";
+
// Push temporary on Stacks
Stacks[curr.second].push_back(t);
@@ -709,6 +712,8 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
TII->copyRegToReg(*MBB, MBB->getFirstTerminator(), curr.second,
map[curr.first], RC, RC);
map[curr.first] = curr.second;
+ DOUT << "Inserted copy from " << curr.first << " to "
+ << curr.second << "\n";
// Push this copy onto InsertedPHICopies so we can
// update LiveIntervals with it.
@@ -716,15 +721,16 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
InsertedPHIDests.push_back(std::make_pair(curr.second, --MI));
// If curr.first is a destination in copy_set...
- for (std::map<unsigned, unsigned>::iterator I = copy_set.begin(),
+ for (std::multimap<unsigned, unsigned>::iterator I = copy_set.begin(),
E = copy_set.end(); I != E; )
if (curr.first == I->second) {
std::pair<unsigned, unsigned> temp = *I;
+ worklist.insert(temp);
// Avoid iterator invalidation
+ std::multimap<unsigned, unsigned>::iterator OI = I;
++I;
- copy_set.erase(temp.first);
- worklist.insert(temp);
+ copy_set.erase(OI);
break;
} else {
@@ -733,9 +739,10 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
}
if (!copy_set.empty()) {
- std::pair<unsigned, unsigned> curr = *copy_set.begin();
- copy_set.erase(curr.first);
+ std::multimap<unsigned, unsigned>::iterator CI = copy_set.begin();
+ std::pair<unsigned, unsigned> curr = *CI;
worklist.insert(curr);
+ copy_set.erase(CI);
LiveInterval& I = LI.getInterval(curr.second);
MachineBasicBlock::iterator term = MBB->getFirstTerminator();