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