Add tags to live interval unions to avoid using stale queries.

The tag is updated whenever the live interval union is changed, and it is tested
before using cached information.

llvm-svn: 125224
This commit is contained in:
Jakob Stoklund Olesen 2011-02-09 21:52:03 +00:00
parent f4dd543d92
commit 8f59b46750
2 changed files with 15 additions and 2 deletions

View File

@ -28,6 +28,7 @@ using namespace llvm;
void LiveIntervalUnion::unify(LiveInterval &VirtReg) { void LiveIntervalUnion::unify(LiveInterval &VirtReg) {
if (VirtReg.empty()) if (VirtReg.empty())
return; return;
++Tag;
// Insert each of the virtual register's live segments into the map. // Insert each of the virtual register's live segments into the map.
LiveInterval::iterator RegPos = VirtReg.begin(); LiveInterval::iterator RegPos = VirtReg.begin();
@ -46,6 +47,7 @@ void LiveIntervalUnion::unify(LiveInterval &VirtReg) {
void LiveIntervalUnion::extract(LiveInterval &VirtReg) { void LiveIntervalUnion::extract(LiveInterval &VirtReg) {
if (VirtReg.empty()) if (VirtReg.empty())
return; return;
++Tag;
// Remove each of the virtual register's live segments from the map. // Remove each of the virtual register's live segments from the map.
LiveInterval::iterator RegPos = VirtReg.begin(); LiveInterval::iterator RegPos = VirtReg.begin();

View File

@ -64,10 +64,12 @@ public:
private: private:
const unsigned RepReg; // representative register number const unsigned RepReg; // representative register number
unsigned Tag; // unique tag for current contents.
LiveSegments Segments; // union of virtual reg segments LiveSegments Segments; // union of virtual reg segments
public: 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 // Iterate over all segments in the union of live virtual registers ordered
// by their starting position. // by their starting position.
@ -81,6 +83,12 @@ public:
typedef LiveSegments Map; typedef LiveSegments Map;
const Map &getMap() { return Segments; } 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. // Add a live virtual register to this union and merge its segments.
void unify(LiveInterval &VirtReg); void unify(LiveInterval &VirtReg);
@ -155,6 +163,7 @@ public:
bool CheckedFirstInterference; bool CheckedFirstInterference;
bool SeenAllInterferences; bool SeenAllInterferences;
bool SeenUnspillableVReg; bool SeenUnspillableVReg;
unsigned Tag;
public: public:
Query(): LiveUnion(), VirtReg() {} Query(): LiveUnion(), VirtReg() {}
@ -171,17 +180,19 @@ public:
CheckedFirstInterference = false; CheckedFirstInterference = false;
SeenAllInterferences = false; SeenAllInterferences = false;
SeenUnspillableVReg = false; SeenUnspillableVReg = false;
Tag = 0;
} }
void init(LiveInterval *VReg, LiveIntervalUnion *LIU) { void init(LiveInterval *VReg, LiveIntervalUnion *LIU) {
assert(VReg && LIU && "Invalid arguments"); assert(VReg && LIU && "Invalid arguments");
if (VirtReg == VReg && LiveUnion == LIU) { if (VirtReg == VReg && LiveUnion == LIU && !LIU->changedSince(Tag)) {
// Retain cached results, e.g. firstInterference. // Retain cached results, e.g. firstInterference.
return; return;
} }
clear(); clear();
LiveUnion = LIU; LiveUnion = LIU;
VirtReg = VReg; VirtReg = VReg;
Tag = LIU->getTag();
} }
LiveInterval &virtReg() const { LiveInterval &virtReg() const {