[pypy-commit] pypy optresult: implement heapcache on consts
fijal
noreply at buildbot.pypy.org
Fri Mar 13 08:47:57 CET 2015
Author: Maciej Fijalkowski <fijall at 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
More information about the pypy-commit
mailing list