Add a flag to disable the code that looks for allocas which escaped the lifetime...
authorNadav Rotem <nrotem@apple.com>
Wed, 12 Sep 2012 11:06:26 +0000 (11:06 +0000)
committerNadav Rotem <nrotem@apple.com>
Wed, 12 Sep 2012 11:06:26 +0000 (11:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163702 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StackColoring.cpp

index 0deb35ad7fbd98808fa41a957166f90e872ea1f9..a14d730025f506cd95558c320880f09f76a6cddf 100644 (file)
@@ -59,12 +59,20 @@ using namespace llvm;
 
 static cl::opt<bool>
 DisableColoring("no-stack-coloring",
-               cl::init(false), cl::Hidden,
-               cl::desc("Suppress stack coloring"));
+        cl::init(false), cl::Hidden,
+        cl::desc("Disable stack coloring"));
 
-STATISTIC(NumMarkerSeen,  "Number of life markers found.");
+static cl::opt<bool>
+CheckEscapedAllocas("stack-coloring-check-escaped",
+        cl::init(true), cl::Hidden,
+        cl::desc("Look for allocas which escaped the lifetime region"));
+
+STATISTIC(NumMarkerSeen,  "Number of lifetime markers found.");
 STATISTIC(StackSpaceSaved, "Number of bytes saved due to merging slots.");
 STATISTIC(StackSlotMerged, "Number of stack slot merged.");
+STATISTIC(EscapedAllocas,
+          "Number of allocas that escaped the lifetime region");
+
 
 //===----------------------------------------------------------------------===//
 //                           StackColoring Pass
@@ -104,7 +112,7 @@ class StackColoring : public MachineFunctionPass {
   /// VNInfo is used for the construction of LiveIntervals.
   VNInfo::Allocator VNInfoAllocator;
   /// SlotIndex analysis object.
-  SlotIndexesIndexes;
+  SlotIndexes *Indexes;
 
   /// The list of lifetime markers found. These markers are to be removed
   /// once the coloring is done.
@@ -533,7 +541,7 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
 #ifndef NDEBUG
         if (!I->isDebugValue()) {
           SlotIndex Index = Indexes->getInstructionIndex(I);
-          LiveIntervalInterval = Intervals[FromSlot];
+          LiveInterval *Interval = Intervals[FromSlot];
           assert(Interval->find(Index) != Interval->end() &&
                "Found instruction usage outside of live range.");
         }
@@ -583,6 +591,7 @@ void StackColoring::removeInvalidSlotRanges() {
         if (Interval->find(Index) == Interval->end()) {
           Intervals[Slot]->clear();
           DEBUG(dbgs()<<"Invalidating range #"<<Slot<<"\n");
+          EscapedAllocas++;
         }
       }
     }
@@ -662,7 +671,10 @@ bool StackColoring::runOnMachineFunction(MachineFunction &Func) {
   // Propagate the liveness information.
   calculateLiveIntervals(NumSlots);
 
-  removeInvalidSlotRanges();
+  // Search for allocas which are used outside of the declared lifetime
+  // markers.
+  if (CheckEscapedAllocas)
+    removeInvalidSlotRanges();
 
   // Maps old slots to new slots.
   DenseMap<int, int> SlotRemap;