aboutsummaryrefslogtreecommitdiff
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
commit0c5714bb9944ed085fb5854ac4c6abf941c532ed (patch)
tree1887645c89a1d079df0c1ae8956c60c34dc70b44
parent2815cbb9c77019b8681db8494ca00b07f77413e9 (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.cpp22
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;
}