OSDN Git Service

Reuse unused val#'s to avoid running out of memory in extreme cases.
authorEvan Cheng <evan.cheng@apple.com>
Sat, 25 Apr 2009 20:20:15 +0000 (20:20 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sat, 25 Apr 2009 20:20:15 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70069 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveInterval.cpp

index 39d6611..0450c35 100644 (file)
@@ -577,6 +577,7 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
   if (Clobbers.empty()) return;
   
   DenseMap<VNInfo*, VNInfo*> ValNoMaps;
+  VNInfo *UnusedValNo = 0;
   iterator IP = begin();
   for (const_iterator I = Clobbers.begin(), E = Clobbers.end(); I != E; ++I) {
     // For every val# in the Clobbers interval, create a new "unknown" val#.
@@ -584,8 +585,10 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
     DenseMap<VNInfo*, VNInfo*>::iterator VI = ValNoMaps.find(I->valno);
     if (VI != ValNoMaps.end())
       ClobberValNo = VI->second;
+    else if (UnusedValNo)
+      ClobberValNo = UnusedValNo;
     else {
-      ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
+      UnusedValNo = ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
       ValNoMaps.insert(std::make_pair(I->valno, ClobberValNo));
     }
 
@@ -623,6 +626,7 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
       // Insert the clobber interval.
       IP = addRangeFrom(LiveRange(SubRangeStart, SubRangeEnd, ClobberValNo),
                         IP);
+      UnusedValNo = 0;
     }
   }
 }