diff options
author | Owen Anderson <resistor@mac.com> | 2008-01-08 21:54:52 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-01-08 21:54:52 +0000 |
commit | 1b0d5c747e1d9b274380a41faa7f3e5280c3c083 (patch) | |
tree | 1164f9932f868b7f1a194ce6669012e945678735 | |
parent | 7b1460cca411a3af907777c844d1c881470e0dcc (diff) | |
download | bcm5719-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.cpp | 22 |
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; } |