mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +00:00
PR11868. The previous loop in LiveIntervals::join would sometimes fall over if
more than two adjacent ranges needed to be merged. The new version should be able to handle an arbitrary sequence of adjancent ranges. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149588 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -389,29 +389,30 @@ void LiveInterval::join(LiveInterval &Other,
|
||||
// now.
|
||||
if (MustMapCurValNos) {
|
||||
// Map the first live range.
|
||||
|
||||
iterator OutIt = begin();
|
||||
OutIt->valno = NewVNInfo[LHSValNoAssignments[OutIt->valno->id]];
|
||||
++OutIt;
|
||||
for (iterator I = OutIt, E = end(); I != E; ++I) {
|
||||
OutIt->valno = NewVNInfo[LHSValNoAssignments[I->valno->id]];
|
||||
for (iterator I = next(OutIt), E = end(); I != E; ++I) {
|
||||
VNInfo* nextValNo = NewVNInfo[LHSValNoAssignments[I->valno->id]];
|
||||
assert(nextValNo != 0 && "Huh?");
|
||||
|
||||
// If this live range has the same value # as its immediate predecessor,
|
||||
// and if they are neighbors, remove one LiveRange. This happens when we
|
||||
// have [0,3:0)[4,7:1) and map 0/1 onto the same value #.
|
||||
if (OutIt->valno == (OutIt-1)->valno && (OutIt-1)->end == OutIt->start) {
|
||||
(OutIt-1)->end = OutIt->end;
|
||||
// have [0,4:0)[4,7:1) and map 0/1 onto the same value #.
|
||||
if (OutIt->valno == nextValNo && OutIt->end == I->start) {
|
||||
OutIt->end = I->end;
|
||||
} else {
|
||||
if (I != OutIt) {
|
||||
// Didn't merge. Move OutIt to the next interval,
|
||||
++OutIt;
|
||||
OutIt->valno = nextValNo;
|
||||
if (OutIt != I) {
|
||||
OutIt->start = I->start;
|
||||
OutIt->end = I->end;
|
||||
}
|
||||
|
||||
// Didn't merge, on to the next one.
|
||||
++OutIt;
|
||||
}
|
||||
}
|
||||
|
||||
// If we merge some live ranges, chop off the end.
|
||||
++OutIt;
|
||||
ranges.erase(OutIt, end());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user