diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/LiveIntervalUnion.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/LiveIntervalUnion.h | 15 |
2 files changed, 15 insertions, 2 deletions
diff --git a/lib/CodeGen/LiveIntervalUnion.cpp b/lib/CodeGen/LiveIntervalUnion.cpp index 2027db19b7..205f28a0d6 100644 --- a/lib/CodeGen/LiveIntervalUnion.cpp +++ b/lib/CodeGen/LiveIntervalUnion.cpp @@ -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(); diff --git a/lib/CodeGen/LiveIntervalUnion.h b/lib/CodeGen/LiveIntervalUnion.h index ff23cf61a3..6f9c5f4455 100644 --- a/lib/CodeGen/LiveIntervalUnion.h +++ b/lib/CodeGen/LiveIntervalUnion.h @@ -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 { |