Rename registers that do not need copies.
authorOwen Anderson <resistor@mac.com>
Tue, 8 Jan 2008 21:54:52 +0000 (21:54 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 8 Jan 2008 21:54:52 +0000 (21:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45759 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StrongPHIElimination.cpp

index dbf3d5c2706350aa99c0af3fc86a542fd47bae3d..3b201f7b8188a09fd4448ec97161c5d93be70167 100644 (file)
@@ -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;
 }