Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68638:7c8b3cf8c3b5
Date: 2014-01-12 17:37 +0100
http://bitbucket.org/pypy/pypy/changeset/7c8b3cf8c3b5/
Log: hack enough to get the first frontend test passing
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -68,6 +68,9 @@
def process_leave_frame(self, op):
self.framestack.pop()
+ def process_resume_set_pc(self, op):
+ pass
+
def process_resume_put(self, op):
box = op.getarg(0)
frame_pos = op.getarg(1).getint()
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
@@ -27,6 +27,9 @@
def resume_setfield_gc(self, arg0, arg1, descr):
self.deps[arg0][descr] = arg1
+ def resume_set_pc(self, pc):
+ pass
+
def _track(self, allboxes, box):
if box in self.deps:
for dep in self.deps[box].values():
diff --git a/rpython/jit/metainterp/blackhole.py
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -2,7 +2,7 @@
from rpython.jit.codewriter.jitcode import JitCode, SwitchDictDescr
from rpython.jit.metainterp.compile import ResumeAtPositionDescr
from rpython.jit.metainterp.jitexc import get_llexception, reraise
-from rpython.jit.metainterp import jitexc
+from rpython.jit.metainterp import jitexc, resume2
from rpython.rlib import longlong2float
from rpython.rlib.debug import ll_assert, make_sure_not_resized
from rpython.rlib.objectmodel import we_are_translated
@@ -1608,11 +1608,10 @@
def resume_in_blackhole(metainterp_sd, jitdriver_sd, resumedescr, deadframe,
all_virtuals=None):
- from rpython.jit.metainterp.resume import blackhole_from_resumedata
#debug_start('jit-blackhole')
- blackholeinterp = blackhole_from_resumedata(
+ blackholeinterp = resume2.blackhole_from_resumedata(
metainterp_sd.blackholeinterpbuilder,
- jitdriver_sd,
+ metainterp_sd,
resumedescr,
deadframe,
all_virtuals)
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -133,14 +133,6 @@
def repr_of_descr(self):
return '%r' % (self,)
- def _clone_if_mutable(self):
- return self
- def clone_if_mutable(self):
- clone = self._clone_if_mutable()
- if not we_are_translated():
- assert clone.__class__ is self.__class__
- return clone
-
def hide(self, cpu):
descr_ptr = cpu.ts.cast_instance_to_base_ref(self)
return cpu.ts.cast_to_ref(descr_ptr)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -291,20 +291,6 @@
retrace_limit = 5
max_retrace_guards = 15
-class Storage(compile.ResumeGuardDescr):
- "for tests."
- def __init__(self, metainterp_sd=None, original_greenkey=None):
- self.metainterp_sd = metainterp_sd
- self.original_greenkey = original_greenkey
- def store_final_boxes(self, op, boxes):
- op.setfailargs(boxes)
- def __eq__(self, other):
- return type(self) is type(other) # xxx obscure
- def clone_if_mutable(self):
- res = Storage(self.metainterp_sd, self.original_greenkey)
- self.copy_all_attributes_into(res)
- return res
-
def _sortboxes(boxes):
_kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
return sorted(boxes, key=lambda box: _kind2count[box.type])
@@ -399,23 +385,6 @@
return preamble
-class FakeDescr(compile.ResumeGuardDescr):
- def clone_if_mutable(self):
- return FakeDescr()
- def __eq__(self, other):
- return isinstance(other, FakeDescr)
-
-class FakeDescrWithSnapshot(compile.ResumeGuardDescr):
- class rd_snapshot:
- class prev:
- prev = None
- boxes = []
- boxes = []
- def clone_if_mutable(self):
- return FakeDescrWithSnapshot()
- def __eq__(self, other):
- return isinstance(other, Storage) or isinstance(other,
FakeDescrWithSnapshot)
-
def convert_old_style_to_targets(loop, jump):
newloop = TreeLoop(loop.name)
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
@@ -5,7 +5,7 @@
from rpython.jit.codewriter import heaptracker
from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.jit.codewriter.jitcode import JitCode, SwitchDictDescr
-from rpython.jit.metainterp import history, compile, resume, executor, jitexc
+from rpython.jit.metainterp import history, compile, resume2, executor, jitexc
from rpython.jit.metainterp.heapcache import HeapCache
from rpython.jit.metainterp.history import (Const, ConstInt, ConstPtr,
ConstFloat, Box, TargetToken)
@@ -41,9 +41,11 @@
self.registers_i = [None] * 256
self.registers_r = [None] * 256
self.registers_f = [None] * 256
+ self.resume_cache = {}
def setup(self, jitcode, greenkey=None):
assert isinstance(jitcode, JitCode)
+ self.resume_cache = {}
self.jitcode = jitcode
self.bytecode = jitcode.code
# this is not None for frames that are recursive portal calls
@@ -1458,6 +1460,31 @@
# but we should not follow calls to that graph
return self.do_residual_call(funcbox, argboxes, calldescr, pc)
+ def emit_resume_data(self, pos):
+ i = 0
+ history = self.metainterp.history
+ for i in range(self.jitcode.num_regs_i()):
+ box = self.registers_i[i]
+ if box is not None and box not in self.resume_cache:
+ history.record(rop.RESUME_PUT,
+ [box, ConstInt(pos), ConstInt(i)], None)
+ self.resume_cache[box] = None
+ start = self.jitcode.num_regs_i()
+ for i in range(self.jitcode.num_regs_r()):
+ box = self.registers_r[i]
+ if box is not None and box not in self.resume_cache:
+ history.record(rop.RESUME_PUT,
+ [box, ConstInt(pos), ConstInt(i + start)], None)
+ self.resume_cache[box] = None
+ start = self.jitcode.num_regs_i() + self.jitcode.num_regs_r()
+ for i in range(self.jitcode.num_regs_f()):
+ box = self.registers_f[i]
+ if box is not None and box not in self.resume_cache:
+ history.record(rop.RESUME_PUT,
+ [box, ConstInt(pos), ConstInt(i + start)], None)
+ self.resume_cache[box] = None
+ history.record(rop.RESUME_SET_PC, [ConstInt(self.pc)], None)
+
# ____________________________________________________________
class MetaInterpStaticData(object):
@@ -1672,6 +1699,12 @@
return self.jitdriver_sd is not None and jitcode is
self.jitdriver_sd.mainjitcode
def newframe(self, jitcode, greenkey=None):
+ if self.framestack:
+ pc = self.framestack[-1].pc
+ else:
+ pc = -1
+ self.history.record(rop.ENTER_FRAME, [ConstInt(pc)], None,
+ descr=jitcode)
if jitcode.is_portal:
self.portal_call_depth += 1
self.call_ids.append(self.current_call_id)
@@ -1688,6 +1721,7 @@
return f
def popframe(self):
+ self.history.record(rop.LEAVE_FRAME, [], None)
frame = self.framestack.pop()
jitcode = frame.jitcode
if jitcode.is_portal:
@@ -1786,15 +1820,21 @@
resumedescr = compile.ResumeGuardNotInvalidated()
else:
resumedescr = compile.ResumeGuardDescr()
+ resumedescr.guard_opnum = opnum # XXX kill me
+ self.sync_resume_data(resumedescr, resumepc)
guard_op = self.history.record(opnum, moreargs, None,
descr=resumedescr)
- #self.capture_resumedata(resumedescr, resumepc)
self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
# count
self.attach_debug_info(guard_op)
return guard_op
-
+
+ def sync_resume_data(self, resumedescr, resumepc):
+ for i, frame in enumerate(self.framestack):
+ frame.emit_resume_data(i)
+
def capture_resumedata(self, resumedescr, resumepc=-1):
+ XXXX
virtualizable_boxes = None
if (self.jitdriver_sd.virtualizable_info is not None or
self.jitdriver_sd.greenfield_info is not None):
@@ -1805,6 +1845,7 @@
saved_pc = frame.pc
if resumepc >= 0:
frame.pc = resumepc
+ xxx
resume.capture_resumedata(self.framestack, virtualizable_boxes,
self.virtualref_boxes, resumedescr)
if self.framestack:
@@ -2490,6 +2531,7 @@
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
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
@@ -80,8 +80,6 @@
def clone(self):
args = self.getarglist()
descr = self.getdescr()
- if descr is not None:
- descr = descr.clone_if_mutable()
op = ResOperation(self.getopnum(), args[:], self.result, descr)
if not we_are_translated():
op.name = self.name
@@ -477,6 +475,7 @@
# frontend
'RESUME_NEW/0d',
'RESUME_SETFIELD_GC/2d',
+ 'RESUME_SET_PC/1',
'_RESUME_LAST', # ----- end of resume only operations ------
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
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
@@ -2,6 +2,7 @@
from rpython.jit.metainterp.resoperation import rop
from rpython.jit.metainterp.history import BoxInt
from rpython.jit.codewriter.jitcode import JitCode
+from rpython.rlib import rstack
class ResumeBytecode(object):
def __init__(self, opcodes, parent=None, parent_position=-1, loop=None):
@@ -41,6 +42,8 @@
elif op.getopnum() == rop.RESUME_SETFIELD_GC:
self.resume_setfield_gc(op.getarg(0), op.getarg(1),
op.getdescr())
+ elif op.getopnum() == rop.RESUME_SET_PC:
+ self.resume_set_pc(op.getarg(0).getint())
elif not op.is_resume():
pos += 1
continue
@@ -50,24 +53,56 @@
def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
jitframe_pos = jitframe_pos_const.getint()
- jitcode = self.metainterp.framestack[frame_no].jitcode
- frame = self.metainterp.framestack[frame_no]
+ jitcode = self.get_jitcode(frame_no)
if frontend_position < jitcode.num_regs_i():
- self.put_box_int(frame, frontend_position, jitframe_pos)
+ 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, frontend_position - 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, frontend_position - jitcode.num_regs_r()
+ 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)
class DirectResumeReader(AbstractResumeReader):
- def __init__(self, *args):
- xxx
+ def __init__(self, binterpbuilder, cpu, deadframe):
+ self.bhinterpbuilder = binterpbuilder
+ self.cpu = cpu
+ 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
+ self.bhinterp_stack.append(self.bhinterpbuilder.acquire_interp())
+ self.bhinterp_stack[-1].setposition(jitcode, 0)
+
+ def put_box_int(self, frame_no, frontend_position, jitframe_pos):
+ val = self.cpu.get_int_value(self.deadframe, jitframe_pos)
+ self.bhinterp_stack[frame_no].registers_i[frontend_position] = val
+
+ def resume_set_pc(self, pc):
+ self.bhinterp_stack[-1].position = pc
+
+ def leave_frame(self):
+ bhinterp = self.bhinterp_stack.pop()
+ self.bhinterpbuilder.release_interp(bhinterp)
+
+ def finish(self):
+ self.bhinterp_stack[0].nextblackholeinterp = None
+ for i in range(1, len(self.bhinterp_stack)):
+ self.bhinterp_stack[i].nextblackholeinterp = self.bhinterp_stack[i
- 1]
+ return self.bhinterp_stack[-1]
class BoxResumeReader(AbstractResumeReader):
def __init__(self, metainterp, deadframe):
@@ -82,14 +117,17 @@
def leave_frame(self):
self.metainterp.popframe()
- def put_box_int(self, frame, position, jitframe_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, position, 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, position, 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)
@@ -99,3 +137,16 @@
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
+def blackhole_from_resumedata(interpbuilder, metainterp_sd, faildescr,
+ deadframe, all_virtuals=None):
+ assert all_virtuals is None
+ #rstack._stack_criticalcode_start()
+ #try:
+ # xxx consume vrefs and random shit
+ #finally:
+ # rstack._stack_criticalcode_stop()
+ cpu = metainterp_sd.cpu
+ last_bhinterp = DirectResumeReader(interpbuilder, cpu,
+ deadframe).rebuild(faildescr)
+
+ return last_bhinterp
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit