[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