[pypy-commit] pypy resume-refactor: progress
fijal
noreply at buildbot.pypy.org
Wed Sep 25 20:07:30 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r67102:74607bbebebf
Date: 2013-09-25 20:06 +0200
http://bitbucket.org/pypy/pypy/changeset/74607bbebebf/
Log: progress
diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -4,7 +4,7 @@
from rpython.jit.metainterp.history import (INT, REF, FLOAT, JitCellToken,
ConstInt, BoxInt, AbstractFailDescr)
from rpython.jit.metainterp.resoperation import ResOperation, rop
-from rpython.jit.metainterp.resume2 import rebuild_locs_from_resumedata
+#from rpython.jit.metainterp.resume2 import rebuild_locs_from_resumedata
from rpython.rlib import rgc
from rpython.rlib.debug import (debug_start, debug_stop, have_debug_prints,
debug_print)
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -469,15 +469,14 @@
'READ_TIMESTAMP/0',
'MARK_OPAQUE_PTR/1b',
'_RESUME_FIRST',
+ # resume-only operations that never make it to the real assembler
'ENTER_FRAME/1d',
'LEAVE_FRAME/0',
'RESUME_PUT/3',
'RESUME_NEW/0d',
'RESUME_SETFIELD_GC/2d',
'BACKEND_ATTACH/2',
- # same as resume_put, but the first arg is backend-dependent,
- # instead of a box
- '_RESUME_LAST',
+ '_RESUME_LAST', # ----- end of resume only operations ------
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
'SETARRAYITEM_GC/3d',
diff --git a/rpython/jit/metainterp/resume2.py b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -14,6 +14,10 @@
def rebuild(self, faildescr):
self._rebuild_until(faildescr.rd_resume_bytecode,
faildescr.rd_bytecode_position)
+ self.finish()
+
+ def finish(self):
+ pass
def _rebuild_until(self, rb, position):
if rb.parent is not None:
@@ -37,6 +41,8 @@
elif op.getopnum() == rop.RESUME_SETFIELD_GC:
self.resume_setfield_gc(op.getarg(0), op.getarg(1),
op.getdescr())
+ elif op.getopnum() == rop.BACKEND_ATTACH:
+ self.resume_backend_attach(op.getarg(0), op.getarg(1).getint())
elif not op.is_resume():
pos += 1
continue
@@ -44,12 +50,11 @@
xxx
pos += 1
- def resume_put(self, jitframe_index, depth, frontend_position):
- XXX
+ def resume_put(self, box, depth, frontend_position):
jitcode = self.metainterp.framestack[-1].jitcode
frame = self.metainterp.framestack[- depth - 1]
if frontend_position < jitcode.num_regs_i():
- self.write_int(frame, frontend_position, jitframe_index)
+ self.put_box_int(frame, frontend_position, box)
elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
xxx
else:
@@ -63,6 +68,10 @@
def __init__(self, metainterp, deadframe):
self.metainterp = metainterp
self.deadframe = deadframe
+ self.backend_values = {}
+
+ def resume_backend_attach(self, box, position):
+ self.backend_values[box] = position
def enter_frame(self, pc, jitcode):
if pc != -1:
@@ -72,49 +81,18 @@
def leave_frame(self):
self.metainterp.popframe()
- def write_int(self, frame, pos, jitframe_index):
+ def put_box_int(self, frame, position, box):
+ frame.registers_i[position] = box
+
+ def finish(self):
cpu = self.metainterp.cpu
- value = cpu.get_int_value(self.deadframe, jitframe_index)
- frame.registers_i[pos] = BoxInt(value)
-
-class ReconstructingResumeReader(AbstractResumeReader):
- def __init__(self):
- self.framestack = []
-
- def enter_frame(self, pc, jitcode):
- self.framestack.append([-1] * jitcode.num_regs())
-
- def put(self, jitframe_index, depth, frontend_position):
- self.framestack[- depth - 1][frontend_position] = jitframe_index
-
- def leave_frame(self):
- self.framestack.pop()
-
-class SimpleResumeReader(AbstractResumeReader):
- def __init__(self):
- self.framestack = []
-
- def enter_frame(self, pc, jitcode):
- self.framestack.append(jitcode.num_regs())
-
- def put(self, *args):
- pass
-
- def leave_frame(self):
- self.framestack.pop()
+ for box, position in self.backend_values.iteritems():
+ if box.type == 'i':
+ intval = cpu.get_int_value(self.deadframe, position)
+ assert isinstance(box, BoxInt)
+ box.value = intval
+ else:
+ xxx
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
-
-def rebuild_locs_from_resumedata(faildescr):
- reader = ReconstructingResumeReader()
- reader.rebuild(faildescr)
- size = 0
- for frame in reader.framestack:
- size += len(frame)
- res = [-1] * size
- i = 0
- for frame in reader.framestack:
- res[i : i + len(frame)] = frame
- i += len(frame)
- return res
diff --git a/rpython/jit/metainterp/test/test_resume2.py b/rpython/jit/metainterp/test/test_resume2.py
--- a/rpython/jit/metainterp/test/test_resume2.py
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -3,7 +3,7 @@
from rpython.jit.codewriter.jitcode import JitCode
from rpython.jit.metainterp.history import AbstractDescr
from rpython.jit.metainterp.resume2 import rebuild_from_resumedata,\
- rebuild_locs_from_resumedata, ResumeBytecode
+ ResumeBytecode
class Descr(AbstractDescr):
@@ -40,14 +40,15 @@
jitcode = JitCode("jitcode")
jitcode.setup(num_regs_i=13)
resume_loop = parse("""
- []
+ [i0]
enter_frame(-1, descr=jitcode1)
- backend_put(10, 0, 1)
+ resume_put(i0, 0, 1)
+ backend_attach(i0, 10)
leave_frame()
""", namespace={'jitcode1': jitcode})
descr = Descr()
descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
- descr.rd_bytecode_position = 2
+ descr.rd_bytecode_position = 3
metainterp = MockMetaInterp()
metainterp.cpu = MockCPU()
rebuild_from_resumedata(metainterp, "myframe", descr)
@@ -61,21 +62,25 @@
jitcode2 = JitCode("jitcode2")
jitcode2.setup(num_regs_i=9)
resume_loop = parse("""
- []
+ [i0, i1, i2, i3]
enter_frame(-1, descr=jitcode1)
- backend_put(11, 0, 2)
+ resume_put(i0, 0, 2)
+ backend_attach(i0, 11)
enter_frame(12, descr=jitcode2)
- backend_put(12, 0, 3)
- backend_put(8, 1, 4)
+ resume_put(i1, 0, 3)
+ resume_put(i2, 1, 4)
+ backend_attach(i1, 12)
+ backend_attach(i2, 8)
leave_frame()
- backend_put(10, 0, 1)
+ backend_attach(i3, 10)
+ resume_put(i3, 0, 1)
leave_frame()
""", namespace={'jitcode1': jitcode1, 'jitcode2': jitcode2})
metainterp = MockMetaInterp()
metainterp.cpu = MockCPU()
descr = Descr()
descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
- descr.rd_bytecode_position = 5
+ descr.rd_bytecode_position = 8
rebuild_from_resumedata(metainterp, "myframe", descr)
assert len(metainterp.framestack) == 2
f = metainterp.framestack[-1]
@@ -86,7 +91,7 @@
assert f2.registers_i[4].getint() == 8 + 3
assert f2.registers_i[2].getint() == 11 + 3
- descr.rd_bytecode_position = 7
+ descr.rd_bytecode_position = 11
metainterp.framestack = []
rebuild_from_resumedata(metainterp, "myframe", descr)
assert len(metainterp.framestack) == 1
@@ -100,21 +105,24 @@
jitcode1 = JitCode("jitcode")
jitcode1.setup(num_regs_i=13)
base = parse("""
- []
+ [i0, i1]
enter_frame(-1, descr=jitcode1)
- backend_put(42, 0, 0)
+ resume_put(i0, 0, 0)
+ backend_attach(i0, 42)
# here is the split caused by a guard
- backend_put(1, 0, 1)
+ resume_put(i1, 0, 1)
+ backend_attach(i1, 1)
""", namespace={'jitcode1': jitcode1})
bridge = parse("""
- []
- backend_put(2, 0, 1)
+ [i2]
+ resume_put(i2, 0, 1)
+ backend_attach(i2, 2)
""")
descr = Descr()
- descr.rd_bytecode_position = 1
+ descr.rd_bytecode_position = 2
parent = ResumeBytecode(base.operations)
b = ResumeBytecode(bridge.operations, parent=parent,
- parent_position=2)
+ parent_position=3)
descr.rd_resume_bytecode = b
metainterp = MockMetaInterp()
metainterp.cpu = MockCPU()
@@ -125,17 +133,19 @@
assert f.registers_i[1].getint() == 2 + 3
def test_new(self):
+ jitcode1 = JitCode("jitcode")
+ jitcode1.setup(num_regs_i=1)
base = parse("""
[]
enter_frame(-1, descr=jitcode)
i0 = new(descr=structdescr)
- XXX
- resume_setfield(i0, 13
+ resume_setfield(i0, 13, descr=fielddescr)
backend_put(12,
leave_frame()
- """)
+ """, namespace={'jitcode':jitcode})
def test_reconstructing_resume_reader(self):
+ XXX
jitcode1 = JitCode("jitcode")
jitcode1.setup(num_regs_i=3, num_regs_f=0, num_regs_r=0)
jitcode2 = JitCode("jitcode2")
More information about the pypy-commit
mailing list