diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-04 21:32:50 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-04 21:32:50 +0000 |
commit | d17924b1bd0329acb8be2d7dfc5fc4434c24b832 (patch) | |
tree | 702b5dcda17c18b7acf572cb1a3c514394bbce6b /lib/CodeGen/RegAllocGreedy.cpp | |
parent | 38b5e86b9c67f601f354f8bcc11f5a515e200315 (diff) | |
download | external_llvm-d17924b1bd0329acb8be2d7dfc5fc4434c24b832.tar.gz external_llvm-d17924b1bd0329acb8be2d7dfc5fc4434c24b832.tar.bz2 external_llvm-d17924b1bd0329acb8be2d7dfc5fc4434c24b832.zip |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocGreedy.cpp')
-rw-r--r-- | lib/CodeGen/RegAllocGreedy.cpp | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index 14e376db60..7cee965047 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<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. |