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

Reply via email to