LiveIntervalUnion: Allow specification of liverange when unifying/extracting.

This allows it to add subregister ranges into the union.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223890 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthias Braun 2014-12-10 01:12:59 +00:00
parent 84cc6ec889
commit 7b54b4de26
2 changed files with 17 additions and 11 deletions

View File

@ -84,10 +84,16 @@ public:
bool changedSince(unsigned tag) const { return tag != 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, const LiveRange &Range);
void unify(LiveInterval &VirtReg) {
unify(VirtReg, VirtReg);
}
// Remove a live virtual register's segments from this union. // Remove a live virtual register's segments from this union.
void extract(LiveInterval &VirtReg); void extract(LiveInterval &VirtReg, const LiveRange &Range);
void extract(LiveInterval &VirtReg) {
extract(VirtReg, VirtReg);
}
// Remove all inserted virtual registers. // Remove all inserted virtual registers.
void clear() { Segments.clear(); ++Tag; } void clear() { Segments.clear(); ++Tag; }

View File

@ -26,14 +26,14 @@ using namespace llvm;
// Merge a LiveInterval's segments. Guarantee no overlaps. // Merge a LiveInterval's segments. Guarantee no overlaps.
void LiveIntervalUnion::unify(LiveInterval &VirtReg) { void LiveIntervalUnion::unify(LiveInterval &VirtReg, const LiveRange &Range) {
if (VirtReg.empty()) if (Range.empty())
return; return;
++Tag; ++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(); LiveRange::const_iterator RegPos = Range.begin();
LiveInterval::iterator RegEnd = VirtReg.end(); LiveRange::const_iterator RegEnd = Range.end();
SegmentIter SegPos = Segments.find(RegPos->start); SegmentIter SegPos = Segments.find(RegPos->start);
while (SegPos.valid()) { while (SegPos.valid()) {
@ -53,14 +53,14 @@ void LiveIntervalUnion::unify(LiveInterval &VirtReg) {
} }
// Remove a live virtual register's segments from this union. // Remove a live virtual register's segments from this union.
void LiveIntervalUnion::extract(LiveInterval &VirtReg) { void LiveIntervalUnion::extract(LiveInterval &VirtReg, const LiveRange &Range) {
if (VirtReg.empty()) if (Range.empty())
return; return;
++Tag; ++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(); LiveRange::const_iterator RegPos = Range.begin();
LiveInterval::iterator RegEnd = VirtReg.end(); LiveRange::const_iterator RegEnd = Range.end();
SegmentIter SegPos = Segments.find(RegPos->start); SegmentIter SegPos = Segments.find(RegPos->start);
for (;;) { for (;;) {
@ -70,7 +70,7 @@ void LiveIntervalUnion::extract(LiveInterval &VirtReg) {
return; return;
// Skip all segments that may have been coalesced. // Skip all segments that may have been coalesced.
RegPos = VirtReg.advanceTo(RegPos, SegPos.start()); RegPos = Range.advanceTo(RegPos, SegPos.start());
if (RegPos == RegEnd) if (RegPos == RegEnd)
return; return;