Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68640:c2ad1730a302
Date: 2014-01-13 11:53 +0100
http://bitbucket.org/pypy/pypy/changeset/c2ad1730a302/
Log: (fijal, rguillebert) don't eagerly create frames, but instead do the
computations symbolically
diff --git a/rpython/jit/backend/resumebuilder.py
b/rpython/jit/backend/resumebuilder.py
--- a/rpython/jit/backend/resumebuilder.py
+++ b/rpython/jit/backend/resumebuilder.py
@@ -48,6 +48,9 @@
def leave_frame(self):
self.framestack.pop()
+ def rebuild(self, faildescr):
+ raise Exception("should not be called")
+
class ResumeBuilder(object):
def __init__(self, regalloc, frontend_liveness, descr, inputframes=None,
inputlocs=None):
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2409,8 +2409,8 @@
try:
self.portal_call_depth = -1 # always one portal around
self.history = history.History()
- inputargs_and_holes = self.rebuild_state_after_failure(resumedescr,
- deadframe)
+ self.rebuild_state_after_failure(resumedescr, deadframe)
+ xxx
self.history.inputargs = [box for box in inputargs_and_holes if
box]
finally:
rstack._stack_criticalcode_stop()
@@ -2531,10 +2531,10 @@
vinfo = self.jitdriver_sd.virtualizable_info
ginfo = self.jitdriver_sd.greenfield_info
self.framestack = []
- xxx
- boxlists = resume.rebuild_from_resumedata(self, resumedescr, deadframe,
- vinfo, ginfo)
- inputargs_and_holes, virtualizable_boxes, virtualref_boxes = boxlists
+ inputframes = resume2.rebuild_from_resumedata(self, deadframe,
+ resumedescr)
+ virtualizable_boxes = None
+ virtualref_boxes = None
#
# virtual refs: make the vrefs point to the freshly allocated virtuals
self.virtualref_boxes = virtualref_boxes
@@ -2565,7 +2565,7 @@
else:
assert not virtualizable_boxes
#
- return inputargs_and_holes
+ return inputframes
def check_synchronized_virtualizable(self):
if not we_are_translated():
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
@@ -1,6 +1,6 @@
from rpython.jit.metainterp.resoperation import rop
-from rpython.jit.metainterp.history import BoxInt
+from rpython.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat
from rpython.jit.codewriter.jitcode import JitCode
from rpython.rlib import rstack
@@ -11,7 +11,16 @@
self.parent_position = parent_position
self.loop = loop
+class ResumeFrame(object):
+ def __init__(self, jitcode):
+ self.registers = [-1] * jitcode.num_regs()
+ self.jitcode = jitcode
+ self.pc = -1
+
class AbstractResumeReader(object):
+ def __init__(self):
+ self.framestack = []
+
def rebuild(self, faildescr):
self._rebuild_until(faildescr.rd_resume_bytecode,
faildescr.rd_bytecode_position)
@@ -20,6 +29,22 @@
def finish(self):
pass
+ def enter_frame(self, pc, jitcode):
+ if self.framestack:
+ assert pc != -1
+ self.framestack[-1].pc = pc
+ self.framestack.append(ResumeFrame(jitcode))
+
+ def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
+ jitframe_pos = jitframe_pos_const.getint()
+ self.framestack[frame_no].registers[frontend_position] = jitframe_pos
+
+ def resume_set_pc(self, pc):
+ self.framestack[-1].pc = pc
+
+ def leave_frame(self):
+ self.framestack.pop()
+
def _rebuild_until(self, rb, position):
if rb.parent is not None:
self._rebuild_until(rb.parent, rb.parent_position)
@@ -36,7 +61,7 @@
self.leave_frame()
elif op.getopnum() == rop.RESUME_PUT:
self.resume_put(op.getarg(0), op.getarg(1).getint(),
- op.getarg(2).getint())
+ op.getarg(2).getint())
elif op.getopnum() == rop.RESUME_NEW:
self.resume_new(op.result, op.getdescr())
elif op.getopnum() == rop.RESUME_SETFIELD_GC:
@@ -51,20 +76,6 @@
xxx
pos += 1
- def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
- jitframe_pos = jitframe_pos_const.getint()
- jitcode = self.get_jitcode(frame_no)
- if frontend_position < jitcode.num_regs_i():
- self.put_box_int(frame_no, frontend_position, jitframe_pos)
- elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
- self.put_box_ref(frame_no, frontend_position -
jitcode.num_regs_i(),
- jitframe_pos)
- else:
- assert frontend_position < jitcode.num_regs()
- self.put_box_float(frame_no,
- frontend_position - jitcode.num_regs_r()
- - jitcode.num_regs_i(), jitframe_pos)
-
def read_int(self, jitframe_pos):
return self.metainterp.cpu.get_int_value(self.deadframe, jitframe_pos)
@@ -75,12 +86,6 @@
self.deadframe = deadframe
self.bhinterp_stack = []
- def get_jitcode(self, no):
- return self.bhinterp_stack[no].jitcode
-
- def get_frame(self, no):
- return self.bhinterp_stack[no]
-
def enter_frame(self, pc, jitcode):
if pc != -1:
self.bhinterp_stack[-1].position = pc
@@ -112,34 +117,37 @@
def __init__(self, metainterp, deadframe):
self.metainterp = metainterp
self.deadframe = deadframe
+ AbstractResumeReader.__init__(self)
- def enter_frame(self, pc, jitcode):
- if pc != -1:
- self.metainterp.framestack[-1].pc = pc
- self.metainterp.newframe(jitcode)
+ def get_int_box(self, pos):
+ return BoxInt(self.metainterp.cpu.get_int_value(self.deadframe, pos))
- def leave_frame(self):
- self.metainterp.popframe()
+ def get_ref_box(self, pos):
+ return BoxPtr(self.metainterp.cpu.get_ref_value(self.deadframe, pos))
- def put_box_int(self, frame_no, position, jitframe_pos):
- frame = self.metainterp.framestack[frame_no]
- frame.registers_i[position] = BoxInt(self.read_int(jitframe_pos))
-
- def put_box_ref(self, frame_no, position, jitframe_pos):
- frame = self.metainterp.framestack[frame_no]
- xxx
- frame.registers_r[position] = self.read_ref(jitframe_pos)
-
- def put_box_float(self, frame_no, position, jitframe_pos):
- frame = self.metainterp.framestack[frame_no]
- xxx
- frame.registers_f[position] = self.read_float(jitframe_pos)
+ def get_float_box(self, pos):
+ return BoxFloat(self.metainterp.cpu.get_float_value(self.deadframe,
+ pos))
def finish(self):
- pass
-
+ for frame in self.framestack:
+ jitcode = frame.jitcode
+ miframe = self.metainterp.newframe(jitcode)
+ miframe.pc = frame.pc
+ pos = 0
+ for i in range(jitcode.num_regs_i()):
+ miframe.registers_i[i] = self.get_int_box(frame.registers[pos])
+ pos += 1
+ for i in range(jitcode.num_regs_r()):
+ miframe.registers_r[i] = self.get_ref_box(frame.registers[pos])
+ pos += 1
+ for i in range(jitcode.num_regs_f()):
+ jitframe_pos = frame.registers[pos]
+ miframe.registers_f[i] = self.get_float_box(jitframe_pos)
+ pos += 1
+
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
- BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
+ return BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
def blackhole_from_resumedata(interpbuilder, metainterp_sd, faildescr,
deadframe, all_virtuals=None):
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
@@ -4,7 +4,7 @@
from rpython.jit.codewriter.jitcode import JitCode
from rpython.jit.metainterp.history import AbstractDescr
from rpython.jit.metainterp.resume2 import rebuild_from_resumedata,\
- ResumeBytecode, BoxResumeReader
+ ResumeBytecode, AbstractResumeReader
class Descr(AbstractDescr):
@@ -21,7 +21,7 @@
self.registers_f = [None] * jitcode.num_regs_f()
def num_nonempty_regs(self):
- return len(filter(bool, self.registers_i))
+ return len([i for i in self.registers_i if i.getint() != 2])
def dump_registers(self, lst, backend_values):
lst += [backend_values[x] for x in self.registers_i]
@@ -34,7 +34,9 @@
self.framestack = []
def newframe(self, jitcode):
- self.framestack.append(Frame(jitcode))
+ f = Frame(jitcode)
+ self.framestack.append(f)
+ return f
def popframe(self):
self.framestack.pop()
@@ -44,25 +46,9 @@
assert frame == "myframe"
return index + 3
-class RebuildingResumeReader(BoxResumeReader):
- def __init__(self):
- self.metainterp = MockMetaInterp()
-
- def put_box_int(self, frame, position, jitframe_pos):
- frame.registers_i[position] = jitframe_pos
-
- def put_box_float(self, frame, position, jitframe_pos):
- frame.registers_f[position] = jitframe_pos
-
- def put_box_ref(self, frame, position, jitframe_pos):
- frame.registers_r[position] = jitframe_pos
-
+class RebuildingResumeReader(AbstractResumeReader):
def finish(self):
- framestack = []
- for frame in self.metainterp.framestack:
- framestack.append(frame.registers_i + frame.registers_r +
- frame.registers_f)
- return framestack
+ return [f.registers for f in self.framestack]
def rebuild_locs_from_resumedata(faildescr):
return RebuildingResumeReader().rebuild(faildescr)
@@ -70,7 +56,7 @@
class TestResumeDirect(object):
def test_box_resume_reader(self):
jitcode = JitCode("jitcode")
- jitcode.setup(num_regs_i=13)
+ jitcode.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
resume_loop = parse("""
[]
enter_frame(-1, descr=jitcode1)
@@ -89,9 +75,9 @@
def test_nested_call(self):
jitcode1 = JitCode("jitcode")
- jitcode1.setup(num_regs_i=13)
+ jitcode1.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
jitcode2 = JitCode("jitcode2")
- jitcode2.setup(num_regs_i=9)
+ jitcode2.setup(num_regs_i=9, num_regs_r=0, num_regs_f=0)
resume_loop = parse("""
[]
enter_frame(-1, descr=jitcode1)
@@ -130,7 +116,7 @@
def test_bridge(self):
jitcode1 = JitCode("jitcode")
- jitcode1.setup(num_regs_i=13)
+ jitcode1.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
base = parse("""
[]
enter_frame(-1, descr=jitcode1)
@@ -160,7 +146,7 @@
def test_new(self):
py.test.skip("finish")
jitcode1 = JitCode("jitcode")
- jitcode1.setup(num_regs_i=1)
+ jitcode1.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
base = parse("""
[]
enter_frame(-1, descr=jitcode)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit