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