Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r79968:dfaa5710b535 Date: 2015-10-04 11:38 +0200 http://bitbucket.org/pypy/pypy/changeset/dfaa5710b535/
Log: Memory saving on 'rd_locs', which turns out to be often exactly equal to the previously generated rd_locs diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py --- a/rpython/jit/backend/llsupport/assembler.py +++ b/rpython/jit/backend/llsupport/assembler.py @@ -173,6 +173,8 @@ input_i += 1 return locs + _previous_rd_locs = [] + def store_info_on_descr(self, startspos, guardtok): withfloats = False for box in guardtok.failargs: @@ -184,7 +186,17 @@ fail_descr = cast_instance_to_gcref(guardtok.faildescr) fail_descr = rffi.cast(lltype.Signed, fail_descr) base_ofs = self.cpu.get_baseofs_of_frame_field() - positions = [rffi.cast(rffi.USHORT, 0)] * len(guardtok.fail_locs) + # + # in practice, about 2/3rd of 'positions' lists that we build are + # exactly the same as the previous one, so share the lists to + # conserve memory + if len(self._previous_rd_locs) == len(guardtok.fail_locs): + positions = self._previous_rd_locs # tentatively + shared = True + else: + positions = [rffi.cast(rffi.USHORT, 0)] * len(guardtok.fail_locs) + shared = False + # for i, loc in enumerate(guardtok.fail_locs): if loc is None: position = 0xFFFF @@ -203,7 +215,15 @@ position = len(self.cpu.gen_regs) + loc.value * coeff else: position = self.cpu.all_reg_indexes[loc.value] + + if shared: + if (rffi.cast(lltype.Signed, self._previous_rd_locs[i]) == + rffi.cast(lltype.Signed, position)): + continue # still equal + positions = positions[:] + shared = False positions[i] = rffi.cast(rffi.USHORT, position) + self._previous_rd_locs = positions # write down the positions of locs guardtok.faildescr.rd_locs = positions return fail_descr, target _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit