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