Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult Changeset: r76360:719110b9c792 Date: 2015-03-13 09:47 +0200 http://bitbucket.org/pypy/pypy/changeset/719110b9c792/
Log: implement heapcache on consts diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -202,6 +202,8 @@ def setup(self): self.optimizer.optheap = self + # mapping const value -> info corresponding to it's heap cache + self.const_infos = self.optimizer.cpu.ts.new_ref_dict() def force_at_end_of_preamble(self): self.cached_dict_reads.clear() @@ -483,7 +485,7 @@ def optimize_GETFIELD_GC_I(self, op): opinfo = self.ensure_ptr_info_arg0(op) - fld = opinfo.getfield(op.getdescr()) + fld = opinfo.getfield(op.getdescr(), self) if fld is not None: self.make_equal_to(op, fld) return diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py --- a/rpython/jit/metainterp/optimizeopt/info.py +++ b/rpython/jit/metainterp/optimizeopt/info.py @@ -93,7 +93,7 @@ optheap.register_dirty_field(descr, self) self._fields[descr.index] = op - def getfield(self, descr): + def getfield(self, descr, optheap=None): return self._fields[descr.index] def _force_elements(self, op, optforce): @@ -213,6 +213,23 @@ def __init__(self, const): self._const = const + def _get_info(self, descr, optheap): + ref = self._const.getref_base() + info = optheap.const_infos.get(ref, None) + if info is None: + info = StructPtrInfo() + info.init_fields(descr.parent_descr) + optheap.const_infos[ref] = info + return info + + def getfield(self, descr, optheap=None): + info = self._get_info(descr, optheap) + return info.getfield(descr) + + def setfield(self, descr, op, optheap): + info = self._get_info(descr, optheap) + info.setfield(descr, op, optheap) + def is_null(self): return not bool(self._const.getref_base()) 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 @@ -588,22 +588,13 @@ if is_object: opinfo = info.InstancePtrInfo() else: - xxx + opinfo = info.StructPtrInfo() opinfo.init_fields(op.getdescr().parent_descr) else: yyy arg0.set_forwarded(opinfo) return opinfo - def make_ptr_info(self, op, mode): - op = self.get_box_replacement(op) - if op.is_constant(): - return info.ConstPtrInfo(op) - opinfo = op.get_forwarded() - if isinstance(opinfo, info.AbstractVirtualPtrInfo): - return opinfo - xxx - def new_const(self, fieldofs): if fieldofs.is_pointer_field(): return self.cpu.ts.CONST_NULL diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py --- a/rpython/jit/metainterp/resume.py +++ b/rpython/jit/metainterp/resume.py @@ -221,8 +221,7 @@ tagged = liveboxes[box] else: if box.type == 'r': - xxx - info = optimizer.getinfo(box, create=False) + info = optimizer.getptrinfo(box) is_virtual = (info is not None and info.is_virtual()) else: is_virtual = False _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit