[pypy-svn] r74582 - in pypy/branch/blackhole-improvement/pypy/jit: codewriter codewriter/test metainterp
arigo at codespeak.net
arigo at codespeak.net
Wed May 19 17:27:37 CEST 2010
Author: arigo
Date: Wed May 19 17:27:35 2010
New Revision: 74582
Modified:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
Log:
Fix, in-progress.
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py Wed May 19 17:27:35 2010
@@ -444,8 +444,10 @@
def handle_getfield_typeptr(self, op):
# note: the 'G_' prefix tells that the operation might generate
- # a guard in pyjitpl (see liveness.py)
- return SpaceOperation('G_guard_class', [op.args[0]], op.result)
+ # a guard in pyjitpl (see liveness.py). The following 'keepalive'
+ # is needed to ensure that op.args[0] is restored on guard failure.
+ return [SpaceOperation('G_guard_class', [op.args[0]], op.result),
+ SpaceOperation('keepalive', [op.args[0]], None)]
def rewrite_op_malloc(self, op):
assert op.args[1].value == {'flavor': 'gc'}
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py Wed May 19 17:27:35 2010
@@ -283,10 +283,13 @@
c_name = Constant('typeptr', lltype.Void)
v_result = varoftype(rclass.OBJECT.typeptr)
op = SpaceOperation('getfield', [v_parent, c_name], v_result)
- op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
assert op1.opname == 'G_guard_class'
assert op1.args == [v_parent]
assert op1.result == v_result
+ assert op2.opname == 'keepalive'
+ assert op2.args == [v_parent]
+ assert op2.result == None
def test_setfield():
# XXX a more compact encoding would be possible; see test_getfield()
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py Wed May 19 17:27:35 2010
@@ -186,3 +186,25 @@
L2:
reraise
""")
+
+ def test_regalloc_lists(self):
+ v1 = Variable(); v1.concretetype = lltype.Signed
+ v2 = Variable(); v2.concretetype = lltype.Signed
+ v3 = Variable(); v3.concretetype = lltype.Signed
+ v4 = Variable(); v4.concretetype = lltype.Signed
+ v5 = Variable(); v5.concretetype = lltype.Signed
+ block = Block([v1])
+ block.operations = [
+ SpaceOperation('int_add', [v1, Constant(1, lltype.Signed)], v2),
+ SpaceOperation('rescall', [ListOfKind('int', [v1, v2])], v5),
+ SpaceOperation('rescall', [ListOfKind('int', [v1, v2])], v3),
+ ]
+ graph = FunctionGraph('f', block, v4)
+ block.closeblock(Link([v3], graph.returnblock))
+ #
+ self.check_assembler(graph, """
+ int_add %i0, $1, %i1
+ rescall I[%i0, %i1], %i2
+ rescall I[%i0, %i1], %i0
+ int_return %i0
+ """)
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py Wed May 19 17:27:35 2010
@@ -744,10 +744,10 @@
opimpl_ref_guard_value = _opimpl_guard_value
opimpl_float_guard_value = _opimpl_guard_value
- @arguments("box", "force_initial_pc")
- def opimpl_guard_class(self, box):
+ @arguments("box", "orgpc")
+ def opimpl_guard_class(self, box, orgpc):
clsbox = self.cls_of_box(box)
- self.generate_guard(rop.GUARD_CLASS, box, [clsbox])
+ self.generate_guard(rop.GUARD_CLASS, box, [clsbox], resumepc=orgpc)
return clsbox
## @FixME #arguments("orgpc", "box", "builtin")
@@ -924,7 +924,7 @@
except ChangeFrame:
pass
- def generate_guard(self, opnum, box=None, extraargs=[]):
+ def generate_guard(self, opnum, box=None, extraargs=[], resumepc=-1):
if isinstance(box, Const): # no need for a guard
return
metainterp = self.metainterp
@@ -947,8 +947,11 @@
virtualizable_boxes = None
if metainterp.staticdata.virtualizable_info is not None:
virtualizable_boxes = metainterp.virtualizable_boxes
+ if resumepc < 0:
+ resumepc = self.pc
resume.capture_resumedata(metainterp.framestack, virtualizable_boxes,
- metainterp.virtualref_boxes, resumedescr)
+ metainterp.virtualref_boxes, resumedescr,
+ resumepc)
self.metainterp.staticdata.profiler.count_ops(opnum, GUARDS)
# count
metainterp.attach_debug_info(guard_op)
@@ -2004,8 +2007,8 @@
assert position >= 0
args = ()
next_argcode = 0
- force_initial_pc = False
code = self.bytecode
+ orgpc = position
position += 1
for argtype in argtypes:
if argtype == "box": # a box, of whatever type
@@ -2068,17 +2071,15 @@
argcodes[next_argcode + 2])
next_argcode = next_argcode + 3
position = position3 + 1 + length3
- elif argtype == "force_initial_pc":
- force_initial_pc = True
- continue
+ elif argtype == "orgpc":
+ value = orgpc
else:
raise AssertionError("bad argtype: %r" % (argtype,))
args += (value,)
#
num_return_args = len(argcodes) - next_argcode
assert num_return_args == 0 or num_return_args == 1
- if not force_initial_pc:
- self.pc = position + num_return_args
+ self.pc = position + num_return_args
#
if not we_are_translated():
print '\tpyjitpl: %s(%s)' % (name, ', '.join(map(repr, args))),
@@ -2099,8 +2100,6 @@
else:
resultbox = unboundmethod(self, *args)
#
- if force_initial_pc:
- self.pc = position + num_return_args
if resultbox is not None:
self.make_result_of_lastop(resultbox)
#
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py Wed May 19 17:27:35 2010
@@ -25,10 +25,10 @@
class FrameInfo(object):
__slots__ = ('prev', 'jitcode', 'pc')
- def __init__(self, prev, frame):
+ def __init__(self, prev, jitcode, pc):
self.prev = prev
- self.jitcode = frame.jitcode
- self.pc = frame.pc
+ self.jitcode = jitcode
+ self.pc = pc
def _ensure_parent_resumedata(framestack, n):
target = framestack[n]
@@ -38,18 +38,19 @@
back = framestack[n-1]
target.parent_resumedata_frame_info_list = FrameInfo(
back.parent_resumedata_frame_info_list,
- back)
+ back.jitcode,
+ back.pc)
target.parent_resumedata_snapshot = Snapshot(
back.parent_resumedata_snapshot,
back.get_list_of_active_boxes())
def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
- storage):
+ storage, pc):
n = len(framestack)-1
top = framestack[n]
_ensure_parent_resumedata(framestack, n)
frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
- top)
+ top.jitcode, pc)
storage.rd_frame_info_list = frame_info_list
snapshot = Snapshot(top.parent_resumedata_snapshot,
top.get_list_of_active_boxes())
More information about the Pypy-commit
mailing list