projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
When promoting the result of fp_to_uint/fp_to_sint,
[oota-llvm.git]
/
lib
/
CodeGen
/
StrongPHIElimination.cpp
diff --git
a/lib/CodeGen/StrongPHIElimination.cpp
b/lib/CodeGen/StrongPHIElimination.cpp
index f6aa44e2346d80a51466d1bce42a85d8f99f2232..5d7bc23694bf9100f033c606e0b892690ba79bf6 100644
(file)
--- 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*,
// 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::m
ultim
ap<unsigned, unsigned> > Waiting;
// Stacks holds the renaming stack for each register
std::map<unsigned, std::vector<unsigned> > Stacks;
// Stacks holds the renaming stack for each register
std::map<unsigned, std::vector<unsigned> > Stacks;
@@
-295,7
+295,7
@@
static bool isLiveIn(unsigned r, MachineBasicBlock* MBB,
LiveIntervals& LI) {
LiveInterval& I = LI.getOrCreateInterval(r);
unsigned idx = LI.getMBBStartIdx(MBB);
LiveIntervals& LI) {
LiveInterval& I = LI.getOrCreateInterval(r);
unsigned idx = LI.getMBBStartIdx(MBB);
- return I.live
BeforeAnd
At(idx);
+ return I.liveAt(idx);
}
/// isLiveOut - help method that determines, from a regno, if a register is
}
/// isLiveOut - help method that determines, from a regno, if a register is
@@
-647,13
+647,13
@@
void StrongPHIElimination::processPHIUnion(MachineInstr* Inst,
void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
std::set<unsigned>& pushed) {
// FIXME: This function needs to update LiveIntervals
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::m
ultim
ap<unsigned, unsigned>& copy_set= Waiting[MBB];
- std::map<unsigned, unsigned> worklist;
+ std::m
ultim
ap<unsigned, unsigned> worklist;
std::map<unsigned, unsigned> map;
// Setup worklist of initial copies
std::map<unsigned, unsigned> map;
// Setup worklist of initial copies
- for (std::map<unsigned, unsigned>::iterator I = copy_set.begin(),
+ for (std::m
ultim
ap<unsigned, unsigned>::iterator I = copy_set.begin(),
E = copy_set.end(); I != E; ) {
map.insert(std::make_pair(I->first, I->first));
map.insert(std::make_pair(I->second, I->second));
E = copy_set.end(); I != E; ) {
map.insert(std::make_pair(I->first, I->first));
map.insert(std::make_pair(I->second, I->second));
@@
-662,9
+662,9
@@
void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
worklist.insert(*I);
// Avoid iterator invalidation
worklist.insert(*I);
// 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 {
++I;
}
} 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()) {
// 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);
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);
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);
// 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;
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.
// 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...
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::m
ultim
ap<unsigned, unsigned>::iterator I = copy_set.begin(),
E = copy_set.end(); I != E; )
if (curr.first == I->second) {
std::pair<unsigned, unsigned> temp = *I;
E = copy_set.end(); I != E; )
if (curr.first == I->second) {
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);
- worklist.insert(temp);
+ copy_set.erase(OI);
break;
} else {
break;
} 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();
-
copy_set.erase(curr.first)
;
+ std::
multimap<unsigned, unsigned>::iterator CI =
copy_set.begin();
+
std::pair<unsigned, unsigned> curr = *CI
;
worklist.insert(curr);
worklist.insert(curr);
+ copy_set.erase(CI);
LiveInterval& I = LI.getInterval(curr.second);
MachineBasicBlock::iterator term = MBB->getFirstTerminator();
LiveInterval& I = LI.getInterval(curr.second);
MachineBasicBlock::iterator term = MBB->getFirstTerminator();
@@
-805,7
+812,7
@@
void StrongPHIElimination::InsertCopies(MachineDomTreeNode* MDTN,
continue;
for (unsigned i = 0; i < I->getNumOperands(); ++i)
continue;
for (unsigned i = 0; i < I->getNumOperands(); ++i)
- if (I->getOperand(i).isReg
ister
() &&
+ if (I->getOperand(i).isReg() &&
Stacks[I->getOperand(i).getReg()].size()) {
// Remove the live range for the old vreg.
LiveInterval& OldInt = LI.getInterval(I->getOperand(i).getReg());
Stacks[I->getOperand(i).getReg()].size()) {
// Remove the live range for the old vreg.
LiveInterval& OldInt = LI.getInterval(I->getOperand(i).getReg());
@@
-977,6
+984,11
@@
bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {
}
}
}
}
+ LiveInterval& Int = LI.getOrCreateInterval(I->first);
+ const LiveRange* LR =
+ Int.getLiveRangeContaining(LI.getMBBEndIdx(SI->second));
+ LR->valno->hasPHIKill = true;
+
I->second.erase(SI->first);
}
I->second.erase(SI->first);
}