[pypy-commit] pypy optresult: a test and a fix

fijal noreply at buildbot.pypy.org
Fri Jun 5 09:36:07 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77879:8b21abbf1e11
Date: 2015-06-05 09:32 +0200
http://bitbucket.org/pypy/pypy/changeset/8b21abbf1e11/

Log:	a test and a fix

diff --git a/rpython/jit/metainterp/optimizeopt/TODO b/rpython/jit/metainterp/optimizeopt/TODO
--- a/rpython/jit/metainterp/optimizeopt/TODO
+++ b/rpython/jit/metainterp/optimizeopt/TODO
@@ -1,4 +1,5 @@
 * certain cases where VirtualArray or VirtualStructArray is forced (but
   heap.py is not notified about fields being dirty)
-* arraylen_gc is not handling length bound optimization at all
-* mark_opaque_pointer is ignored
+* arraylen_gc is not handling length bound optimization at all (we need to
+  wait till unrolling for tests)
+* mark_opaque_pointer is ignored (which is fine until unrolling)
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
@@ -223,10 +223,16 @@
     def register_dirty_field(self, descr, info):
         self.field_cache(descr).register_dirty_field(info)
 
+    def register_dirty_array_field(self, arraydescr, index, info):
+        self.arrayitem_cache(arraydescr, index).register_dirty_field(info)
+
     def clean_caches(self):
         del self._lazy_setfields_and_arrayitems[:]
         for descr, cf in self.cached_fields.items():
             cf.invalidate(descr)
+        for submap in self.cached_arrayitems.itervalues():
+            for index, cf in submap.iteritems():
+                cf.invalidate(None)
         self.cached_arrayitems.clear()
         self.cached_dict_reads.clear()
 
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
@@ -225,11 +225,7 @@
     def visitor_walk_recursive(self, op, visitor, optimizer):
         itemboxes = self.buffer.values
         visitor.register_virtual_fields(op, itemboxes)
-        #for itembox in itemboxes:
-        #    xxx
-        #    itemvalue = self.get_item_value(i)
-        #    if itemvalue is not None:
-        #        itemvalue.visitor_walk_recursive(visitor)
+        # there can be no virtuals stored in raw buffer
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -306,7 +302,9 @@
                                      [op, ConstInt(i), subbox],
                                       descr=arraydescr)
                 optforce._emit_operation(setop)
-                # xxxx optforce.optheap
+                if optforce.optheap is not None:
+                    optforce.optheap.register_dirty_array_field(
+                        arraydescr, i, self)
 
     def setitem(self, index, op, cf=None, optheap=None):
         if self._items is None:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5559,6 +5559,17 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_dirty_array_field_after_force(self):
+        ops = """
+        []
+        p0 = new_array(1, descr=arraydescr)
+        setarrayitem_gc(p0, 0, 0, descr=arraydescr)
+        escape_n(p0) # force
+        call_may_force_n(1, descr=mayforcevirtdescr)
+        i1 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
+        finish(i1)
+        """
+        self.optimize_loop(ops, ops)
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list