[pypy-svn] r79735 - in pypy/branch/out-of-line-guards/pypy/jit/codewriter: . test
fijal at codespeak.net
fijal at codespeak.net
Thu Dec 2 10:13:01 CET 2010
Author: fijal
Date: Thu Dec 2 10:13:00 2010
New Revision: 79735
Modified:
pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py
pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py
Log:
Implement jtransform layer of jit_invariant_field
Modified: pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py (original)
+++ pypy/branch/out-of-line-guards/pypy/jit/codewriter/jtransform.py Thu Dec 2 10:13:00 2010
@@ -14,6 +14,8 @@
from pypy.translator.simplify import get_funcobj
from pypy.translator.unsimplify import varoftype
+class JitInvariantError(Exception):
+ pass
def transform_graph(graph, cpu=None, callcontrol=None, portal_jd=None):
"""Transform a control flow graph to make it suitable for
@@ -536,7 +538,11 @@
if immut == "[*]":
self.immutable_arrays[op.result] = True
else:
- pure = ''
+ jit_inv = v_inst.concretetype.TO._hints.get('jit_invariant_fields')
+ if jit_inv and op.args[1].value[len('inst_'):] in jit_inv.fields:
+ pure = '_pure'
+ else:
+ pure = ''
argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
c_fieldname.value)
@@ -560,6 +566,10 @@
return [SpaceOperation('-live-', [], None),
SpaceOperation('setfield_vable_%s' % kind,
[v_inst, descr, v_value], None)]
+ jit_inv = v_inst.concretetype.TO._hints.get('jit_invariant_fields')
+ if jit_inv and op.args[1].value[len('inst_'):] in jit_inv.fields:
+ raise JitInvariantError("setfield on jit invariant should not"
+ " be ssen by jit")
argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
c_fieldname.value)
Modified: pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py (original)
+++ pypy/branch/out-of-line-guards/pypy/jit/codewriter/test/test_jtransform.py Thu Dec 2 10:13:00 2010
@@ -2,7 +2,7 @@
import random
from pypy.objspace.flow.model import FunctionGraph, Block, Link
from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
-from pypy.jit.codewriter.jtransform import Transformer
+from pypy.jit.codewriter.jtransform import Transformer, JitInvariantError
from pypy.jit.metainterp.history import getkind
from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rlist
from pypy.translator.unsimplify import varoftype
@@ -942,3 +942,34 @@
assert op1.args[1] == 'calldescr-%d' % effectinfo.EffectInfo.OS_ARRAYCOPY
assert op1.args[2] == ListOfKind('int', [v3, v4, v5])
assert op1.args[3] == ListOfKind('ref', [v1, v2])
+
+def test_jit_invariant():
+ from pypy.rpython.rclass import FieldListAccessor
+ from pypy.rpython.lltypesystem.rclass import ASMCODE
+ accessor = FieldListAccessor()
+ accessor.initialize(None, {'x': 'asmcodes_x'})
+ v2 = varoftype(lltype.Signed)
+ STRUCT = lltype.GcStruct('struct', ('inst_x', lltype.Signed),
+ ('asmcodes_x', lltype.Ptr(ASMCODE)),
+ hints={'jit_invariant_fields': accessor})
+ op = SpaceOperation('getfield', [const(lltype.malloc(STRUCT)),
+ Constant('inst_x', lltype.Void)], v2)
+ tr = Transformer(FakeCPU())
+ op1 = tr.rewrite_operation(op)
+ assert op1.opname == 'getfield_gc_i_pure'
+
+def test_jit_invariant_setfield():
+ from pypy.rpython.rclass import FieldListAccessor
+ from pypy.rpython.lltypesystem.rclass import ASMCODE
+ accessor = FieldListAccessor()
+ accessor.initialize(None, {'x': 'asmcodes_x'})
+ v1 = varoftype(lltype.Signed)
+ STRUCT = lltype.GcStruct('struct', ('inst_x', lltype.Signed),
+ ('asmcodes_x', lltype.Ptr(ASMCODE)),
+ hints={'jit_invariant_fields': accessor})
+ op = SpaceOperation('setfield', [const(lltype.malloc(STRUCT)),
+ Constant('inst_x', lltype.Void), v1],
+ varoftype(lltype.Void))
+ tr = Transformer(FakeCPU())
+ raises(JitInvariantError, tr.rewrite_operation, op)
+
More information about the Pypy-commit
mailing list