Only update regunit live ranges that have been precomputed.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 20 Jun 2012 18:00:57 +0000 (18:00 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 20 Jun 2012 18:00:57 +0000 (18:00 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158831 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveIntervalAnalysis.h
lib/CodeGen/LiveIntervalAnalysis.cpp
test/CodeGen/X86/misched-new.ll

index bd3604c42926a5f093b0a0e70a723793361655d7..bb547c3519a29cf5d042afa05fa0ba2f03f40754 100644 (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.
index 6b8cc8870436a3021879912557d8a9a41589c135..153d1c37dfd92babf3edda883a16cc45dce36bed 100644 (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);
     }
index 8f2f6f7697dfa69bfc8f2f9aab5403500e2469e0..f7b1467300e31bdc3bc4a6d8bd282f07118d0780 100644 (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.