Author: fijal Branch: jit-leaner-frontend Changeset: r83214:71d4428daa8d Date: 2016-03-21 14:39 +0200 http://bitbucket.org/pypy/pypy/changeset/71d4428daa8d/
Log: implement deadranges 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 @@ -88,8 +88,16 @@ self.start = start self.pos = start self._count = start + self.start_index = start self.end = end + def get_dead_ranges(self): + return self.trace.get_dead_ranges(self.metainterp_sd) + + def kill_cache_at(self, pos): + if pos: + self._cache[pos] = None + def _get(self, i): res = self._cache[i] assert res is not None @@ -183,6 +191,7 @@ iter = TraceIterator(self.trace, self.start, self.trace._pos, self.inputargs, metainterp_sd=metainterp_sd) iter._count = self.count + iter.start_index = self.count return iter def combine_uint(index1, index2): @@ -210,6 +219,8 @@ self.vref_array = vref_array class Trace(BaseTrace): + _deadranges = (-1, -1) + def __init__(self, inputargs): self._ops = [rffi.cast(rffi.SHORT, -15)] * 30000 self._pos = 0 @@ -403,12 +414,37 @@ index = t.next_element_update_live_range(index, liveranges) return liveranges - def unpack(self): - iter = self.get_iter() + def get_dead_ranges(self, metainterp_sd): + """ Same as get_live_ranges, but returns a list of "dying" indexes, + such as for each index x, the number found there is for sure dead + before x + """ + def insert(ranges, pos, v): + # XXX skiplist + while ranges[pos]: + pos += 1 + if pos == len(ranges): + return + ranges[pos] = v + + if self._deadranges != (-1, -1): + if self._deadranges[0] == self._count: + return self._deadranges[1] + liveranges = self.get_live_ranges(metainterp_sd) + deadranges = [0] * (self._count + 1) + for i in range(self._start, len(liveranges)): + elem = liveranges[i] + if elem: + insert(deadranges, elem + 1, i) + self._deadranges = (self._count, deadranges) + return deadranges + + def unpack(self, metainterp_sd): + iter = self.get_iter(metainterp_sd) ops = [] while not iter.done(): ops.append(iter.next()) - return ops + return iter.inputargs, ops def tag(kind, pos): #if not SMALL_INT_START <= pos < SMALL_INT_STOP: diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -507,6 +507,7 @@ def propagate_all_forward(self, trace, call_pure_results=None, flush=True): self.trace = trace + deadranges = trace.get_dead_ranges() self.call_pure_results = call_pure_results last_op = None i = 0 @@ -517,6 +518,7 @@ last_op = op break self.first_optimization.propagate_forward(op) + trace.kill_cache_at(deadranges[i + trace.start_index]) i += 1 # accumulate counters if flush: 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 @@ -557,9 +557,21 @@ call_pure_results[list(k)] = v return call_pure_results + def pick_cls(self, inp): + if inp.type == 'i': + return history.IntFrontendOp + elif inp.type == 'r': + xxx + else: + assert inp.type == 'f' + xxx + def convert_loop_to_packed(self, loop, skip_last=False): + XXX # rewrite from rpython.jit.metainterp.opencoder import Trace - trace = Trace(loop.inputargs) + inputargs = [self.pick_cls(inparg)(i) for i, inparg in + enumerate(loop.inputargs)] + trace = Trace(inputargs) ops = loop.operations if skip_last: ops = ops[:-1] @@ -635,7 +647,7 @@ def convert_old_style_to_targets(loop, jump): newloop = TreeLoop(loop.name) newloop.inputargs = loop.inputargs - newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, -1, descr=FakeDescr())] + \ + newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, descr=FakeDescr())] + \ loop.operations if not jump: assert newloop.operations[-1].getopnum() == rop.JUMP 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 @@ -195,3 +195,19 @@ 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] + + def test_deadranges(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) + i3 = FakeOp(t.record_op(rop.INT_ADD, [i1, ConstInt(1)])) + i4 = FakeOp(t.record_op(rop.INT_ADD, [i3, ConstInt(1)])) + t.record_op(rop.ESCAPE_N, [ConstInt(3)]) + t.record_op(rop.ESCAPE_N, [ConstInt(3)]) + t.record_op(rop.ESCAPE_N, [ConstInt(3)]) + t.record_op(rop.ESCAPE_N, [ConstInt(3)]) + t.record_op(rop.ESCAPE_N, [ConstInt(3)]) + t.record_op(rop.FINISH, [i4]) + assert t.get_dead_ranges(metainterp_sd) == [0, 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 6] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit