diff --git a/include/llvm/CodeGen/LiveInterval.h b/include/llvm/CodeGen/LiveInterval.h index 34e53a9a678..c5e405d68aa 100644 --- a/include/llvm/CodeGen/LiveInterval.h +++ b/include/llvm/CodeGen/LiveInterval.h @@ -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. diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp index b2f7d7fe13d..b5bac47ac14 100644 --- a/lib/CodeGen/LiveInterval.cpp +++ b/lib/CodeGen/LiveInterval.cpp @@ -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) { diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index 67e829efee1..5323cb29a8c 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -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::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::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::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::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; }