Add tags to live interval unions to avoid using stale queries.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 9 Feb 2011 21:52:03 +0000 (21:52 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 9 Feb 2011 21:52:03 +0000 (21:52 +0000)
The tag is updated whenever the live interval union is changed, and it is tested
before using cached information.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125224 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalUnion.cpp
lib/CodeGen/LiveIntervalUnion.h

index 2027db19b75e8b0b195670eb64dfd3b0bbdce577..205f28a0d65a4d0ebe17b9ed2c985352dabef5d5 100644 (file)
@@ -28,6 +28,7 @@ using namespace llvm;
 void LiveIntervalUnion::unify(LiveInterval &VirtReg) {
   if (VirtReg.empty())
     return;
+  ++Tag;
 
   // Insert each of the virtual register's live segments into the map.
   LiveInterval::iterator RegPos = VirtReg.begin();
@@ -46,6 +47,7 @@ void LiveIntervalUnion::unify(LiveInterval &VirtReg) {
 void LiveIntervalUnion::extract(LiveInterval &VirtReg) {
   if (VirtReg.empty())
     return;
+  ++Tag;
 
   // Remove each of the virtual register's live segments from the map.
   LiveInterval::iterator RegPos = VirtReg.begin();
index ff23cf61a3338c16a5d47d5acf54bf1ea569f5d2..6f9c5f4455e9eb5bd62c09c4e7f137304c38fb6e 100644 (file)
@@ -64,10 +64,12 @@ public:
 
 private:
   const unsigned RepReg;  // representative register number
+  unsigned Tag;           // unique tag for current contents.
   LiveSegments Segments;  // union of virtual reg segments
 
 public:
-  LiveIntervalUnion(unsigned r, Allocator &a) : RepReg(r), Segments(a) {}
+  LiveIntervalUnion(unsigned r, Allocator &a) : RepReg(r), Tag(0), Segments(a)
+    {}
 
   // Iterate over all segments in the union of live virtual registers ordered
   // by their starting position.
@@ -81,6 +83,12 @@ public:
   typedef LiveSegments Map;
   const Map &getMap() { return Segments; }
 
+  /// getTag - Return an opaque tag representing the current state of the union.
+  unsigned getTag() const { return Tag; }
+
+  /// changedSince - Return true if the union change since getTag returned tag.
+  bool changedSince(unsigned tag) const { return tag != Tag; }
+
   // Add a live virtual register to this union and merge its segments.
   void unify(LiveInterval &VirtReg);
 
@@ -155,6 +163,7 @@ public:
     bool CheckedFirstInterference;
     bool SeenAllInterferences;
     bool SeenUnspillableVReg;
+    unsigned Tag;
 
   public:
     Query(): LiveUnion(), VirtReg() {}
@@ -171,17 +180,19 @@ public:
       CheckedFirstInterference = false;
       SeenAllInterferences = false;
       SeenUnspillableVReg = false;
+      Tag = 0;
     }
 
     void init(LiveInterval *VReg, LiveIntervalUnion *LIU) {
       assert(VReg && LIU && "Invalid arguments");
-      if (VirtReg == VReg && LiveUnion == LIU) {
+      if (VirtReg == VReg && LiveUnion == LIU && !LIU->changedSince(Tag)) {
         // Retain cached results, e.g. firstInterference.
         return;
       }
       clear();
       LiveUnion = LIU;
       VirtReg = VReg;
+      Tag = LIU->getTag();
     }
 
     LiveInterval &virtReg() const {