[pypy-svn] r67127 - in pypy/branch/pyjitpl5/pypy: jit/metainterp jit/metainterp/test jit/tl rlib
pedronis at codespeak.net
pedronis at codespeak.net
Sun Aug 23 18:11:01 CEST 2009
Author: pedronis
Date: Sun Aug 23 18:11:00 2009
New Revision: 67127
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
pypy/branch/pyjitpl5/pypy/jit/tl/tl.py
pypy/branch/pyjitpl5/pypy/rlib/jit.py
Log:
(cfbolz, pedronis)
introduce fresh_virtualizable hint to use to expose the construction of virtualizables to the jit, to be used carefully
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py Sun Aug 23 18:11:00 2009
@@ -384,6 +384,7 @@
self.var_positions = {}
self.vable_array_vars = {}
self.immutable_arrays = {}
+ self.vable_flags = {}
for arg in self.force_block_args_order(block):
self.register_var(arg, verbose=False)
self.emit(label(block))
@@ -914,11 +915,19 @@
return False
if not vinfo.is_vtypeptr(op.args[0].concretetype):
return False
+ res = False
if op.args[1].value in vinfo.static_field_to_extra_box:
- return True
+ res = True
if op.args[1].value in vinfo.array_fields:
- raise VirtualizableArrayField(self.graph)
- return False
+ res = VirtualizableArrayField(self.graph)
+
+ if res:
+ flags = self.vable_flags[op.args[0]]
+ if 'fresh_virtualizable' in flags:
+ return False
+ if isinstance(res, Exception):
+ raise res
+ return res
def handle_getfield_typeptr(self, op):
# special-casing for getting the typeptr of an object
@@ -1376,6 +1385,7 @@
vinfo = self.codewriter.metainterp_sd.virtualizable_info
assert vinfo is not None
assert vinfo.is_vtypeptr(op.args[0].concretetype)
+ self.vable_flags[op.args[0]] = op.args[2].value
serialize_op_oostring = handle_builtin_call
serialize_op_oounicode = handle_builtin_call
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py Sun Aug 23 18:11:00 2009
@@ -171,6 +171,9 @@
del meth_func._look_inside_me_
class TestOOtype(ToyLanguageTests, OOJitMixin):
+ def test_tl_call(self):
+ py.test.skip("virtualizables: in-progress with ootype")
+
def test_tl_call_full_of_residuals(self):
py.test.skip("virtualizables: in-progress with ootype")
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py Sun Aug 23 18:11:00 2009
@@ -73,6 +73,7 @@
x = xy.inst_x
xy.inst_x = x + 1
n -= 1
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [20])
assert res == 30
@@ -96,6 +97,7 @@
x = xy.inst_x
xy.inst_x = x + 10
n -= 1
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
assert f(5) == 185
res = self.meta_interp(f, [5])
@@ -115,8 +117,10 @@
x = xy.inst_x
if n <= 10:
x += 1000
+ promote_virtualizable(xy, 'inst_x')
xy.inst_x = x + 1
n -= 1
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [18])
assert res == 10118
@@ -159,6 +163,7 @@
xy.inst_x = x + 1
m = (m+1) & 3 # the loop gets unrolled 4 times
n -= 1
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
def f(n):
res = 0
@@ -188,6 +193,7 @@
promote_virtualizable(xy, 'inst_x')
xy.inst_x = value + 100 # virtualized away
n -= 1
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [20])
assert res == 134
@@ -296,8 +302,11 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
+ promote_virtualizable(xy2, 'inst_l1')
+ promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l1[2] += xy2.inst_l2[0]
n -= 1
+ promote_virtualizable(xy2, 'inst_l1')
return xy2.inst_l1[2]
res = self.meta_interp(f, [16])
assert res == 3001 + 16 * 80
@@ -312,6 +321,8 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
+ promote_virtualizable(xy2, 'inst_x')
+ promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l2[0] += xy2.inst_x
n -= 1
def f(n):
@@ -341,6 +352,8 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
+ promote_virtualizable(xy2, 'inst_l1')
+ promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l1[1] += len(xy2.inst_l2)
n -= 1
def f(n):
@@ -374,6 +387,7 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
+ promote_virtualizable(xy2, 'inst_l1')
xy2.inst_l1[1] = xy2.inst_l1[1] + len(h(xy2))
n -= 1
def f(n):
@@ -420,6 +434,7 @@
promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l2[0] = value + 100 # virtualized away
n -= 1
+ promote_virtualizable(xy2, 'inst_l2')
return xy2.inst_l2[0]
expected = f(20)
res = self.meta_interp(f, [20], optimizer=simple_optimize)
@@ -451,7 +466,10 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
- xy2.parent.inst_l2[0] += xy2.parent.inst_x
+ parent = xy2.parent
+ promote_virtualizable(parent, 'inst_x')
+ promote_virtualizable(parent, 'inst_l2')
+ parent.inst_l2[0] += parent.inst_x
n -= 1
def f(n):
xy2 = self.setup2sub()
@@ -811,16 +829,15 @@
self.check_loops(new_with_vtable=0)
def test_virtual_child_frame_with_arrays(self):
- py.test.skip("WIP")
myjitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
class Frame(object):
_virtualizable2_ = ['x[*]']
- #@dont_look_inside
def __init__(self, x, y):
- self = hint(self, access_directly=True)
+ self = hint(self, access_directly=True,
+ fresh_virtualizable=True)
self.x = [x, y]
class SomewhereElse:
@@ -846,7 +863,12 @@
class TestOOtype(#ExplicitVirtualizableTests,
ImplicitVirtualizableTests,
OOJitMixin):
- pass
+
+ def test_subclass_of_virtualizable(self):
+ py.test.skip("oo virtualizable support incomplete")
+
+ def test_virtual_child_frame_with_arrays(self):
+ py.test.skip("oo virtualizable support incomplete")
class TestLLtype(ExplicitVirtualizableTests,
ImplicitVirtualizableTests,
Modified: pypy/branch/pyjitpl5/pypy/jit/tl/tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/tl/tl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/tl/tl.py Sun Aug 23 18:11:00 2009
@@ -13,9 +13,8 @@
class Stack(object):
_virtualizable2_ = ['stackpos', 'stack[*]']
- @dont_look_inside
def __init__(self, size):
- self = hint(self, access_directly=True)
+ self = hint(self, access_directly=True, fresh_virtualizable=True)
self.stack = [0] * size
self.stackpos = 0
Modified: pypy/branch/pyjitpl5/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/rlib/jit.py (original)
+++ pypy/branch/pyjitpl5/pypy/rlib/jit.py Sun Aug 23 18:11:00 2009
@@ -19,7 +19,10 @@
def compute_result_annotation(self, s_x, **kwds_s):
from pypy.annotation import model as annmodel
s_x = annmodel.not_const(s_x)
- if 's_access_directly' in kwds_s:
+ access_directly = 's_access_directly' in kwds_s
+ fresh_virtualizable = 's_fresh_virtualizable' in kwds_s
+ if access_directly or fresh_virtualizable:
+ assert access_directly, "lone fresh_virtualizable hint"
if isinstance(s_x, annmodel.SomeInstance):
from pypy.objspace.flow.model import Constant
classdesc = s_x.classdef.classdesc
@@ -28,6 +31,8 @@
if virtualizable is not None:
flags = s_x.flags.copy()
flags['access_directly'] = True
+ if fresh_virtualizable:
+ flags['fresh_virtualizable'] = True
s_x = annmodel.SomeInstance(s_x.classdef,
s_x.can_be_None,
flags)
More information about the Pypy-commit
mailing list