[pypy-commit] pypy default: Merged in sbauman/pypy (pull request #338)

cfbolz noreply at buildbot.pypy.org
Wed Oct 7 18:17:56 CEST 2015


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: 
Changeset: r80025:be4b389d856e
Date: 2015-10-07 18:18 +0200
http://bitbucket.org/pypy/pypy/changeset/be4b389d856e/

Log:	Merged in sbauman/pypy (pull request #338)

	Factor in field immutability when invalidating heap information

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
@@ -414,6 +414,8 @@
         for arraydescr in effectinfo.readonly_descrs_arrays:
             self.force_lazy_setarrayitem(arraydescr)
         for fielddescr in effectinfo.write_descrs_fields:
+            if fielddescr.is_always_pure():
+                continue
             try:
                 del self.cached_dict_reads[fielddescr]
             except KeyError:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -3520,6 +3520,27 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_residual_call_does_not_invalidate_immutable_caches(self):
+        ops = """
+        [p1]
+        i1 = getfield_gc_pure_i(p1, descr=valuedescr3)
+        i2 = call_i(i1, descr=writevalue3descr)
+        i3 = getfield_gc_pure_i(p1, descr=valuedescr3)
+        jump(p1)
+        """
+        expected_preamble = """
+        [p1]
+        i1 = getfield_gc_pure_i(p1, descr=valuedescr3)
+        i2 = call_i(i1, descr=writevalue3descr)
+        jump(p1, i1)
+        """
+        expected = """
+        [p1, i1]
+        i2 = call_i(i1, descr=writevalue3descr)
+        jump(p1, i1)
+        """
+        self.optimize_loop(ops, expected, expected_preamble=expected_preamble)
+
     def test_residual_call_invalidate_some_caches(self):
         ops = """
         [p1, p2]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -280,6 +280,8 @@
     writearraydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                   EffectInfo([], [], [], [adescr], [arraydescr],
                                              []))
+    writevalue3descr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
+                                       EffectInfo([], [], [], [valuedescr3], [], []))
     readadescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                  EffectInfo([adescr], [], [], [], [], []))
     mayforcevirtdescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,


More information about the pypy-commit mailing list