[pypy-commit] pypy default: A test and fix for rewrite.py.

arigo noreply at buildbot.pypy.org
Wed Apr 22 15:10:24 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r76886:70a22aaa3a7c
Date: 2015-04-22 15:10 +0200
http://bitbucket.org/pypy/pypy/changeset/70a22aaa3a7c/

Log:	A test and fix for rewrite.py.

diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -62,6 +62,10 @@
             op = operations[i]
             if op.getopnum() == rop.DEBUG_MERGE_POINT:
                 continue
+            # ---------- GETFIELD_GC ----------
+            if op.getopnum() == rop.GETFIELD_GC:
+                self.handle_getfield_gc(op)
+                continue
             # ---------- turn NEWxxx into CALL_MALLOC_xxx ----------
             if op.is_malloc():
                 self.handle_malloc_operation(op)
@@ -122,6 +126,18 @@
 
     # ----------
 
+    def handle_getfield_gc(self, op):
+        """See test_zero_ptr_field_before_getfield().  We hope there is
+        no getfield_gc in the middle of initialization code, but there
+        shouldn't be, given that a 'new' is already delayed by previous
+        optimization steps.  In practice it should immediately be
+        followed by a bunch of 'setfields', and the 'pending_zeros'
+        optimization we do here is meant for this case."""
+        self.emit_pending_zeros()
+        self.newops.append(op)
+
+    # ----------
+
     def handle_malloc_operation(self, op):
         opnum = op.getopnum()
         if opnum == rop.NEW:
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -1031,3 +1031,21 @@
             guard_false(i1, descr=guarddescr) []
             jump()
         """)
+
+    def test_zero_ptr_field_before_getfield(self):
+        # This case may need to be fixed in the metainterp/optimizeopt
+        # already so that it no longer occurs for rewrite.py.  But anyway
+        # it's a good idea to make sure rewrite.py is correct on its own.
+        self.check_rewrite("""
+            []
+            p0 = new(descr=tdescr)
+            p1 = getfield_gc(p0, descr=tdescr)
+            jump(p1)
+        """, """
+            []
+            p0 = call_malloc_nursery(%(tdescr.size)d)
+            setfield_gc(p0, 5678, descr=tiddescr)
+            zero_ptr_field(p0, %(tdescr.gc_fielddescrs[0].offset)s)
+            p1 = getfield_gc(p0, descr=tdescr)
+            jump(p1)
+        """)


More information about the pypy-commit mailing list