Author: fijal Branch: jit-leaner-frontend Changeset: r83186:46a2efc05eb0 Date: 2016-03-20 11:49 +0200 http://bitbucket.org/pypy/pypy/changeset/46a2efc05eb0/
Log: start working on live ranges 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 @@ -9,7 +9,8 @@ from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, ConstPtr from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\ - ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp + ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp,\ + opclasses from rpython.rlib.rarithmetic import intmask, r_uint from rpython.rlib.objectmodel import we_are_translated from rpython.rtyper.lltypesystem import rffi, lltype, llmemory @@ -47,6 +48,20 @@ def get(self, index): return self.main_iter._untag(index) + def _update_liverange(self, item, index, liveranges): + tag, v = untag(item) + if tag == TAGBOX: + liveranges[v] = index + + def update_liveranges(self, index, liveranges): + for item in self.vable_array: + self._update_liverange(item, index, liveranges) + for item in self.vref_array: + self._update_liverange(item, index, liveranges) + for frame in self.framestack: + for item in frame.box_array: + self._update_liverange(item, index, liveranges) + def unpack_jitcode_pc(self, snapshot): return unpack_uint(snapshot.packed_jitcode_pc) @@ -107,6 +122,26 @@ def get_snapshot_iter(self, index): return SnapshotIterator(self, self.trace._snapshots[index]) + def next_element_update_live_range(self, index, liveranges): + opnum = self._next() + if oparity[opnum] == -1: + argnum = self._next() + else: + argnum = oparity[opnum] + for i in range(argnum): + tagged = self._next() + tag, v = untag(tagged) + if tag == TAGBOX: + liveranges[v] = index + if opclasses[opnum].type != 'v': + liveranges[index] = index + if opwithdescr[opnum]: + descr_index = self._next() + if rop.is_guard(opnum): + self.get_snapshot_iter(descr_index).update_liveranges( + index, liveranges) + return index + 1 + def next(self): opnum = self._next() if oparity[opnum] == -1: @@ -132,7 +167,8 @@ if rop.is_guard(opnum): assert isinstance(res, GuardResOp) res.rd_resume_position = descr_index - self._cache[self._count] = res + if res.type != 'v': + self._cache[self._count] = res self._count += 1 return res @@ -359,6 +395,14 @@ assert metainterp_sd return TraceIterator(self, self._start, self._pos, metainterp_sd=metainterp_sd) + def get_live_ranges(self, metainterp_sd): + t = self.get_iter(metainterp_sd) + liveranges = [0] * self._count + index = t._count + while not t.done(): + index = t.next_element_update_live_range(index, liveranges) + return liveranges + def unpack(self): iter = self.get_iter() ops = [] 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 @@ -13,6 +13,9 @@ def __init__(self, index): self.index = index +class SomeDescr(AbstractDescr): + pass + class metainterp_sd(object): pass @@ -175,9 +178,6 @@ assert l[0].getarglist() == [i0, i1] def test_virtualizable_virtualref(self): - class SomeDescr(AbstractDescr): - pass - i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0) t = Trace([i0, i1, i2]) p0 = FakeOp(t.record_op(rop.NEW_WITH_VTABLE, [], descr=SomeDescr())) @@ -186,4 +186,12 @@ (i0, i1, i2), l, iter = self.unpack(t) assert not l[1].framestack assert l[1].virtualizables == [l[0], i1, i2] - assert l[1].vref_boxes == [l[0], i1] \ No newline at end of file + assert l[1].vref_boxes == [l[0], i1] + + def test_liveranges(self): + i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0) + t = Trace([i0, i1, i2]) + p0 = FakeOp(t.record_op(rop.NEW_WITH_VTABLE, [], descr=SomeDescr())) + t.record_op(rop.GUARD_TRUE, [i0]) + resume.capture_resumedata([], [i1, i2, p0], [p0, i1], t) + assert t.get_live_ranges(metainterp_sd) == [4, 4, 4, 4, 0] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit