Author: fijal Branch: jit-leaner-frontend Changeset: r82962:5008701233ab Date: 2016-03-11 13:57 +0200 http://bitbucket.org/pypy/pypy/changeset/5008701233ab/
Log: an attempt to compress list of consts diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py --- a/rpython/jit/metainterp/history.py +++ b/rpython/jit/metainterp/history.py @@ -205,7 +205,7 @@ class Const(AbstractValue): - __slots__ = () + __attrs__ = () @staticmethod def _new(x): 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 @@ -7,14 +7,14 @@ <virtualref size> <virtualref boxes> [<size> <jitcode> <pc> <boxes...> ...] """ -from rpython.jit.metainterp.history import ConstInt, Const +from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, ConstPtr from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\ ResOperation, oparity, rop, opwithdescr, GuardResOp from rpython.rlib.rarithmetic import intmask from rpython.rlib.objectmodel import we_are_translated -from rpython.rtyper.lltypesystem import rffi, lltype +from rpython.rtyper.lltypesystem import rffi, lltype, llmemory -TAGINT, TAGCONST, TAGBOX = range(3) +TAGINT, TAGCONSTPTR, TAGCONSTOTHER, TAGBOX = range(4) TAGMASK = 0x3 TAGSHIFT = 2 SMALL_INT_STOP = 2 ** (15 - TAGSHIFT) @@ -116,8 +116,13 @@ return self._get(v) elif tag == TAGINT: return ConstInt(v) - elif tag == TAGCONST: - return self.trace._consts[v] + elif tag == TAGCONSTPTR: + return ConstPtr(self.trace._refs[v]) + elif tag == TAGCONSTOTHER: + if v & 1: + return ConstFloat(self.trace._floats[v >> 1]) + else: + return ConstInt(self.trace._bigints[v >> 1]) else: assert False @@ -173,7 +178,12 @@ self._ops = [rffi.cast(rffi.SHORT, -15)] * 30000 self._pos = 0 self._descrs = [None] - self._consts = [None] + self._refs = [] + self._refs_dict = {} + self._bigints = [] + self._bigints_dict = {} + self._floats = [] + self._floats_dict = {} for i, inparg in enumerate(inputargs): assert isinstance(inparg, AbstractInputArg) inparg.position = -i - 1 @@ -188,6 +198,11 @@ self._ops[self._pos] = rffi.cast(rffi.SHORT, v) self._pos += 1 + def done(self): + self._bigints_dict = {} + self._refs_dict = {} + self._floats_dict = {} + def length(self): return self._pos @@ -207,9 +222,34 @@ isinstance(box.getint(), int) and # symbolics SMALL_INT_START <= box.getint() < SMALL_INT_STOP): return tag(TAGINT, box.getint()) + elif isinstance(box, ConstInt): + if not isinstance(box.getint(), int): + # symbolics, for tests, don't worry about caching + v = len(self._bigints) << 1 + self._bigints.append(box.getint()) + else: + v = self._bigints_dict.get(box.getint(), -1) + if v == -1: + v = len(self._bigints) << 1 + self._bigints_dict[box.getint()] = v + self._bigints.append(box.getint()) + return tag(TAGCONSTOTHER, v) + elif isinstance(box, ConstFloat): + v = self._floats_dict.get(box.getfloat(), -1) + if v == -1: + v = (len(self._floats) << 1) | 1 + self._floats_dict[box.getfloat()] = v + self._floats.append(box.getfloat()) + return tag(TAGCONSTOTHER, v) else: - self._consts.append(box) - return tag(TAGCONST, len(self._consts) - 1) + assert isinstance(box, ConstPtr) + addr = llmemory.cast_ptr_to_adr(box.getref_base()) + v = self._refs_dict.get(addr, -1) + if v == -1: + v = len(self._refs) + self._refs_dict[addr] = v + self._refs.append(box.getref_base()) + return tag(TAGCONSTPTR, v) elif isinstance(box, AbstractResOp): return tag(TAGBOX, box.get_position()) elif isinstance(box, AbstractInputArg): 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 @@ -2566,6 +2566,7 @@ try_disabling_unroll=False, exported_state=None): num_green_args = self.jitdriver_sd.num_green_args greenkey = original_boxes[:num_green_args] + self.history.trace.done() if not self.partial_trace: ptoken = self.get_procedure_token(greenkey) if ptoken is not None and ptoken.target_tokens is not None: @@ -2618,6 +2619,7 @@ self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None, descr=target_jitcell_token) self.history.ends_with_jump = True + self.history.trace.done() try: target_token = compile.compile_trace(self, self.resumekey, live_arg_boxes[num_green_args:]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit