diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2007-10-15 18:33:50 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2007-10-15 18:33:50 +0000 |
| commit | a5abba65b6b604607acf94f9100ec8eb7c53a6a4 (patch) | |
| tree | c780edf2496a5589ab87d4fdce3d32fb49ac930b /llvm/lib | |
| parent | d6f7d44eae14cb2f510e67500c182115a67293d2 (diff) | |
| download | bcm5719-llvm-a5abba65b6b604607acf94f9100ec8eb7c53a6a4.tar.gz bcm5719-llvm-a5abba65b6b604607acf94f9100ec8eb7c53a6a4.zip | |
Fix PR1729: watch out for val# with no def.
llvm-svn: 42996
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp index 5323cb29a8c..4a4df913a19 100644 --- a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -422,14 +422,19 @@ bool SimpleRegisterCoalescing::JoinCopy(MachineInstr *CopyMI, // then create and update the actual physical register allocated to RHS. if (RealDstReg) { LiveInterval &RealDstInt = li_->getOrCreateInterval(RealDstReg); - 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); + SmallSet<const VNInfo*, 4> CopiedValNos; + for (LiveInterval::Ranges::const_iterator I = ResSrcInt->ranges.begin(), + E = ResSrcInt->ranges.end(); I != E; ++I) { + LiveInterval::const_iterator DstLR = + ResDstInt->FindLiveRangeContaining(I->start); + assert(DstLR != ResDstInt->end() && "Invalid joined interval!"); + const VNInfo *DstValNo = DstLR->valno; + if (CopiedValNos.insert(DstValNo)) { + VNInfo *ValNo = RealDstInt.getNextValue(DstValNo->def, DstValNo->reg, + li_->getVNInfoAllocator()); + RealDstInt.addKills(ValNo, DstValNo->kills); + RealDstInt.MergeValueInAsValue(*ResDstInt, DstValNo, ValNo); + } } repDstReg = RealDstReg; } |

