[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