[pypy-svn] r69909 - in pypy/branch/virtual-forcing/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Dec 4 22:57:07 CET 2009
Author: arigo
Date: Fri Dec 4 22:57:05 2009
New Revision: 69909
Added:
pypy/branch/virtual-forcing/pypy/jit/metainterp/virtualref.py
- copied unchanged from r69908, pypy/branch/virtual-forcing/pypy/jit/metainterp/vref.py
Removed:
pypy/branch/virtual-forcing/pypy/jit/metainterp/vref.py
Modified:
pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py
Log:
* rename vref.py to virtualref.py, to avoid confusion with local
variables that are also called vref.
* support virtual_ref_finish in the jit; its exact use is kept
purposefully obscure to confuse readers, but see next checkin.
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py Fri Dec 4 22:57:05 2009
@@ -1279,8 +1279,8 @@
return self._do_builtin_call(op, oopspec_name, args)
def _do_builtin_call(self, op, oopspec_name, args):
- if oopspec_name == 'virtual_ref':
- self.handle_virtual_ref_call(op, args)
+ if oopspec_name.startswith('virtual_ref'):
+ self.handle_virtual_ref_call(op, oopspec_name, args)
return
argtypes = [v.concretetype for v in args]
resulttype = op.result.concretetype
@@ -1302,8 +1302,8 @@
self.emit_varargs([c_func] + non_void_args)
self.register_var(op.result)
- def handle_virtual_ref_call(self, op, args):
- self.emit('virtual_ref')
+ def handle_virtual_ref_call(self, op, oopspec_name, args):
+ self.emit(oopspec_name) # 'virtual_ref' or 'virtual_ref_finish'
self.emit(self.var_position(args[0]))
self.register_var(op.result)
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py Fri Dec 4 22:57:05 2009
@@ -742,10 +742,10 @@
raise compile.GiveUp # results, so don't bother compiling it
#
# get some constants (these calls are all 'memo')
- from pypy.jit.metainterp import vref
- c_cls = vref.get_jit_virtual_ref_const_class(self.cpu)
- descr_virtual_token = vref.get_descr_virtual_token(self.cpu)
- descr_forced = vref.get_descr_forced(self.cpu)
+ from pypy.jit.metainterp import virtualref
+ c_cls = virtualref.get_jit_virtual_ref_const_class(self.cpu)
+ descr_virtual_token = virtualref.get_descr_virtual_token(self.cpu)
+ descr_forced = virtualref.get_descr_forced(self.cpu)
#
# Replace the VIRTUAL_REF operation with a virtual structure of type
# 'vref.JIT_VIRTUAL_REF'. The virtual structure may be forced soon,
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py Fri Dec 4 22:57:05 2009
@@ -5,7 +5,7 @@
from pypy.rlib.unroll import unrolling_iterable
from pypy.rlib.debug import debug_start, debug_stop, debug_print
-from pypy.jit.metainterp import history, compile, resume, vref
+from pypy.jit.metainterp import history, compile, resume, virtualref
from pypy.jit.metainterp.history import Const, ConstInt, Box
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp import codewriter, executor
@@ -889,11 +889,16 @@
@arguments("box")
def opimpl_virtual_ref(self, box):
obj = box.getref_base()
- res = vref.virtual_ref_during_tracing(obj)
- self.metainterp.all_virtual_refs.append(res)
- resbox = history.BoxPtr(res)
+ vref = virtualref.virtual_ref_during_tracing(obj)
+ #
+ if self.metainterp.all_virtual_refs is None:
+ self.metainterp.all_virtual_refs = []
+ self.metainterp.all_virtual_refs.append(vref)
+ #
+ resbox = history.BoxPtr(vref)
self.metainterp.history.record(rop.VIRTUAL_REF, [box], resbox)
- # Note: we create a JIT_VIRTUAL_REF here, in order to detect when
+ # Note: we allocate a JIT_VIRTUAL_REF here
+ # (in virtual_ref_during_tracing()), in order to detect when
# the virtual escapes during tracing already. We record it as a
# VIRTUAL_REF operation, although the backend sees this operation
# as a no-op. The point is that the backend should not really see
@@ -901,6 +906,14 @@
# replace it with a NEW_WITH_VTABLE followed by SETFIELD_GCs.
self.make_result_box(resbox)
+ @arguments("box")
+ def opimpl_virtual_ref_finish(self, box):
+ # virtual_ref_finish() assumes that we have a stack-like, last-in
+ # first-out order.
+ if not self.metainterp.is_blackholing():
+ lastitem = self.metainterp.all_virtual_refs.pop()
+ assert box.getref_base() == lastitem
+
# ------------------------------
def setup_call(self, argboxes):
@@ -1209,6 +1222,7 @@
class MetaInterp(object):
in_recursion = 0
+ all_virtual_refs = None
_already_allocated_resume_virtuals = None
def __init__(self, staticdata):
@@ -1216,7 +1230,6 @@
self.cpu = staticdata.cpu
self.portal_trace_positions = []
self.greenkey_of_huge_function = None
- self.all_virtual_refs = []
def is_blackholing(self):
return self.history is None
@@ -1773,10 +1786,10 @@
self.load_fields_from_virtualizable()
def virtual_after_residual_call(self):
- if self.is_blackholing():
+ if self.is_blackholing() or self.all_virtual_refs is None:
return
for vr in self.all_virtual_refs:
- if vref.was_forced(vr):
+ if virtualref.was_forced(vr):
break
else:
return
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py Fri Dec 4 22:57:05 2009
@@ -102,8 +102,8 @@
mayforcevirtdescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
EffectInfo([], [], forces_virtual_or_virtualizable=True))
- from pypy.jit.metainterp.vref import jit_virtual_ref_vtable
- from pypy.jit.metainterp.vref import JIT_VIRTUAL_REF
+ from pypy.jit.metainterp.virtualref import jit_virtual_ref_vtable
+ from pypy.jit.metainterp.virtualref import JIT_VIRTUAL_REF
virtualtokendescr = cpu.fielddescrof(JIT_VIRTUAL_REF, 'virtual_token')
cpu.class_sizes = {cpu.cast_adr_to_int(node_vtable_adr): cpu.sizeof(NODE),
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py Fri Dec 4 22:57:05 2009
@@ -2068,6 +2068,42 @@
"""
self.optimize_loop(ops, 'Not, Not', expected)
+ def test_vref_virtual_2(self):
+ self.make_fail_descr()
+ ops = """
+ [p0, i1]
+ #
+ p1 = new_with_vtable(ConstClass(node_vtable))
+ p1b = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p1b, i1, descr=valuedescr)
+ setfield_gc(p1, p1b, descr=nextdescr)
+ #
+ p2 = virtual_ref(p1)
+ setfield_gc(p0, p2, descr=nextdescr)
+ call_may_force(i1, descr=mayforcevirtdescr)
+ guard_not_forced(descr=fdescr) [p1]
+ setfield_gc(p0, NULL, descr=nextdescr)
+ jump(p0, i1)
+ """
+ expected = """
+ [p0, i1]
+ i3 = force_token()
+ p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+ setfield_gc(p2, i3, descr=virtualtokendescr)
+ setfield_gc(p0, p2, descr=nextdescr)
+ call_may_force(i1, descr=mayforcevirtdescr)
+ guard_not_forced(descr=fdescr) [i1]
+ setfield_gc(p0, NULL, descr=nextdescr)
+ jump(p0, i1)
+ """
+ # the point of this test is that 'i1' should show up in the fail_args
+ # of 'guard_not_forced', because it was stored in the virtual 'p1b'.
+ self.optimize_loop(ops, 'Not, Not', expected)
+ self.check_expanded_fail_descr('''p1
+ where p1 is a node_vtable, nextdescr=p1b
+ where p1b is a node_vtable, valuedescr=i1
+ ''')
+
class TestOOtype(BaseTestOptimizeOpt, OOtypeMixin):
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py Fri Dec 4 22:57:05 2009
@@ -1,5 +1,6 @@
import py
-from pypy.rlib.jit import JitDriver, dont_look_inside, virtual_ref
+from pypy.rlib.jit import JitDriver, dont_look_inside
+from pypy.rlib.jit import virtual_ref, virtual_ref_finish
from pypy.rlib.objectmodel import compute_unique_id
from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
@@ -14,8 +15,9 @@
exctx = ExCtx()
#
def f():
- exctx.topframeref = virtual_ref(X())
+ exctx.topframeref = vref = virtual_ref(X())
exctx.topframeref = None
+ virtual_ref_finish(vref)
return 1
#
self.interp_operations(f, [])
@@ -43,6 +45,8 @@
x.n = n + 123
exctx.topframeref = virtual_ref(x)
total += force_me() - 100
+ exctx.topframeref = None
+ virtual_ref_finish(x)
return total
#
res = self.meta_interp(f, [-4])
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py Fri Dec 4 22:57:05 2009
@@ -17,7 +17,7 @@
from pypy.translator.unsimplify import call_final_function
from pypy.jit.metainterp import codewriter
-from pypy.jit.metainterp import support, history, pyjitpl, gc, vref
+from pypy.jit.metainterp import support, history, pyjitpl, gc, virtualref
from pypy.jit.metainterp.pyjitpl import MetaInterpStaticData, MetaInterp
from pypy.jit.metainterp.policy import JitPolicy
from pypy.jit.metainterp.typesystem import LLTypeHelper, OOTypeHelper
@@ -604,7 +604,8 @@
if self.cpu.ts.name != 'lltype':
py.test.skip("rewrite_force_virtual: port it to ootype")
all_graphs = self.translator.graphs
- vref.replace_force_virtual_with_call(self.helper_func, all_graphs)
+ virtualref.replace_force_virtual_with_call(self.helper_func,
+ all_graphs)
def decode_hp_hint_args(op):
More information about the Pypy-commit
mailing list