From e3b9a00584382b715946a04c43542f5519d36dc0 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 4 Mar 2011 21:32:50 +0000 Subject: [PATCH] Go back to comparing spill weights when deciding if interference can be evicted. It gives better results. Sometimes, a live range can be large and still have high spill weight. Such a range should not be spilled. llvm-svn: 127036 --- lib/CodeGen/RegAllocGreedy.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index 14e376db605..7cee9650475 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -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&); @@ -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 &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.