mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-20 09:24:58 +00:00
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
This commit is contained in:
parent
48c1bc2ace
commit
8481ee7f52
@ -44,7 +44,7 @@ namespace {
|
|||||||
// Waiting stores, for each MBB, the set of copies that need to
|
// Waiting stores, for each MBB, the set of copies that need to
|
||||||
// be inserted into that MBB
|
// be inserted into that MBB
|
||||||
DenseMap<MachineBasicBlock*,
|
DenseMap<MachineBasicBlock*,
|
||||||
std::map<unsigned, unsigned> > Waiting;
|
std::multimap<unsigned, unsigned> > Waiting;
|
||||||
|
|
||||||
// Stacks holds the renaming stack for each register
|
// Stacks holds the renaming stack for each register
|
||||||
std::map<unsigned, std::vector<unsigned> > Stacks;
|
std::map<unsigned, std::vector<unsigned> > Stacks;
|
||||||
@ -647,9 +647,9 @@ void StrongPHIElimination::processPHIUnion(MachineInstr* Inst,
|
|||||||
void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
||||||
std::set<unsigned>& pushed) {
|
std::set<unsigned>& pushed) {
|
||||||
// FIXME: This function needs to update LiveIntervals
|
// 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;
|
std::map<unsigned, unsigned> map;
|
||||||
|
|
||||||
// Setup worklist of initial copies
|
// Setup worklist of initial copies
|
||||||
@ -662,9 +662,9 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
worklist.insert(*I);
|
worklist.insert(*I);
|
||||||
|
|
||||||
// Avoid iterator invalidation
|
// Avoid iterator invalidation
|
||||||
unsigned first = I->first;
|
std::multimap<unsigned, unsigned>::iterator OI = I;
|
||||||
++I;
|
++I;
|
||||||
copy_set.erase(first);
|
copy_set.erase(OI);
|
||||||
} else {
|
} else {
|
||||||
++I;
|
++I;
|
||||||
}
|
}
|
||||||
@ -680,8 +680,9 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
// Iterate over the worklist, inserting copies
|
// Iterate over the worklist, inserting copies
|
||||||
while (!worklist.empty() || !copy_set.empty()) {
|
while (!worklist.empty() || !copy_set.empty()) {
|
||||||
while (!worklist.empty()) {
|
while (!worklist.empty()) {
|
||||||
std::pair<unsigned, unsigned> curr = *worklist.begin();
|
std::multimap<unsigned, unsigned>::iterator WI = worklist.begin();
|
||||||
worklist.erase(curr.first);
|
std::pair<unsigned, unsigned> curr = *WI;
|
||||||
|
worklist.erase(WI);
|
||||||
|
|
||||||
const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(curr.first);
|
const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(curr.first);
|
||||||
|
|
||||||
@ -695,6 +696,8 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
TII->copyRegToReg(*PI->getParent(), PI, t,
|
TII->copyRegToReg(*PI->getParent(), PI, t,
|
||||||
curr.second, RC, RC);
|
curr.second, RC, RC);
|
||||||
|
|
||||||
|
DOUT << "Inserted copy from " << curr.second << " to " << t << "\n";
|
||||||
|
|
||||||
// Push temporary on Stacks
|
// Push temporary on Stacks
|
||||||
Stacks[curr.second].push_back(t);
|
Stacks[curr.second].push_back(t);
|
||||||
|
|
||||||
@ -709,6 +712,8 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
TII->copyRegToReg(*MBB, MBB->getFirstTerminator(), curr.second,
|
TII->copyRegToReg(*MBB, MBB->getFirstTerminator(), curr.second,
|
||||||
map[curr.first], RC, RC);
|
map[curr.first], RC, RC);
|
||||||
map[curr.first] = curr.second;
|
map[curr.first] = curr.second;
|
||||||
|
DOUT << "Inserted copy from " << curr.first << " to "
|
||||||
|
<< curr.second << "\n";
|
||||||
|
|
||||||
// Push this copy onto InsertedPHICopies so we can
|
// Push this copy onto InsertedPHICopies so we can
|
||||||
// update LiveIntervals with it.
|
// update LiveIntervals with it.
|
||||||
@ -716,15 +721,16 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
InsertedPHIDests.push_back(std::make_pair(curr.second, --MI));
|
InsertedPHIDests.push_back(std::make_pair(curr.second, --MI));
|
||||||
|
|
||||||
// If curr.first is a destination in copy_set...
|
// 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; )
|
E = copy_set.end(); I != E; )
|
||||||
if (curr.first == I->second) {
|
if (curr.first == I->second) {
|
||||||
std::pair<unsigned, unsigned> temp = *I;
|
std::pair<unsigned, unsigned> temp = *I;
|
||||||
|
worklist.insert(temp);
|
||||||
|
|
||||||
// Avoid iterator invalidation
|
// Avoid iterator invalidation
|
||||||
|
std::multimap<unsigned, unsigned>::iterator OI = I;
|
||||||
++I;
|
++I;
|
||||||
copy_set.erase(temp.first);
|
copy_set.erase(OI);
|
||||||
worklist.insert(temp);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
@ -733,9 +739,10 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!copy_set.empty()) {
|
if (!copy_set.empty()) {
|
||||||
std::pair<unsigned, unsigned> curr = *copy_set.begin();
|
std::multimap<unsigned, unsigned>::iterator CI = copy_set.begin();
|
||||||
copy_set.erase(curr.first);
|
std::pair<unsigned, unsigned> curr = *CI;
|
||||||
worklist.insert(curr);
|
worklist.insert(curr);
|
||||||
|
copy_set.erase(CI);
|
||||||
|
|
||||||
LiveInterval& I = LI.getInterval(curr.second);
|
LiveInterval& I = LI.getInterval(curr.second);
|
||||||
MachineBasicBlock::iterator term = MBB->getFirstTerminator();
|
MachineBasicBlock::iterator term = MBB->getFirstTerminator();
|
||||||
|
Loading…
Reference in New Issue
Block a user