When coalescing an EXTRACT_SUBREG and the dst register is a physical register,
authorEvan Cheng <evan.cheng@apple.com>
Sun, 14 Oct 2007 10:08:34 +0000 (10:08 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sun, 14 Oct 2007 10:08:34 +0000 (10:08 +0000)
the source register will be coalesced to the super register of the LHS. Properly
merge in the live ranges of the resulting coalesced interval that were part of
the original source interval to the live interval of the super-register.

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

include/llvm/CodeGen/LiveInterval.h
lib/CodeGen/LiveInterval.cpp
lib/CodeGen/SimpleRegisterCoalescing.cpp

index 34e53a9a67842209429fd9cb27a8f4828b0c6847..c5e405d68aa92d571fd7340a390d8c06cba5cc7d 100644 (file)
@@ -253,7 +253,7 @@ namespace llvm {
     /// current interval, but only if the overlapping LiveRanges have the
     /// specified value number.
     void MergeValueInAsValue(const LiveInterval &RHS,
-                             VNInfo *RHSValNo, VNInfo *LHSValNo);
+                             const VNInfo *RHSValNo, VNInfo *LHSValNo);
 
     /// Copy - Copy the specified live interval. This copies all the fields
     /// except for the register of the interval.
index b2f7d7fe13d30817dd84ee7feb7f4c50809a9f8e..b5bac47ac14be862fab71ef54fda8b58be12855e 100644 (file)
@@ -389,7 +389,7 @@ void LiveInterval::MergeRangesInAsValue(const LiveInterval &RHS,
 /// current interval, but only if the overlapping LiveRanges have the
 /// specified value number.
 void LiveInterval::MergeValueInAsValue(const LiveInterval &RHS,
-                                       VNInfo *RHSValNo, VNInfo *LHSValNo) {
+                                     const VNInfo *RHSValNo, VNInfo *LHSValNo) {
   // TODO: Make this more efficient.
   iterator InsertPos = begin();
   for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I) {
index 67e829efee18d668ec32ef82957bce7b532c3b2b..5323cb29a8cbe93d99e02beedbe8a0d2d4dd85b8 100644 (file)
@@ -421,14 +421,16 @@ bool SimpleRegisterCoalescing::JoinCopy(MachineInstr *CopyMI,
     // cl = EXTRACT_SUBREG reg1024, 1
     // then create and update the actual physical register allocated to RHS.
     if (RealDstReg) {
-      unsigned CopyIdx = li_->getInstructionIndex(CopyMI);
-      VNInfo *DstValNo =
-        ResDstInt->getLiveRangeContaining(li_->getUseIndex(CopyIdx))->valno;
       LiveInterval &RealDstInt = li_->getOrCreateInterval(RealDstReg);
-      VNInfo *ValNo = RealDstInt.getNextValue(DstValNo->def, DstValNo->reg,
-                                              li_->getVNInfoAllocator());
-      RealDstInt.addKills(ValNo, DstValNo->kills);
-      RealDstInt.MergeValueInAsValue(*ResDstInt, DstValNo, ValNo);
+      for (unsigned i = 0, e = ResSrcInt->getNumValNums(); i != e; ++i) {
+        const VNInfo *SrcValNo = ResSrcInt->getValNumInfo(i);
+        const VNInfo *DstValNo =
+          ResDstInt->FindLiveRangeContaining(SrcValNo->def)->valno;
+        VNInfo *ValNo = RealDstInt.getNextValue(DstValNo->def, DstValNo->reg,
+                                                li_->getVNInfoAllocator());
+        RealDstInt.addKills(ValNo, DstValNo->kills);
+        RealDstInt.MergeValueInAsValue(*ResDstInt, DstValNo, ValNo);
+      }
       repDstReg = RealDstReg;
     }
 
@@ -879,32 +881,32 @@ bool SimpleRegisterCoalescing::JoinIntervals(LiveInterval &LHS,
     }
   }
 
+  // Update kill info. Some live ranges are extended due to copy coalescing.
+  for (DenseMap<VNInfo*, VNInfo*>::iterator I = LHSValsDefinedFromRHS.begin(),
+         E = LHSValsDefinedFromRHS.end(); I != E; ++I) {
+    VNInfo *VNI = I->first;
+    unsigned LHSValID = LHSValNoAssignments[VNI->id];
+    LiveInterval::removeKill(NewVNInfo[LHSValID], VNI->def);
+    RHS.addKills(NewVNInfo[LHSValID], VNI->kills);
+  }
+
+  // Update kill info. Some live ranges are extended due to copy coalescing.
+  for (DenseMap<VNInfo*, VNInfo*>::iterator I = RHSValsDefinedFromLHS.begin(),
+         E = RHSValsDefinedFromLHS.end(); I != E; ++I) {
+    VNInfo *VNI = I->first;
+    unsigned RHSValID = RHSValNoAssignments[VNI->id];
+    LiveInterval::removeKill(NewVNInfo[RHSValID], VNI->def);
+    LHS.addKills(NewVNInfo[RHSValID], VNI->kills);
+  }
+
   // If we get here, we know that we can coalesce the live ranges.  Ask the
   // intervals to coalesce themselves now.
   if ((RHS.ranges.size() > LHS.ranges.size() &&
       MRegisterInfo::isVirtualRegister(LHS.reg)) ||
       MRegisterInfo::isPhysicalRegister(RHS.reg)) {
-    // Update kill info. Some live ranges are extended due to copy coalescing.
-    for (DenseMap<VNInfo*, VNInfo*>::iterator I = LHSValsDefinedFromRHS.begin(),
-           E = LHSValsDefinedFromRHS.end(); I != E; ++I) {
-      VNInfo *VNI = I->first;
-      unsigned LHSValID = LHSValNoAssignments[VNI->id];
-      LiveInterval::removeKill(NewVNInfo[LHSValID], VNI->def);
-      RHS.addKills(NewVNInfo[LHSValID], VNI->kills);
-    }
-
     RHS.join(LHS, &RHSValNoAssignments[0], &LHSValNoAssignments[0], NewVNInfo);
     Swapped = true;
   } else {
-    // Update kill info. Some live ranges are extended due to copy coalescing.
-    for (DenseMap<VNInfo*, VNInfo*>::iterator I = RHSValsDefinedFromLHS.begin(),
-           E = RHSValsDefinedFromLHS.end(); I != E; ++I) {
-      VNInfo *VNI = I->first;
-      unsigned RHSValID = RHSValNoAssignments[VNI->id];
-      LiveInterval::removeKill(NewVNInfo[RHSValID], VNI->def);
-      LHS.addKills(NewVNInfo[RHSValID], VNI->kills);
-    }
-
     LHS.join(RHS, &LHSValNoAssignments[0], &RHSValNoAssignments[0], NewVNInfo);
     Swapped = false;
   }