[pypy-commit] pypy default: SETINTERIORFIELD_GC should also generate a COND_CALL_GC_WB_ARRAY. This

arigo noreply at buildbot.pypy.org
Mon Jun 30 18:46:44 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r72292:b4bca9ebe10b
Date: 2014-06-30 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/b4bca9ebe10b/

Log:	SETINTERIORFIELD_GC should also generate a COND_CALL_GC_WB_ARRAY.
	This looks essential to get correct performance behavior in programs
	that do a couple of writes to very large dictionaries every minor
	collection.

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
@@ -396,16 +396,6 @@
                 #op = op.copy_and_change(rop.SETFIELD_RAW)
         self.newops.append(op)
 
-    def handle_write_barrier_setinteriorfield(self, op):
-        val = op.getarg(0)
-        if val not in self.write_barrier_applied:
-            v = op.getarg(2)
-            if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
-                                         bool(v.value)): # store a non-NULL
-                self.gen_write_barrier(val)
-                #op = op.copy_and_change(rop.SETINTERIORFIELD_RAW)
-        self.newops.append(op)
-
     def handle_write_barrier_setarrayitem(self, op):
         val = op.getarg(0)
         if val not in self.write_barrier_applied:
@@ -413,9 +403,11 @@
             if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
                                          bool(v.value)): # store a non-NULL
                 self.gen_write_barrier_array(val, op.getarg(1))
-                #op = op.copy_and_change(rop.SETARRAYITEM_RAW)
+                #op = op.copy_and_change(rop.SET{ARRAYITEM,INTERIORFIELD}_RAW)
         self.newops.append(op)
 
+    handle_write_barrier_setinteriorfield = handle_write_barrier_setarrayitem
+
     def gen_write_barrier(self, v_base):
         write_barrier_descr = self.gc_ll_descr.write_barrier_descr
         args = [v_base]
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
@@ -669,7 +669,7 @@
             jump(p1, p2)
         """, """
             [p1, p2]
-            cond_call_gc_wb(p1, descr=wbdescr)
+            cond_call_gc_wb_array(p1, 0, descr=wbdescr)
             setinteriorfield_gc(p1, 0, p2, descr=interiorzdescr)
             jump(p1, p2)
         """, interiorzdescr=interiorzdescr)


More information about the pypy-commit mailing list