Allow copy coalescing in more cases: if sum of node degrees is more than
authorVikram S. Adve <vadve@cs.uiuc.edu>
Fri, 20 Sep 2002 00:45:47 +0000 (00:45 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Fri, 20 Sep 2002 00:45:47 +0000 (00:45 +0000)
than #available regs, compute the sum excluding duplicates and if that
is less than #regs, go ahead and coalesce.
Add method IGNode::getCombinedDegree to count excluding duplicates.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3842 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAlloc/IGNode.cpp
lib/CodeGen/RegAlloc/LiveRangeInfo.cpp
lib/Target/SparcV9/RegAlloc/IGNode.cpp
lib/Target/SparcV9/RegAlloc/LiveRangeInfo.cpp

index c8fca7a23b6d380645299d6d0fa8a47324b0c186..caee2961664abb377cd3c80306993f9e6b65b849 100644 (file)
@@ -36,3 +36,19 @@ void IGNode::delAdjIGNode(const IGNode *Node) {
   assert( It != AdjList.end() );      // the node must be there
   AdjList.erase(It);
 }
+
+//-----------------------------------------------------------------------------
+// Get the number of unique neighbors if these two nodes are merged
+//-----------------------------------------------------------------------------
+
+unsigned
+IGNode::getCombinedDegree(const IGNode* otherNode) const
+{
+  std::vector<IGNode*> nbrs(AdjList);
+  nbrs.insert(nbrs.end(), otherNode->AdjList.begin(), otherNode->AdjList.end());
+  sort(nbrs.begin(), nbrs.end());
+  std::vector<IGNode*>::iterator new_end = unique(nbrs.begin(), nbrs.end());
+  return new_end - nbrs.begin();
+}
+
+
index 7ad70186663dc55dac2d8a1bb4a56adb354403f7..2037d8156825d1bbd7401f4800b8889b30f143d7 100644 (file)
@@ -318,6 +318,12 @@ void LiveRangeInfo::coalesceLRs()
                  LROfDef->getUserIGNode()->getNumOfNeighbors() + 
                  LROfUse->getUserIGNode()->getNumOfNeighbors();
 
+                if (CombinedDegree > RCOfDef->getNumOfAvailRegs()) {
+                  // get more precise estimate of combined degree
+                  CombinedDegree = LROfDef->getUserIGNode()->
+                    getCombinedDegree(LROfUse->getUserIGNode());
+                }
+
                if (CombinedDegree <= RCOfDef->getNumOfAvailRegs()) {
                  // if both LRs do not have suggested colors
                  if (!(LROfDef->hasSuggestedColor() &&  
@@ -353,7 +359,10 @@ void LiveRangeInfo::printLiveRanges() {
   for( ; HMI != LiveRangeMap.end(); ++HMI) {
     if (HMI->first && HMI->second) {
       cerr << " Value* " << RAV(HMI->first) << "\t: "; 
-      cerr << "LR# " << HMI->second->getUserIGNode()->getIndex();
+      if (IGNode* igNode = HMI->second->getUserIGNode())
+        cerr << "LR# " << igNode->getIndex();
+      else
+        cerr << "LR# " << "<no-IGNode>";
       cerr << "\t:Values = "; printSet(*HMI->second); cerr << "\n";
     }
   }
index c8fca7a23b6d380645299d6d0fa8a47324b0c186..caee2961664abb377cd3c80306993f9e6b65b849 100644 (file)
@@ -36,3 +36,19 @@ void IGNode::delAdjIGNode(const IGNode *Node) {
   assert( It != AdjList.end() );      // the node must be there
   AdjList.erase(It);
 }
+
+//-----------------------------------------------------------------------------
+// Get the number of unique neighbors if these two nodes are merged
+//-----------------------------------------------------------------------------
+
+unsigned
+IGNode::getCombinedDegree(const IGNode* otherNode) const
+{
+  std::vector<IGNode*> nbrs(AdjList);
+  nbrs.insert(nbrs.end(), otherNode->AdjList.begin(), otherNode->AdjList.end());
+  sort(nbrs.begin(), nbrs.end());
+  std::vector<IGNode*>::iterator new_end = unique(nbrs.begin(), nbrs.end());
+  return new_end - nbrs.begin();
+}
+
+
index 7ad70186663dc55dac2d8a1bb4a56adb354403f7..2037d8156825d1bbd7401f4800b8889b30f143d7 100644 (file)
@@ -318,6 +318,12 @@ void LiveRangeInfo::coalesceLRs()
                  LROfDef->getUserIGNode()->getNumOfNeighbors() + 
                  LROfUse->getUserIGNode()->getNumOfNeighbors();
 
+                if (CombinedDegree > RCOfDef->getNumOfAvailRegs()) {
+                  // get more precise estimate of combined degree
+                  CombinedDegree = LROfDef->getUserIGNode()->
+                    getCombinedDegree(LROfUse->getUserIGNode());
+                }
+
                if (CombinedDegree <= RCOfDef->getNumOfAvailRegs()) {
                  // if both LRs do not have suggested colors
                  if (!(LROfDef->hasSuggestedColor() &&  
@@ -353,7 +359,10 @@ void LiveRangeInfo::printLiveRanges() {
   for( ; HMI != LiveRangeMap.end(); ++HMI) {
     if (HMI->first && HMI->second) {
       cerr << " Value* " << RAV(HMI->first) << "\t: "; 
-      cerr << "LR# " << HMI->second->getUserIGNode()->getIndex();
+      if (IGNode* igNode = HMI->second->getUserIGNode())
+        cerr << "LR# " << igNode->getIndex();
+      else
+        cerr << "LR# " << "<no-IGNode>";
       cerr << "\t:Values = "; printSet(*HMI->second); cerr << "\n";
     }
   }