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 | 0c5714bb9944ed085fb5854ac4c6abf941c532ed (patch) | |
tree | 1887645c89a1d079df0c1ae8956c60c34dc70b44 | |
parent | 2815cbb9c77019b8681db8494ca00b07f77413e9 (diff) |
Rename registers that do not need copies.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45759 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/StrongPHIElimination.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index dbf3d5c270..3b201f7b81 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/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; } |