Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: regalloc-playground
Changeset: r92217:666fb2557e24
Date: 2017-08-23 07:52 +0200
http://bitbucket.org/pypy/pypy/changeset/666fb2557e24/

Log:    block the fixed register earlier after coalescing

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
@@ -842,6 +842,8 @@
         # share a register with this variable
         self.share_with = None
 
+        # the other lifetime will have this variable set to self.definition_pos
+        self.definition_pos_shared = UNDEF_POS
 
     def is_last_real_use_before(self, position):
         if self.real_usages is None:
@@ -869,7 +871,10 @@
         assert self.definition_pos <= position <= self.last_usage
         if self.fixed_positions is None:
             self.fixed_positions = []
-            res = self.definition_pos
+            if self.definition_pos_shared != UNDEF_POS:
+                res = self.definition_pos_shared
+            else:
+                res = self.definition_pos
         else:
             assert position > self.fixed_positions[-1][0]
             res = self.fixed_positions[-1][0]
@@ -952,6 +957,7 @@
         if longevityvar0.last_usage != longevityvar1.definition_pos:
             return # not supported for now
         longevityvar0.share_with = longevityvar1
+        longevityvar1.definition_pos_shared = longevityvar0.definition_pos
 
     def longest_free_reg(self, position, free_regs):
         """ for every register in free_regs, compute how far into the future
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
@@ -310,6 +310,26 @@
     loc = longevity.try_pick_free_reg(0, b0, [r0, r1, r2, r3, r4])
     assert loc is r2
 
+def test_coalescing_blocks_regs_correctly():
+    b0, b1, b2, b3, b4 = newboxes(0, 0, 0, 0, 0)
+    l0 = Lifetime(10, 30)
+    l1 = Lifetime(30, 40)
+    l2 = Lifetime(30, 40)
+    l3 = Lifetime(0, 15)
+    l4 = Lifetime(0, 5)
+    longevity = LifetimeManager({b0: l0, b1: l1, b2: l2, b3: l3, b4: l4})
+    longevity.try_use_same_register(b0, b1)
+    longevity.fixed_register(35, r1, b1)
+    longevity.fixed_register(35, r2, b2)
+
+    loc = longevity.try_pick_free_reg(0, b3, [r1, r2])
+    # r2 is picked, otherwise b0 can't b0 can't end up in r1
+    assert loc is r2
+
+    loc = longevity.try_pick_free_reg(0, b4, [r1, r2])
+    # r1 is picked, because b4 fits before b0
+    assert loc is r1
+
 class TestRegalloc(object):
     def test_freeing_vars(self):
         b0, b1, b2 = newboxes(0, 0, 0)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to