Author: fijal Branch: jit-leaner-frontend Changeset: r82660:0077f0c7f4ec Date: 2016-03-02 16:33 +0100 http://bitbucket.org/pypy/pypy/changeset/0077f0c7f4ec/
Log: progress, pass the first snapshot test diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py --- a/rpython/jit/metainterp/opencoder.py +++ b/rpython/jit/metainterp/opencoder.py @@ -5,12 +5,16 @@ ResOperation, oparity, opname, rop, ResOperation, opwithdescr from rpython.rlib.rarithmetic import intmask from rpython.jit.metainterp import resume +from rpython.rlib.objectmodel import we_are_translated TAGINT, TAGCONST, TAGBOX = range(3) TAGMASK = 0x3 TAGSHIFT = 2 MAXINT = 65536 +class Sentinel(object): + pass + class TraceIterator(object): def __init__(self, trace, end): self.trace = trace @@ -47,18 +51,10 @@ else: yyyy - def read_resume(self, op): - jc_index = self._next() - pc = self._next() - f = resume.FrameInfo(None, jc_index, pc) - op.rd_frame_info_list = f - lgt = self._next() - box_list = [] - for i in range(lgt): - box = self._get(self._next()) - assert box - box_list.append(box) - op.rd_snapshot = resume.TopSnapshot(resume.Snapshot(None, box_list), [], []) + def skip_resume_data(self): + pos = self.pos + self.pos = self._next() + return pos def next(self): opnum = self._next() @@ -79,7 +75,7 @@ descr = None res = ResOperation(opnum, args, -1, descr=descr) if rop.is_guard(opnum): - self.read_resume(res) + res.rd_snapshot_position = self.skip_resume_data() self._cache[self._count] = res self._count += 1 return res @@ -145,6 +141,9 @@ index = op._pos self._ops[index] = -newtag - 1 + def record_snapshot_link(self, pos): + self._ops.append(-pos - 1) + def record_op(self, opnum, argboxes, descr=None): # return an ResOperation instance, ideally die in hell pos = self._record_op(opnum, argboxes, descr) @@ -154,12 +153,29 @@ return tag(TAGBOX, self._record_raw(opnum, tagged_args, descr)) def record_snapshot(self, jitcode, pc, active_boxes): + pos = len(self._ops) + self._ops.append(len(active_boxes)) # unnecessary, can be read from self._ops.append(jitcode.index) self._ops.append(pc) - self._ops.append(len(active_boxes)) # unnecessary, can be read from - # jitcode for box in active_boxes: self._ops.append(box.position) # not tagged, as it must be boxes + return pos + + def get_patchable_position(self): + p = len(self._ops) + if not we_are_translated(): + self._ops.append(Sentinel()) + else: + self._ops.append(-1) + return p + + def patch_position_to_current(self, p): + prev = self._ops[p] + if we_are_translated(): + assert prev == -1 + else: + assert isinstance(prev, Sentinel) + self._ops[p] = len(self._ops) def get_iter(self): return TraceIterator(self, len(self._ops)) 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 @@ -502,13 +502,10 @@ return self.oparse.parse() def postprocess(self, op): - class FakeJitCode(object): - index = 0 - if OpHelpers.is_guard(op.getopnum()): - op.rd_snapshot = resume.TopSnapshot(None, + op.rd_snapshot = resume.TopSnapshot( resume.Snapshot(None, op.getfailargs()), [], []) - op.rd_frame_info_list = resume.FrameInfo(None, FakeJitCode(), 11) + op.rd_frame_info_list = resume.FrameInfo(None, 0, 11) def add_guard_future_condition(self, res): # invent a GUARD_FUTURE_CONDITION to not have to change all tests 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 @@ -70,8 +70,7 @@ self.copy_constants(self.registers_f, jitcode.constants_f, ConstFloat) self._result_argcode = 'v' # for resume.py operation - self.parent_resumedata_snapshot = None - self.parent_resumedata_frame_info_list = None + self.parent_resumedata_position = -1 # counter for unrolling inlined loops self.unroll_iterations = 1 @@ -2061,7 +2060,8 @@ else: guard_op = self.history.record(opnum, moreargs, None) assert isinstance(guard_op, GuardResOp) - self.capture_resumedata(resumepc) # <- records extra to history + self.capture_resumedata(resumepc) + # ^^^ records extra to history self.staticdata.profiler.count_ops(opnum, Counters.GUARDS) # count self.attach_debug_info(guard_op) diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py --- a/rpython/jit/metainterp/resume.py +++ b/rpython/jit/metainterp/resume.py @@ -112,23 +112,20 @@ self.variable, self.location) -def _ensure_parent_resumedata(framestack, n): - target = framestack[n] +def _ensure_parent_resumedata(framestack, n, t): if n == 0: return + target = framestack[n] back = framestack[n - 1] - if target.parent_resumedata_frame_info_list is not None: - _, pc = unpack_uint(target.parent_resumedata_frame_info_list.packed_jitcode_pc) - assert pc == back.pc + if target.parent_resumedata_position != -1: + t.check_snapshot_jitcode_pc(back.jitcode, back.pc, + target.parent_resumedata_position) + t.record_snapshot_link(target.parent_resumedata_position) return - _ensure_parent_resumedata(framestack, n - 1) - target.parent_resumedata_frame_info_list = FrameInfo( - back.parent_resumedata_frame_info_list, - back.jitcode, - back.pc) - target.parent_resumedata_snapshot = Snapshot( - back.parent_resumedata_snapshot, - back.get_list_of_active_boxes(True)) + pos = t.record_snapshot(back.jitcode, back.pc, + back.get_list_of_active_boxes(True)) + _ensure_parent_resumedata(framestack, n - 1, t) + target.parent_resumedata_position = pos def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes, t): n = len(framestack) - 1 @@ -140,16 +137,11 @@ virtualref_boxes = virtualref_boxes[:] if n >= 0: top = framestack[n] + pos = t.get_patchable_position() t.record_snapshot(top.jitcode, top.pc, top.get_list_of_active_boxes(False)) - #_ensure_parent_resumedata(framestack, n) - #frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list, - # top.jitcode, top.pc) - #snapshot_storage.rd_frame_info_list = frame_info_list - #snapshot = Snapshot(top.parent_resumedata_snapshot, - # top.get_list_of_active_boxes(False)) - #snapshot = TopSnapshot(snapshot, virtualref_boxes, virtualizable_boxes) - #snapshot_storage.rd_snapshot = snapshot + _ensure_parent_resumedata(framestack, n, t) + t.patch_position_to_current(pos) else: yyy snapshot_storage.rd_frame_info_list = None diff --git a/rpython/jit/metainterp/test/test_opencoder.py b/rpython/jit/metainterp/test/test_opencoder.py --- a/rpython/jit/metainterp/test/test_opencoder.py +++ b/rpython/jit/metainterp/test/test_opencoder.py @@ -11,14 +11,14 @@ l = [] while not iter.done(): l.append(iter.next()) - return iter.inputargs, l + return iter.inputargs, l, iter def test_simple_iterator(self): i0, i1 = InputArgInt(), InputArgInt() t = Trace([i0, i1]) add = t.record_op(rop.INT_ADD, [i0, i1]) t.record_op(rop.INT_ADD, [add, ConstInt(1)]) - (i0, i1), l = self.unpack(t) + (i0, i1), l, _ = self.unpack(t) assert len(l) == 2 assert l[0].opnum == rop.INT_ADD assert l[1].opnum == rop.INT_ADD @@ -27,14 +27,26 @@ assert l[0].getarg(0) is i0 assert l[0].getarg(1) is i1 + def unpack_snapshot(self, t, pos): + trace = t.trace + first = trace._ops[pos] # this is the size + pos += 1 + boxes = [] + while first > pos + 1: + snapshot_size = trace._ops[pos] + # 2 for jitcode and pc + pos += 1 + 2 + boxes += [t._get(trace._ops[i + pos]) for i in range(snapshot_size)] + pos += len(boxes) + return boxes + def test_rd_snapshot(self): class JitCode(object): def __init__(self, index): self.index = index class FakeFrame(object): - parent_resumedata_frame_info_list = None - parent_resumedata_snapshot = None + parent_resumedata_position = -1 def __init__(self, pc, jitcode, boxes): self.pc = pc @@ -49,11 +61,20 @@ add = t.record_op(rop.INT_ADD, [i0, i1]) t.record_op(rop.GUARD_FALSE, [add]) # now we write rd_snapshot and friends - virtualizable_boxes = None - virutalref_boxes = [] - framestack = [FakeFrame(1, JitCode(2), [i0, i1])] - resume.capture_resumedata(framestack, virtualizable_boxes, - virutalref_boxes, t) - (i0, i1), l = self.unpack(t) + frame0 = FakeFrame(1, JitCode(2), [i0, i1]) + frame1 = FakeFrame(3, JitCode(4), [i0, i0, add]) + framestack = [frame0] + resume.capture_resumedata(framestack, None, [], t) + (i0, i1), l, iter = self.unpack(t) assert l[1].opnum == rop.GUARD_FALSE - assert l[1].rd_snapshot.prev.boxes == [i0, i1] + boxes = self.unpack_snapshot(iter, l[1].rd_snapshot_position) + assert boxes == [i0, i1] + t.record_op(rop.GUARD_FALSE, [add]) + resume.capture_resumedata([frame0, frame1], None, [], t) + (i0, i1), l, iter = self.unpack(t) + assert l[1].opnum == rop.GUARD_FALSE + boxes = self.unpack_snapshot(iter, l[1].rd_snapshot_position) + assert boxes == [i0, i1] + assert l[2].opnum == rop.GUARD_FALSE + boxes = self.unpack_snapshot(iter, l[2].rd_snapshot_position) + assert boxes == [i0, i0, l[0], i0, i1] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit