[pypy-commit] pypy call-loopinvariant-into-bridges: Backed out changeset 89f271b2dd38

cfbolz pypy.commits at gmail.com
Wed Mar 7 10:27:54 EST 2018


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: call-loopinvariant-into-bridges
Changeset: r93960:1d03f9c2353f
Date: 2018-03-07 13:34 +0100
http://bitbucket.org/pypy/pypy/changeset/1d03f9c2353f/

Log:	Backed out changeset 89f271b2dd38

	back out this change for now. it leads to weird crashes and isn't
	the main point of this branch anyway.

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,6 +33,13 @@
 
 # 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
@@ -53,12 +60,11 @@
         raise AssertionError("unreachable")
     return box
 
-def serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, adder):
+def serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, liveboxes_from_env, memo):
     from rpython.jit.metainterp.history import ConstInt
-
     available_boxes = {}
     for box in liveboxes:
-        if box is not None:
+        if box is not None and box in liveboxes_from_env:
             available_boxes[box] = None
 
     # class knowledge is stored as bits, true meaning the class is known, false
@@ -92,16 +98,16 @@
         numb_state.append_int(len(triples_struct))
         for box1, descr, box2 in triples_struct:
             descr_index = descr.descr_index
-            numb_state.append_short(adder._gettagged(box1))
+            numb_state.append_short(tag_box(box1, liveboxes_from_env, memo))
             numb_state.append_int(descr_index)
-            numb_state.append_short(adder._gettagged(box2))
+            numb_state.append_short(tag_box(box2, liveboxes_from_env, memo))
         numb_state.append_int(len(triples_array))
         for box1, index, descr, box2 in triples_array:
             descr_index = descr.descr_index
-            numb_state.append_short(adder._gettagged(box1))
+            numb_state.append_short(tag_box(box1, liveboxes_from_env, memo))
             numb_state.append_int(index)
             numb_state.append_int(descr_index)
-            numb_state.append_short(adder._gettagged(box2))
+            numb_state.append_short(tag_box(box2, liveboxes_from_env, memo))
     else:
         numb_state.append_int(0)
         numb_state.append_int(0)
@@ -112,8 +118,8 @@
         numb_state.append_int(len(tuples_loopinvariant))
         for constarg0, box in tuples_loopinvariant:
             numb_state.append_short(
-                    adder._gettagged(ConstInt(constarg0)))
-            numb_state.append_short(adder._gettagged(box))
+                    tag_box(ConstInt(constarg0), liveboxes_from_env, memo))
+            numb_state.append_short(tag_box(box, liveboxes_from_env, memo))
     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)
+        self._add_optimizer_sections(numb_state, liveboxes, liveboxes_from_env)
         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):
+    def _add_optimizer_sections(self, numb_state, liveboxes, liveboxes_from_env):
         # 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, self)
+            self.optimizer, numb_state, liveboxes, liveboxes_from_env, self.memo)
 
 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,31 +221,6 @@
         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):


More information about the pypy-commit mailing list