Author: fijal Branch: jit-leaner-frontend Changeset: r83332:e625c46190c9 Date: 2016-03-25 11:23 +0200 http://bitbucket.org/pypy/pypy/changeset/e625c46190c9/
Log: try to shorten the ranges and numbers 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 @@ -76,7 +76,7 @@ metainterp_sd=None): self.trace = trace self.metainterp_sd = metainterp_sd - self._cache = [None] * trace._count + self._cache = [None] * trace._index if force_inputargs is not None: # the trace here is cut and we're working from # inputargs that are in the middle, shuffle stuff around a bit @@ -92,6 +92,7 @@ self.start = start self.pos = start self._count = start + self._index = start self.start_index = start self.end = end @@ -152,7 +153,9 @@ if rop.is_guard(opnum): self.get_snapshot_iter(descr_index).update_liveranges( index, liveranges) - return index + 1 + if opclasses[opnum].type != 'v': + return index + 1 + return index def next(self): opnum = self._next() @@ -180,16 +183,18 @@ assert isinstance(res, GuardResOp) res.rd_resume_position = descr_index if res.type != 'v': - self._cache[self._count] = res + self._cache[self._index] = res + self._index += 1 self._count += 1 return res class CutTrace(BaseTrace): - def __init__(self, trace, start, count, inputargs): + def __init__(self, trace, start, count, index, inputargs): self.trace = trace self.start = start self.inputargs = inputargs self.count = count + self.index = index def cut_at(self, cut): assert cut[1] > self.count @@ -199,7 +204,8 @@ iter = TraceIterator(self.trace, self.start, self.trace._pos, self.inputargs, metainterp_sd=metainterp_sd) iter._count = self.count - iter.start_index = self.count + iter.start_index = self.index + iter._index = self.index return iter def combine_uint(index1, index2): @@ -246,7 +252,8 @@ self._snapshots = [] for i, inparg in enumerate(inputargs): inparg.set_position(i) - self._count = len(inputargs) + self._count = len(inputargs) # total count + self._index = len(inputargs) # "position" of resulting resops self._start = len(inputargs) self._pos = self._start self.inputargs = inputargs @@ -281,14 +288,15 @@ return self._pos def cut_point(self): - return self._pos, self._count + return self._pos, self._count, self._index def cut_at(self, end): self._pos = end[0] self._count = end[1] + self._index = end[2] - def cut_trace_from(self, (start, count), inputargs): - return CutTrace(self, start, count, inputargs) + def cut_trace_from(self, (start, count, index), inputargs): + return CutTrace(self, start, count, index, inputargs) def _encode(self, box): if isinstance(box, Const): @@ -334,7 +342,7 @@ assert False, "unreachable code" def record_op(self, opnum, argboxes, descr=None): - pos = self._count + pos = self._index self.append(opnum) expected_arity = oparity[opnum] if expected_arity == -1: @@ -351,6 +359,8 @@ else: self.append(self._encode_descr(descr)) self._count += 1 + if opclasses[opnum].type != 'v': + self._index += 1 return pos def _encode_descr(self, descr): @@ -404,7 +414,7 @@ def get_live_ranges(self, metainterp_sd): t = self.get_iter(metainterp_sd) - liveranges = [0] * self._count + liveranges = [0] * self._index index = t._count while not t.done(): index = t.next_element_update_live_range(index, liveranges) @@ -427,7 +437,8 @@ if self._deadranges[0] == self._count: return self._deadranges[1] liveranges = self.get_live_ranges(metainterp_sd) - deadranges = [0] * (self._count + 1) + deadranges = [0] * (self._index + 2) + assert len(deadranges) == len(liveranges) + 2 for i in range(self._start, len(liveranges)): elem = liveranges[i] if elem: 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 @@ -520,7 +520,8 @@ break self.first_optimization.propagate_forward(op) trace.kill_cache_at(deadranges[i + trace.start_index]) - i += 1 + if op.type != 'v': + i += 1 # accumulate counters if flush: self.flush() 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 @@ -187,7 +187,7 @@ 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] + assert t.get_live_ranges(metainterp_sd) == [4, 4, 4, 4] def test_deadranges(self): i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0) @@ -203,4 +203,4 @@ 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] + assert t.get_dead_ranges(metainterp_sd) == [0, 0, 0, 0, 0, 3, 4, 5] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit