summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/RegAllocLinearScan.cpp
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-22 19:24:43 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-22 19:24:43 +0000
commit4716d76d22a25b944e5cb9c8202dc2b70eee6eec (patch)
tree0392c354c28d76e5b151bc25eeb9fd091c60a633 /llvm/lib/CodeGen/RegAllocLinearScan.cpp
parent19638ab2bde4154cc929b84e0ae59e60ca48d5b6 (diff)
downloadbcm5719-llvm-4716d76d22a25b944e5cb9c8202dc2b70eee6eec.tar.gz
bcm5719-llvm-4716d76d22a25b944e5cb9c8202dc2b70eee6eec.zip
Improve debugging output. Remove unneeded virtReg->0 mapping when
virtReg lives on the stack. Now a virtual register has an entry in the virtual->physical map or the virtual->stack slot map but never in both. llvm-svn: 10958
Diffstat (limited to 'llvm/lib/CodeGen/RegAllocLinearScan.cpp')
-rw-r--r--llvm/lib/CodeGen/RegAllocLinearScan.cpp51
1 files changed, 31 insertions, 20 deletions
diff --git a/llvm/lib/CodeGen/RegAllocLinearScan.cpp b/llvm/lib/CodeGen/RegAllocLinearScan.cpp
index 449fc4ed30a..23c50cae8be 100644
--- a/llvm/lib/CodeGen/RegAllocLinearScan.cpp
+++ b/llvm/lib/CodeGen/RegAllocLinearScan.cpp
@@ -152,13 +152,18 @@ namespace {
memcpy(regUse_, regUseBackup_, sizeof(regUseBackup_));
}
- void printVirt2PhysMap() const {
- std::cerr << "allocated registers:\n";
+ void printVirtRegAssignment() const {
+ std::cerr << "register assignment:\n";
for (Virt2PhysMap::const_iterator
i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
+ assert(i->second != 0);
std::cerr << '[' << i->first << ','
<< mri_->getName(i->second) << "]\n";
}
+ for (Virt2StackSlotMap::const_iterator
+ i = v2ssMap_.begin(), e = v2ssMap_.end(); i != e; ++i) {
+ std::cerr << '[' << i->first << ",ss#" << i->second << "]\n";
+ }
std::cerr << '\n';
}
@@ -320,7 +325,7 @@ bool RA::runOnMachineFunction(MachineFunction &fn) {
inactive_.clear();
DEBUG(std::cerr << "finished register allocation\n");
- DEBUG(printVirt2PhysMap());
+ DEBUG(printVirtRegAssignment());
DEBUG(std::cerr << "Rewrite machine code:\n");
for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
@@ -341,11 +346,11 @@ bool RA::runOnMachineFunction(MachineFunction &fn) {
MachineOperand& op = (*currentInstr_)->getOperand(i);
if (op.isVirtualRegister()) {
unsigned virtReg = op.getAllocatedRegNum();
- unsigned physReg = v2pMap_[virtReg];
- if (physReg) {
- DEBUG(std::cerr << "\t\t\t%reg" << virtReg
- << " -> " << mri_->getName(physReg) << '\n');
- (*currentInstr_)->SetMachineOperandReg(i, physReg);
+ Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
+ if (it != v2pMap_.end()) {
+ DEBUG(std::cerr << "\t\t\t%reg" << it->second
+ << " -> " << mri_->getName(it->second) << '\n');
+ (*currentInstr_)->SetMachineOperandReg(i, it->second);
}
}
}
@@ -357,8 +362,12 @@ bool RA::runOnMachineFunction(MachineFunction &fn) {
MachineOperand& op = (*currentInstr_)->getOperand(i);
if (op.isVirtualRegister() && op.isUse() && !op.isDef()) {
unsigned virtReg = op.getAllocatedRegNum();
- unsigned physReg = v2pMap_[virtReg];
- if (!physReg) {
+ unsigned physReg = 0;
+ Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
+ if (it != v2pMap_.end()) {
+ physReg = it->second;
+ }
+ else {
physReg = getFreeTempPhysReg(virtReg);
loadVirt2PhysReg(virtReg, physReg);
tempUseOperands_.push_back(virtReg);
@@ -380,8 +389,12 @@ bool RA::runOnMachineFunction(MachineFunction &fn) {
MachineOperand& op = (*currentInstr_)->getOperand(i);
if (op.isVirtualRegister() && op.isDef()) {
unsigned virtReg = op.getAllocatedRegNum();
- unsigned physReg = v2pMap_[virtReg];
- if (!physReg) {
+ unsigned physReg = 0;
+ Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
+ if (it != v2pMap_.end()) {
+ physReg = it->second;
+ }
+ else {
physReg = getFreeTempPhysReg(virtReg);
}
if (op.isUse()) { // def and use
@@ -563,6 +576,8 @@ void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
minReg = reg;
}
}
+ DEBUG(std::cerr << "\t\t\tregister with min weight: "
+ << mri_->getName(minReg) << " (" << minWeight << ")\n");
if (cur->weight < minWeight) {
restoreRegUse();
@@ -570,7 +585,6 @@ void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
assignVirt2StackSlot(cur->reg);
}
else {
- DEBUG(std::cerr << "\t\t\t\tfreeing: " << mri_->getName(minReg) << '\n');
std::set<unsigned> toSpill;
toSpill.insert(minReg);
for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
@@ -674,7 +688,9 @@ unsigned RA::getFreeTempPhysReg(unsigned virtReg)
void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
{
- v2pMap_[virtReg] = physReg;
+ bool inserted = v2pMap_.insert(std::make_pair(virtReg, physReg)).second;
+ assert(inserted && "attempting to assign a virt->phys mapping to an "
+ "already mapped register");
markPhysRegNotFree(physReg);
}
@@ -685,8 +701,7 @@ void RA::clearVirtReg(unsigned virtReg)
"attempting to clear a not allocated virtual register");
unsigned physReg = it->second;
markPhysRegFree(physReg);
- v2pMap_[virtReg] = 0; // this marks that this virtual register
- // lives on the stack
+ v2pMap_.erase(it);
DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
<< "\n");
}
@@ -704,10 +719,6 @@ void RA::assignVirt2StackSlot(unsigned virtReg)
if (v2pMap_.find(virtReg) != v2pMap_.end()) {
clearVirtReg(virtReg);
}
- else {
- v2pMap_[virtReg] = 0; // this marks that this virtual register
- // lives on the stack
- }
}
int RA::getStackSlot(unsigned virtReg)
OpenPOWER on IntegriCloud