Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: call-loopinvariant-into-bridges
Changeset: r93896:89f271b2dd38
Date: 2018-02-26 22:22 +0100
http://bitbucket.org/pypy/pypy/changeset/89f271b2dd38/

Log:    lift the restriction that cached heap fields that are stored across
        bridges have to be in liveboxes_from_env

diff --git a/rpython/jit/metainterp/optimizeopt/bridgeopt.py 
b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
--- a/rpython/jit/metainterp/optimizeopt/bridgeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
@@ -33,13 +33,6 @@
 
 # maybe should be delegated to the optimization classes?
 
-def tag_box(box, liveboxes_from_env, memo):
-    from rpython.jit.metainterp.history import Const
-    if isinstance(box, Const):
-        return memo.getconst(box)
-    else:
-        return liveboxes_from_env[box] # has to exist
-
 def decode_box(resumestorage, tagged, liveboxes, cpu):
     from rpython.jit.metainterp.resume import untag, TAGCONST, TAGINT, TAGBOX
     from rpython.jit.metainterp.resume import NULLREF, TAG_CONST_OFFSET, 
tagged_eq
@@ -60,11 +53,12 @@
         raise AssertionError("unreachable")
     return box
 
-def serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, 
liveboxes_from_env, memo):
+def serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, adder):
     from rpython.jit.metainterp.history import ConstInt
+
     available_boxes = {}
     for box in liveboxes:
-        if box is not None and box in liveboxes_from_env:
+        if box is not None:
             available_boxes[box] = None
 
     # class knowledge is stored as bits, true meaning the class is known, false
@@ -98,16 +92,16 @@
         numb_state.append_int(len(triples_struct))
         for box1, descr, box2 in triples_struct:
             descr_index = descr.descr_index
-            numb_state.append_short(tag_box(box1, liveboxes_from_env, memo))
+            numb_state.append_short(adder._gettagged(box1))
             numb_state.append_int(descr_index)
-            numb_state.append_short(tag_box(box2, liveboxes_from_env, memo))
+            numb_state.append_short(adder._gettagged(box2))
         numb_state.append_int(len(triples_array))
         for box1, index, descr, box2 in triples_array:
             descr_index = descr.descr_index
-            numb_state.append_short(tag_box(box1, liveboxes_from_env, memo))
+            numb_state.append_short(adder._gettagged(box1))
             numb_state.append_int(index)
             numb_state.append_int(descr_index)
-            numb_state.append_short(tag_box(box2, liveboxes_from_env, memo))
+            numb_state.append_short(adder._gettagged(box2))
     else:
         numb_state.append_int(0)
         numb_state.append_int(0)
@@ -118,8 +112,8 @@
         numb_state.append_int(len(tuples_loopinvariant))
         for constarg0, box in tuples_loopinvariant:
             numb_state.append_short(
-                    tag_box(ConstInt(constarg0), liveboxes_from_env, memo))
-            numb_state.append_short(tag_box(box, liveboxes_from_env, memo))
+                    adder._gettagged(ConstInt(constarg0)))
+            numb_state.append_short(adder._gettagged(box))
     else:
         numb_state.append_int(0)
 
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -464,7 +464,7 @@
 
         numb_state.patch(1, len(liveboxes))
 
-        self._add_optimizer_sections(numb_state, liveboxes, liveboxes_from_env)
+        self._add_optimizer_sections(numb_state, liveboxes)
         storage.rd_numb = numb_state.create_numbering()
         storage.rd_consts = self.memo.consts
         return liveboxes[:]
@@ -584,11 +584,11 @@
                 return self.liveboxes_from_env[box]
             return self.liveboxes[box]
 
-    def _add_optimizer_sections(self, numb_state, liveboxes, 
liveboxes_from_env):
+    def _add_optimizer_sections(self, numb_state, liveboxes):
         # add extra information about things the optimizer learned
         from rpython.jit.metainterp.optimizeopt.bridgeopt import 
serialize_optimizer_knowledge
         serialize_optimizer_knowledge(
-            self.optimizer, numb_state, liveboxes, liveboxes_from_env, 
self.memo)
+            self.optimizer, numb_state, liveboxes, self)
 
 class AbstractVirtualInfo(object):
     kind = REF
diff --git a/rpython/jit/metainterp/test/test_bridgeopt.py 
b/rpython/jit/metainterp/test/test_bridgeopt.py
--- a/rpython/jit/metainterp/test/test_bridgeopt.py
+++ b/rpython/jit/metainterp/test/test_bridgeopt.py
@@ -60,7 +60,7 @@
     numb_state.append_int(1) # size of resume block
     liveboxes = [InputArgInt(), box2, box1, box3]
 
-    serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
+    serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, None)
 
     assert unpack_numbering(numb_state.create_numbering()) == [
             1, 0b010000, 0, 0, 0]
@@ -100,7 +100,7 @@
     numb_state.append_int(1) # size of resume block
     liveboxes = [box for (box, _) in boxes_known_classes]
 
-    serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
+    serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, None)
 
     assert len(numb_state.create_numbering().code) == 4 + 
math.ceil(len(refboxes) / 6.0)
 
@@ -221,6 +221,31 @@
         self.check_resops(getfield_gc_i=4) # 3x a.x, 1x a.n
         self.check_resops(getfield_gc_r=1) # in main loop
 
+    def test_bridge_field_read_virtual(self):
+        myjitdriver = jit.JitDriver(greens=[], reds=['y', 'res', 'n', 'a'])
+        class A(object):
+            pass
+        class Virt(object):
+            def __init__(self, n1):
+                self.n1 = n1
+
+        def f(y, n):
+            a = A()
+            a.n = n
+            res = 0
+            while y > 0:
+                myjitdriver.jit_merge_point(y=y, n=n, res=res, a=a)
+                v = Virt(a.n)
+                if y > n:
+                    res += 1
+                res += v.n1 + a.n
+                y -= 1
+            return res
+        res = self.meta_interp(f, [32, 16])
+        assert res == f(32, 16)
+        self.check_trace_count(3)
+        self.check_resops(getfield_gc_i=1) # 1x a.x
+
     def test_bridge_field_read_constants(self):
         myjitdriver = jit.JitDriver(greens=[], reds=['y', 'res', 'n'])
         class A(object):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to