Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: regalloc-playground
Changeset: r92198:dfada6cd5c1a
Date: 2017-08-21 15:27 +0200
http://bitbucket.org/pypy/pypy/changeset/dfada6cd5c1a/

Log:    tweak: pick the longest-living useless variable

diff --git a/rpython/jit/backend/llsupport/regalloc.py 
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -420,8 +420,8 @@
         """
         cur_max_age = -1
         candidate = None
-        # YYY we should pick a variable to spill that is only used in failargs
-        # from now on
+        cur_max_age_failargs = -1
+        candidate_from_failargs = None
         for next in self.reg_bindings:
             reg = self.reg_bindings[next]
             if next in forbidden_vars:
@@ -434,18 +434,22 @@
             if need_lower_byte and reg in self.no_lower_byte_regs:
                 continue
             lifetime = self.longevity[next]
+            max_age = lifetime.last_usage
             if lifetime.is_last_real_use_before(self.position):
                 # this variable has no "real" use as an argument to an op left
                 # it is only used in failargs, and maybe in a jump. spilling is
                 # fine
-                return next
-            max_age = lifetime.last_usage
+                if cur_max_age_failargs < max_age:
+                    cur_max_age_failargs = max_age
+                    candidate_from_failargs = next
             if cur_max_age < max_age:
                 cur_max_age = max_age
                 candidate = next
-        if candidate is None:
-            raise NoVariableToSpill
-        return candidate
+        if candidate_from_failargs is not None:
+            return candidate_from_failargs
+        if candidate is not None:
+            return candidate
+        raise NoVariableToSpill
 
     def force_allocate_reg(self, v, forbidden_vars=[], selected_reg=None,
                            need_lower_byte=False):
diff --git a/rpython/jit/backend/llsupport/test/test_regalloc.py 
b/rpython/jit/backend/llsupport/test/test_regalloc.py
--- a/rpython/jit/backend/llsupport/test/test_regalloc.py
+++ b/rpython/jit/backend/llsupport/test/test_regalloc.py
@@ -397,9 +397,9 @@
 
     def test_spill_useless_vars_first(self):
         b0, b1, b2, b3, b4, b5 = newboxes(0, 1, 2, 3, 4, 5)
-        longevity = {b0: Lifetime(0, 5), b1: Lifetime(0, 5),
-                     # b3 becomes useless but b2 lives longer
-                     b3: Lifetime(0, 5, 3), b2: Lifetime(0, 6),
+        longevity = {b0: Lifetime(0, 5), b1: Lifetime(0, 10),
+                     # b2 and b3 become useless but b3 lives longer
+                     b3: Lifetime(0, 7, 3), b2: Lifetime(0, 6, 3),
                      b4: Lifetime(4, 5), b5: Lifetime(4, 7)}
         fm = TFrameManager()
         asm = MockAsm()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to