Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r96764:4570c3e9b030
Date: 2019-06-06 16:47 +0200
http://bitbucket.org/pypy/pypy/changeset/4570c3e9b030/

Log:    Issue #3014

        The gc_load family of operations must force the lazy setfields and
        setarrayitems to occur first

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
@@ -629,6 +629,20 @@
             # and then emit the operation
             return self.emit(op)
 
+    def optimize_GC_LOAD_I(self, op):
+        # seeing a 'gc_load*' forces all the lazy sets that are still
+        # pending, as an approximation.  We could try to be really clever
+        # and only force some of them, but we don't have any descr here.
+        self.force_all_lazy_sets()
+        self.make_nonnull(op.getarg(0))
+        return self.emit(op)
+    optimize_GC_LOAD_R = optimize_GC_LOAD_I
+    optimize_GC_LOAD_F = optimize_GC_LOAD_I
+
+    optimize_GC_LOAD_INDEXED_I = optimize_GC_LOAD_I
+    optimize_GC_LOAD_R = optimize_GC_LOAD_INDEXED_I
+    optimize_GC_LOAD_F = optimize_GC_LOAD_INDEXED_I
+
     def optimize_QUASIIMMUT_FIELD(self, op):
         # Pattern: QUASIIMMUT_FIELD(s, descr=QuasiImmutDescr)
         #          x = GETFIELD_GC(s, descr='inst_x') # pure
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
@@ -9495,3 +9495,40 @@
         jump(i3, i2, i3)
         """
         self.optimize_loop(ops, expected)
+
+    def test_issue3014(self):
+        # 'gc_load_indexed' must force 'setarrayitem_gc'
+        ops = """
+        [i183]
+        p0 = new_array(5, descr=arraydescr)
+        setarrayitem_gc(p0, 0, i183, descr=arraydescr)
+        i235 = gc_load_indexed_i(p0, 0, 1, 16, 2)
+        escape_i(i235)
+        jump(i183)
+        """
+        self.optimize_loop(ops, ops)
+
+    def test_issue3014_2(self):
+        # same rules for gc_store_indexed versus getarrayitem_gc
+        # (in this direction it seems to work already)
+        ops = """
+        [i183]
+        p0 = new_array(5, descr=arraydescr)
+        gc_store_indexed(p0, 0, i183, 1, 16, 2)
+        i235 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
+        escape_i(i235)
+        jump(i183)
+        """
+        self.optimize_loop(ops, ops)
+
+    def test_issue3014_3(self):
+        # 'gc_load' must force 'setfield_gc'
+        ops = """
+        [i183]
+        p0 = new(descr=ssize)
+        setfield_gc(p0, i183, descr=adescr)
+        i235 = gc_load_i(p0, 8, 2)
+        escape_i(i235)
+        jump(i183)
+        """
+        self.optimize_loop(ops, ops)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to