[pypy-commit] pypy default: merge arrays-force-less
cfbolz
pypy.commits at gmail.com
Wed Aug 2 10:51:20 EDT 2017
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch:
Changeset: r92037:a22d0969f40a
Date: 2017-08-02 16:50 +0200
http://bitbucket.org/pypy/pypy/changeset/a22d0969f40a/
Log: merge arrays-force-less
don't throw away all of the knowledge about an array when forcing a
lazy setarrayitem. instead, only throw away the cache of the
specific index.
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -55,3 +55,8 @@
Fix the bounds in the GC when allocating a lot of objects with finalizers,
fixes issue #2590
+
+.. branch: arrays-force-less
+
+Small improvement to optimize list accesses with constant indexes better by
+throwing away information about them less eagerly.
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,7 +223,10 @@
def invalidate(self, descr):
for opinfo in self.cached_infos:
assert isinstance(opinfo, info.ArrayPtrInfo)
- opinfo._items = None
+ # only invalidate those at self.index
+ if self.index < len(opinfo._items):
+ opinfo._items[self.index] = None
+ #opinfo._items = None #[self.index] = None
self.cached_infos = []
self.cached_structs = []
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
@@ -1537,6 +1537,46 @@
"""
self.optimize_loop(ops, expected)
+ def test_duplicate_getarrayitem_after_setarrayitem_and_guard(self):
+ ops = """
+ [p0, p1, p2, p3, i1]
+ p4 = getarrayitem_gc_r(p0, 0, descr=arraydescr2)
+ p5 = getarrayitem_gc_r(p0, 1, descr=arraydescr2)
+ p6 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+ setarrayitem_gc(p1, 1, p3, descr=arraydescr2)
+ guard_true(i1) [i1]
+ p7 = getarrayitem_gc_r(p0, 0, descr=arraydescr2)
+ p8 = getarrayitem_gc_r(p0, 1, descr=arraydescr2)
+ p9 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+ p10 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
+ escape_n(p4)
+ escape_n(p5)
+ escape_n(p6)
+ escape_n(p7)
+ escape_n(p8)
+ escape_n(p9)
+ escape_n(p10)
+ jump(p0, p1, p2, p3, i1)
+ """
+ expected = """
+ [p0, p1, p2, p3, i1]
+ p4 = getarrayitem_gc_r(p0, 0, descr=arraydescr2)
+ p5 = getarrayitem_gc_r(p0, 1, descr=arraydescr2)
+ p6 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+ setarrayitem_gc(p1, 1, p3, descr=arraydescr2)
+ guard_true(i1) [i1]
+ p8 = getarrayitem_gc_r(p0, 1, descr=arraydescr2)
+ escape_n(p4)
+ escape_n(p5)
+ escape_n(p6)
+ escape_n(p4)
+ escape_n(p8)
+ escape_n(p6)
+ escape_n(p3)
+ jump(p0, p1, p2, p3, 1)
+ """
+ self.optimize_loop(ops, expected)
+
def test_getarrayitem_pure_does_not_invalidate(self):
ops = """
[p1, p2]
More information about the pypy-commit
mailing list