From 4e369a14db0b38ecd3ca9c57433c68263cd59190 Mon Sep 17 00:00:00 2001
From: Owen Anderson <resistor@mac.com>
Date: Mon, 10 Dec 2007 08:07:09 +0000
Subject: A little more progress on StrongPHIElimination, now that I have a
 better sense of how the CodeGen machinery works.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44786 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/CodeGen/StrongPHIElimination.cpp | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp
index d023b59..fa7c10c 100644
--- a/lib/CodeGen/StrongPHIElimination.cpp
+++ b/lib/CodeGen/StrongPHIElimination.cpp
@@ -39,6 +39,9 @@ namespace {
     static char ID; // Pass identification, replacement for typeid
     StrongPHIElimination() : MachineFunctionPass((intptr_t)&ID) {}
 
+    DenseMap<MachineBasicBlock*,
+             SmallVector<std::pair<unsigned, unsigned>, 2> > Waiting;
+
     bool runOnMachineFunction(MachineFunction &Fn);
     
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
@@ -263,6 +266,8 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
   while (P->getOpcode() == TargetInstrInfo::PHI) {
     LiveVariables::VarInfo& PHIInfo = LV.getVarInfo(P->getOperand(0).getReg());
 
+    unsigned DestReg = P->getOperand(0).getReg();
+
     // Hold the names that are currently in the candidate set.
     std::set<unsigned> PHIUnion;
     std::set<MachineBasicBlock*> UnionedBlocks;
@@ -271,17 +276,17 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
       unsigned SrcReg = P->getOperand(i-1).getReg();
       LiveVariables::VarInfo& SrcInfo = LV.getVarInfo(SrcReg);
     
-      if (isLiveIn(SrcInfo, P->getParent())) {
+      // Check for trivial interferences
+      if (isLiveIn(SrcInfo, P->getParent()) ||
+          isLiveOut(PHIInfo, SrcInfo.DefInst->getParent()) ||
+          ( PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
+            isLiveIn(PHIInfo, SrcInfo.DefInst->getParent()) ) ||
+          ProcessedNames.count(SrcReg) ||
+          UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
+        
         // add a copy from a_i to p in Waiting[From[a_i]]
-      } else if (isLiveOut(PHIInfo, SrcInfo.DefInst->getParent())) {
-        // add a copy to Waiting[From[a_i]]
-      } else if (PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
-                 isLiveIn(PHIInfo, SrcInfo.DefInst->getParent())) {
-        // add a copy to Waiting[From[a_i]]
-      } else if (ProcessedNames.count(SrcReg)) {
-        // add a copy to Waiting[From[a_i]]
-      } else if (UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
-        // add a copy to Waiting[From[a_i]]
+        MachineBasicBlock* From = P->getOperand(i).getMachineBasicBlock();
+        Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
       } else {
         PHIUnion.insert(SrcReg);
         UnionedBlocks.insert(SrcInfo.DefInst->getParent());
@@ -291,7 +296,7 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
     std::vector<StrongPHIElimination::DomForestNode*> DF = 
                                                      computeDomForest(PHIUnion);
     
-    // DO STUFF HERE
+    // Walk DomForest to resolve interferences
     
     ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
     ++P;
-- 
cgit v1.1