summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-10-15 18:33:50 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-10-15 18:33:50 +0000
commita5abba65b6b604607acf94f9100ec8eb7c53a6a4 (patch)
treec780edf2496a5589ab87d4fdce3d32fb49ac930b /llvm/lib
parentd6f7d44eae14cb2f510e67500c182115a67293d2 (diff)
downloadbcm5719-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.cpp21
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;
}
OpenPOWER on IntegriCloud