Author: Carl Friedrich Bolz <[email protected]>
Branch: regalloc-playground
Changeset: r92206:85eb224c8d6c
Date: 2017-08-22 15:06 +0200
http://bitbucket.org/pypy/pypy/changeset/85eb224c8d6c/
Log: support not specifying a variable (eg for caller-saved regs)
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
@@ -884,12 +884,13 @@
def compute_free_until_pos(self, opindex):
for (index, varlifetime) in self.index_lifetimes:
if opindex <= index:
- if varlifetime.definition_pos >= opindex:
+ if varlifetime is not None and varlifetime.definition_pos >=
opindex:
return varlifetime.definition_pos
else:
- # the variable didn't make it into the register despite
- # being defined already. so we don't care too much, and can
- # say that the variable is free until index
+ # the variable doesn't exist or didn't make it into the
+ # register despite being defined already. so we don't care
+ # too much, and can say that the variable is free until
+ # index
return index
return sys.maxint
@@ -904,11 +905,14 @@
""" Tell the LifetimeManager that variable var *must* be in register at
operation opindex. var can be None, if no variable at all can be in
that register at the point."""
- varlifetime = self.longevity[var]
+ if var is None:
+ varlifetime = None
+ else:
+ varlifetime = self.longevity[var]
+ varlifetime.fixed_register(opindex, register)
if register not in self.fixed_register_use:
self.fixed_register_use[register] =
FixedRegisterPositions(register)
self.fixed_register_use[register].fixed_register(opindex, varlifetime)
- varlifetime.fixed_register(opindex, register)
def compute_longest_free_reg(self, position, free_regs):
""" for every register in free_regs, compute how far into the
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
@@ -148,6 +148,46 @@
assert fpr1.index_lifetimes == [(5, l1), (8, l1)]
assert fpr2.index_lifetimes == [(4, l0)]
+def test_fixed_position_none():
+ b0, b1, b2 = newboxes(0, 0, 0)
+ l0 = Lifetime(0, 5)
+ l1 = Lifetime(2, 9)
+ l2 = Lifetime(0, 9)
+ longevity = LifetimeManager({b0: l0, b1: l1, b2: l2})
+ longevity.fixed_register(1, r0)
+ longevity.fixed_register(4, r2)
+ longevity.fixed_register(5, r1)
+ longevity.fixed_register(8, r1)
+
+ fpr0 = longevity.fixed_register_use[r0]
+ fpr1 = longevity.fixed_register_use[r1]
+ fpr2 = longevity.fixed_register_use[r2]
+ assert r3 not in longevity.fixed_register_use
+ assert fpr0.index_lifetimes == [(1, None)]
+ assert fpr1.index_lifetimes == [(5, None), (8, None)]
+ assert fpr2.index_lifetimes == [(4, None)]
+
+
+def test_compute_free_until_pos_none():
+ longevity = LifetimeManager({})
+ longevity.fixed_register(1, r0, None)
+ longevity.fixed_register(4, r2, None)
+ longevity.fixed_register(5, r1, None)
+ longevity.fixed_register(8, r1, None)
+ longevity.fixed_register(35, r1, None)
+
+ fpr1 = longevity.fixed_register_use[r1]
+
+ assert fpr1.compute_free_until_pos(0) == 5
+ assert fpr1.compute_free_until_pos(1) == 5
+ assert fpr1.compute_free_until_pos(2) == 5
+ assert fpr1.compute_free_until_pos(3) == 5
+ assert fpr1.compute_free_until_pos(4) == 5
+ assert fpr1.compute_free_until_pos(5) == 5
+ assert fpr1.compute_free_until_pos(10) == 35
+ assert fpr1.compute_free_until_pos(20) == 35
+ assert fpr1.compute_free_until_pos(30) == 35
+ assert fpr1.compute_free_until_pos(36) == sys.maxint
def test_compute_free_until_pos():
b0, b1, b2 = newboxes(0, 0, 0)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit