Go back to comparing spill weights when deciding if interference can be evicted.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 4 Mar 2011 21:32:50 +0000 (21:32 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 4 Mar 2011 21:32:50 +0000 (21:32 +0000)
It gives better results. Sometimes, a live range can be large and still have
high spill weight. Such a range should not be spilled.

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

lib/CodeGen/RegAllocGreedy.cpp

index 14e376db6059b764d3ea5fddd3f33abec180af0b..7cee96504759b045762fc525a323ca0d5a505d64 100644 (file)
@@ -154,7 +154,7 @@ private:
   SlotIndex getPrevMappedIndex(const MachineInstr*);
   void calcPrevSlots();
   unsigned nextSplitPoint(unsigned);
-  bool canEvictInterference(LiveInterval&, unsigned, unsigned, float&);
+  bool canEvictInterference(LiveInterval&, unsigned, float&);
 
   unsigned tryReassign(LiveInterval&, AllocationOrder&,
                               SmallVectorImpl<LiveInterval*>&);
@@ -357,7 +357,7 @@ unsigned RAGreedy::tryReassign(LiveInterval &VirtReg, AllocationOrder &Order,
 /// canEvict - Return true if all interferences between VirtReg and PhysReg can
 /// be evicted. Set maxWeight to the maximal spill weight of an interference.
 bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
-                                    unsigned Size, float &MaxWeight) {
+                                    float &MaxWeight) {
   float Weight = 0;
   for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
     LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
@@ -365,12 +365,12 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
     if (Q.collectInterferingVRegs(10) >= 10)
       return false;
 
-    // CHeck if any interfering live range is shorter than VirtReg.
+    // Check if any interfering live range is heavier than VirtReg.
     for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) {
       LiveInterval *Intf = Q.interferingVRegs()[i];
       if (TargetRegisterInfo::isPhysicalRegister(Intf->reg))
         return false;
-      if (Intf->getSize() <= Size)
+      if (Intf->weight >= VirtReg.weight)
         return false;
       Weight = std::max(Weight, Intf->weight);
     }
@@ -388,10 +388,6 @@ unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
                             SmallVectorImpl<LiveInterval*> &NewVRegs){
   NamedRegionTimer T("Evict", TimerGroupName, TimePassesIsEnabled);
 
-  // We can only evict interference if all interfering registers are virtual and
-  // longer than VirtReg.
-  const unsigned Size = VirtReg.getSize();
-
   // Keep track of the lightest single interference seen so far.
   float BestWeight = 0;
   unsigned BestPhys = 0;
@@ -399,7 +395,7 @@ unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
   Order.rewind();
   while (unsigned PhysReg = Order.next()) {
     float Weight = 0;
-    if (!canEvictInterference(VirtReg, PhysReg, Size, Weight))
+    if (!canEvictInterference(VirtReg, PhysReg, Weight))
       continue;
 
     // This is an eviction candidate.