mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
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:
parent
84cc6ec889
commit
7b54b4de26
@ -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; }
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user