[pypy-svn] r71373 - in pypy/branch/debug-vref2/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Sun Feb 21 13:26:21 CET 2010
Author: arigo
Date: Sun Feb 21 13:26:20 2010
New Revision: 71373
Modified:
pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py
pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Force a full flush of optimized fields when seeing a CALL(_MAY_FORCE)
to some function that can indeed force virtualizables or vrefs.
Modified: pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/debug-vref2/pypy/jit/metainterp/optimizeopt.py Sun Feb 21 13:26:20 2010
@@ -795,17 +795,10 @@
# forcing it now does not have catastrophic effects.
vrefinfo = self.metainterp_sd.virtualref_info
assert op.args[1].nonnull()
- # - write code to check that op.args[1] is not null
- if not self.getvalue(op.args[1]).is_virtual():
- op1 = ResOperation(rop.ASSERT, [op.args[1]], None)
- self.emit_operation(op1)
# - set 'forced' to point to the real object
op1 = ResOperation(rop.SETFIELD_GC, op.args, None,
descr = vrefinfo.descr_forced)
self.optimize_SETFIELD_GC(op1)
- op1 = ResOperation(rop.SETFIELD_GC, op.args, None,
- descr = vrefinfo.descr_debug_setforced)
- self.optimize_SETFIELD_GC(op1)
# - set 'virtual_token' to TOKEN_NONE
args = [op.args[0], ConstInt(vrefinfo.TOKEN_NONE)]
op1 = ResOperation(rop.SETFIELD_GC, args, None,
@@ -1040,7 +1033,8 @@
effectinfo = None
else:
effectinfo = op.descr.get_extra_info()
- if effectinfo is not None:
+ if (effectinfo is not None and
+ not effectinfo.forces_virtual_or_virtualizable):
# XXX we can get the wrong complexity here, if the lists
# XXX stored on effectinfo are large
for fielddescr in effectinfo.readonly_descrs_fields:
Modified: pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/debug-vref2/pypy/jit/metainterp/test/test_optimizeopt.py Sun Feb 21 13:26:20 2010
@@ -2509,7 +2509,6 @@
expected = """
[p1]
i0 = force_token()
- assert(p1)
jump(p1)
"""
self.optimize_loop(ops, 'Not', expected)
@@ -2529,10 +2528,9 @@
setfield_gc(p2, i0, descr=virtualtokendescr)
setfield_gc(p2, 5, descr=virtualrefindexdescr)
escape(p2)
- assert(p1)
setfield_gc(p2, p1, descr=virtualforceddescr)
setfield_gc(p2, -2, descr=virtualtokendescr)
- setfield_gc(p2, 120, descr=virtualdebugfrom)
+ setfield_gc(p2, 121, descr=virtualdebugfrom)
jump(p1)
"""
# XXX we should optimize a bit more the case of a nonvirtual.
@@ -2567,17 +2565,16 @@
#
call_may_force(i1, descr=mayforcevirtdescr)
guard_not_forced() [i1]
- setfield_gc(p0, NULL, descr=nextdescr)
#
p1 = new_with_vtable(ConstClass(node_vtable))
p1b = new_with_vtable(ConstClass(node_vtable))
setfield_gc(p1b, 252, descr=valuedescr)
setfield_gc(p1, p1b, descr=nextdescr)
- #assert(p1) -- virtual up to right here
setfield_gc(p2, p1, descr=virtualforceddescr)
setfield_gc(p2, -2, descr=virtualtokendescr)
- setfield_gc(p2, 120, descr=virtualdebugfrom)
+ setfield_gc(p2, 121, descr=virtualdebugfrom)
#
+ setfield_gc(p0, NULL, descr=nextdescr)
jump(p0, i1)
"""
self.optimize_loop(ops, 'Not, Not', expected)
@@ -2611,17 +2608,16 @@
#
call_may_force(i1, descr=mayforcevirtdescr)
guard_not_forced(descr=fdescr) [p2, i1]
- setfield_gc(p0, NULL, descr=nextdescr)
#
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)
- #assert(p1) -- virtual up to right here
setfield_gc(p2, p1, descr=virtualforceddescr)
setfield_gc(p2, -2, descr=virtualtokendescr)
- setfield_gc(p2, 120, descr=virtualdebugfrom)
+ setfield_gc(p2, 121, descr=virtualdebugfrom)
#
+ setfield_gc(p0, NULL, descr=nextdescr)
jump(p0, i1)
"""
# the point of this test is that 'i1' should show up in the fail_args
@@ -2671,6 +2667,33 @@
where p1b is a node_vtable, valuedescr=i1
''')
+ def test_vref_nonvirtual_and_lazy_setfield(self):
+ self.make_fail_descr()
+ ops = """
+ [i1, p1]
+ p2 = virtual_ref(p1, 23)
+ escape(p2)
+ virtual_ref_finish(p2, p1)
+ call_may_force(i1, descr=mayforcevirtdescr)
+ guard_not_forced() [i1]
+ jump(i1, p1)
+ """
+ expected = """
+ [i1, p1]
+ i3 = force_token()
+ p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+ setfield_gc(p2, i3, descr=virtualtokendescr)
+ setfield_gc(p2, 23, descr=virtualrefindexdescr)
+ escape(p2)
+ setfield_gc(p2, p1, descr=virtualforceddescr)
+ setfield_gc(p2, -2, descr=virtualtokendescr)
+ setfield_gc(p2, 121, descr=virtualdebugfrom)
+ call_may_force(i1, descr=mayforcevirtdescr)
+ guard_not_forced() [i1]
+ jump(i1, p1)
+ """
+ self.optimize_loop(ops, 'Not, Not', expected)
+
class TestOOtype(BaseTestOptimizeOpt, OOtypeMixin):
More information about the Pypy-commit
mailing list