Move some duplicate loops in the coalescer into their own function.
authorLang Hames <lhames@gmail.com>
Fri, 27 Jan 2012 19:58:14 +0000 (19:58 +0000)
committerLang Hames <lhames@gmail.com>
Fri, 27 Jan 2012 19:58:14 +0000 (19:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149144 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegisterCoalescer.cpp

index b1796ab8a9a3f2a3c33cbba91b1e5a7581032bc7..189b2982f4b0fa688d5fc1fcc5f5d5f4d3feae56 100644 (file)
@@ -1421,6 +1421,42 @@ static bool RegistersDefinedFromSameValue(LiveIntervals &li,
   return true;
 }
 
+// Loop over the value numbers of the Dst interval and record the values that
+// are defined by a copy from the Src interval.
+static void FindValuesCopiedFrom(
+                              LiveIntervals& lis,
+                              const TargetRegisterInfo& tri,
+                              CoalescerPair& CP, 
+                              LiveInterval &Dst, LiveInterval &Src,
+                              DenseMap<VNInfo*, VNInfo*>& DstValsDefinedFromSrc,
+                              SmallVector<MachineInstr*, 8>& DupCopies) {
+
+  for (LiveInterval::vni_iterator i = Dst.vni_begin(), e = Dst.vni_end();
+       i != e; ++i) {
+    VNInfo *VNI = *i;
+    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
+      continue;
+
+    // Never join with a register that has EarlyClobber redefs.
+    if (VNI->hasRedefByEC())
+      return false;
+
+    // Figure out the value # from the Src.
+    LiveRange *lr = Src.getLiveRangeContaining(VNI->def.getPrevSlot());
+    // The copy could be to an aliased physreg.
+    if (!lr) continue;
+
+    // DstReg is known to be a register in the Dst interval.  If the src is
+    // from the Src interval, we can use its value #.
+    MachineInstr *MI = VNI->getCopy();
+    if (!CP.isCoalescable(MI) &&
+        !RegistersDefinedFromSameValue(lis, tri, CP, VNI, lr, DupCopies))
+      continue;
+
+    DstValsDefinedFromSrc[VNI] = lr->valno;
+  }
+}                            
+
 /// JoinIntervals - Attempt to join these two intervals.  On failure, this
 /// returns false.
 bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
@@ -1506,59 +1542,9 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
   LiveInterval &LHS = LIS->getOrCreateInterval(CP.getDstReg());
   DEBUG({ dbgs() << "\t\tLHS = "; LHS.print(dbgs(), TRI); dbgs() << "\n"; });
 
-  // Loop over the value numbers of the LHS, seeing if any are defined from
-  // the RHS.
-  for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
-       i != e; ++i) {
-    VNInfo *VNI = *i;
-    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
-      continue;
-
-    // Never join with a register that has EarlyClobber redefs.
-    if (VNI->hasRedefByEC())
-      return false;
-
-    // Figure out the value # from the RHS.
-    LiveRange *lr = RHS.getLiveRangeContaining(VNI->def.getPrevSlot());
-    // The copy could be to an aliased physreg.
-    if (!lr) continue;
-
-    // DstReg is known to be a register in the LHS interval.  If the src is
-    // from the RHS interval, we can use its value #.
-    MachineInstr *MI = VNI->getCopy();
-    if (!CP.isCoalescable(MI) &&
-        !RegistersDefinedFromSameValue(*LIS, *TRI, CP, VNI, lr, DupCopies))
-      continue;
-
-    LHSValsDefinedFromRHS[VNI] = lr->valno;
-  }
-
-  // Loop over the value numbers of the RHS, seeing if any are defined from
-  // the LHS.
-  for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
-       i != e; ++i) {
-    VNInfo *VNI = *i;
-    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
-      continue;
-
-    // Never join with a register that has EarlyClobber redefs.
-    if (VNI->hasRedefByEC())
-      return false;
-
-    // Figure out the value # from the LHS.
-    LiveRange *lr = LHS.getLiveRangeContaining(VNI->def.getPrevSlot());
-    // The copy could be to an aliased physreg.
-    if (!lr) continue;
-
-    // DstReg is known to be a register in the RHS interval.  If the src is
-    // from the LHS interval, we can use its value #.
-    MachineInstr *MI = VNI->getCopy();
-    if (!CP.isCoalescable(MI) &&
-        !RegistersDefinedFromSameValue(*LIS, *TRI, CP, VNI, lr, DupCopies))
-        continue;
-
-    RHSValsDefinedFromLHS[VNI] = lr->valno;
-  }
+  // Build a map of LHS values defined by copies from RHS and vice-versa.
+  FindValuesCopiedFrom(*LIS, *TRI, CP, LHS, RHS, LHSValsDefinedFromRHS, DupCopies);
+  FindValuesCopiedFrom(*LIS, *TRI, CP, RHS, LHS, RHSValsDefinedFromLHS, DupCopies);
 
   LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
   RHSValNoAssignments.resize(RHS.getNumValNums(), -1);