Only update regunit live ranges that have been precomputed.

Regunit live ranges are computed on demand, so when mi-sched calls
handleMove, some regunits may not have live ranges yet.

That makes updating them easier: Just skip the non-existing ranges. They
will be computed correctly from the rescheduled machine code when they
are needed.

llvm-svn: 158831
This commit is contained in:
Jakob Stoklund Olesen 2012-06-20 18:00:57 +00:00
parent bebf146dd6
commit 833308d785
3 changed files with 15 additions and 4 deletions

View File

@ -347,6 +347,12 @@ namespace llvm {
return *LI;
}
/// getCachedRegUnit - Return the live range for Unit if it has already
/// been computed, or NULL if it hasn't been computed yet.
LiveInterval *getCachedRegUnit(unsigned Unit) {
return RegUnitIntervals[Unit];
}
/// trackingRegUnits - Does LiveIntervals curently track register units?
/// This function will be removed when regunit tracking is permanently
/// enabled.

View File

@ -1196,11 +1196,15 @@ private:
if (TargetRegisterInfo::isPhysicalRegister(Reg) && LIS.isReserved(Reg))
continue;
// Collect ranges for register units. These live ranges are computed on
// demand, so just skip any that haven't been computed yet.
if (TargetRegisterInfo::isPhysicalRegister(Reg) && LIS.trackingRegUnits())
for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units)
collectRanges(MO, &LIS.getRegUnit(*Units),
Entering, Internal, Exiting, OldIdx);
else if (LIS.hasInterval(Reg))
for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units)
if (LiveInterval *LI = LIS.getCachedRegUnit(*Units))
collectRanges(MO, LI, Entering, Internal, Exiting, OldIdx);
// Collect ranges for individual registers.
if (LIS.hasInterval(Reg))
collectRanges(MO, &LIS.getInterval(Reg),
Entering, Internal, Exiting, OldIdx);
}

View File

@ -1,4 +1,5 @@
; RUN: llc -march=x86-64 -mcpu=core2 -enable-misched -misched=shuffle -misched-bottomup < %s
; RUN: llc -march=x86-64 -mcpu=core2 -enable-misched -misched=shuffle -misched-bottomup -live-regunits < %s
; REQUIRES: asserts
;
; Interesting MachineScheduler cases.