summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-01-08 21:54:52 +0000
committerOwen Anderson <resistor@mac.com>2008-01-08 21:54:52 +0000
commit1b0d5c747e1d9b274380a41faa7f3e5280c3c083 (patch)
tree1164f9932f868b7f1a194ce6669012e945678735
parent7b1460cca411a3af907777c844d1c881470e0dcc (diff)
downloadbcm5719-llvm-1b0d5c747e1d9b274380a41faa7f3e5280c3c083.tar.gz
bcm5719-llvm-1b0d5c747e1d9b274380a41faa7f3e5280c3c083.zip
Rename registers that do not need copies.
llvm-svn: 45759
-rw-r--r--llvm/lib/CodeGen/StrongPHIElimination.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/StrongPHIElimination.cpp b/llvm/lib/CodeGen/StrongPHIElimination.cpp
index dbf3d5c2706..3b201f7b818 100644
--- a/llvm/lib/CodeGen/StrongPHIElimination.cpp
+++ b/llvm/lib/CodeGen/StrongPHIElimination.cpp
@@ -44,6 +44,7 @@ namespace {
std::map<unsigned, std::vector<unsigned> > Stacks;
std::set<unsigned> UsedByAnother;
+ std::map<unsigned, std::set<unsigned> > RenameSets;
bool runOnMachineFunction(MachineFunction &Fn);
@@ -442,7 +443,8 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
}
}
- // FIXME: Cache renaming information
+ // Cache renaming information
+ RenameSets.insert(std::make_pair(P->getOperand(0).getReg(), PHIUnion));
ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
++P;
@@ -649,8 +651,22 @@ bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {
// FIXME: This process should probably preserve LiveVariables
InsertCopies(Fn.begin());
- // FIXME: Perform renaming
- // FIXME: Remove Phi instrs
+ // Perform renaming
+ typedef std::map<unsigned, std::set<unsigned> > RenameSetType;
+ for (RenameSetType::iterator I = RenameSets.begin(), E = RenameSets.end();
+ I != E; ++I)
+ for (std::set<unsigned>::iterator SI = I->second.begin(),
+ SE = I->second.end(); SI != SE; ++SI)
+ Fn.getRegInfo().replaceRegWith(*SI, I->first);
+
+ // FIXME: Insert last-minute copies
+
+ // Remove PHIs
+ for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
+ for (MachineBasicBlock::iterator BI = I->begin(), BE = I->end();
+ BI != BE; ++BI)
+ if (BI->getOpcode() == TargetInstrInfo::PHI)
+ BI->eraseFromParent();
return false;
}
OpenPOWER on IntegriCloud