[pypy-commit] pypy stmgc-c7: delay stm_read until it needs to be done in stmrewrite. limited because we

Raemi noreply at buildbot.pypy.org
Thu Apr 17 17:28:28 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: stmgc-c7
Changeset: r70705:10a78b65a5a9
Date: 2014-04-17 17:28 +0200
http://bitbucket.org/pypy/pypy/changeset/10a78b65a5a9/

Log:	delay stm_read until it needs to be done in stmrewrite. limited
	because we have to do it before every guard

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
@@ -81,11 +81,15 @@
                 continue
             # ---------- fallback case (overwritten in stmrewrite) -----------
             self.other_operation(op)
+        self.flush_caches()
         return self.newops
 
     def other_operation(self, op):
         self.newops.append(op)
 
+    def flush_caches(self):
+        pass
+
     # ----------
 
     def handle_malloc_operation(self, op):
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -4,10 +4,8 @@
 from rpython.jit.metainterp.resoperation import ResOperation, rop
 from rpython.jit.metainterp.history import BoxPtr, ConstPtr, ConstInt
 from rpython.rlib.objectmodel import specialize
-from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.debug import (have_debug_prints, debug_start, debug_stop,
                                 debug_print)
-from rpython.jit.codewriter.effectinfo import EffectInfo
 
 
 class GcStmRewriterAssembler(GcRewriterAssembler):
@@ -18,6 +16,7 @@
         GcRewriterAssembler.__init__(self, *args)
         self.always_inevitable = False
         self.read_barrier_applied = {}
+        self.read_barrier_cache = []
 
     def other_operation(self, op):
         opnum = op.getopnum()
@@ -35,6 +34,10 @@
             return
         # ----------  pure operations, guards  ----------
         if op.is_always_pure() or op.is_guard() or op.is_ovf():
+            if op.is_guard():
+                # XXX: store this info on the guard descr
+                # to be able to do the stm_reads in resume
+                self.flush_read_barrier_cache()
             self.newops.append(op)
             return
         # ----------  non-pure getfields  ----------
@@ -83,7 +86,11 @@
             self.newops.append(op)
             return
         # ----------  jumps, finish, other ignored ops  ----------
-        if opnum in (rop.JUMP, rop.FINISH, rop.FORCE_TOKEN,
+        if opnum in (rop.JUMP, rop.FINISH):
+            self.flush_read_barrier_cache()
+            self.newops.append(op)
+            return
+        if opnum in (rop.FORCE_TOKEN,
                      rop.READ_TIMESTAMP, rop.MARK_OPAQUE_PTR,
                      rop.JIT_DEBUG, rop.KEEPALIVE,
                      rop.QUASIIMMUT_FIELD, rop.RECORD_KNOWN_CLASS,
@@ -94,6 +101,7 @@
         # Check that none of the ops handled here can collect.
         # This is not done by the fallback here
         assert not op.is_call() and not op.is_malloc()
+        self.flush_caches()
         self.fallback_inevitable(op)
 
     def handle_call_assembler(self, op):
@@ -102,10 +110,28 @@
         self.next_op_may_be_in_new_transaction()
         GcRewriterAssembler.handle_call_assembler(self, op)
 
+    def emitting_an_operation_that_can_collect(self):
+        self.flush_read_barrier_cache()
+        GcRewriterAssembler.emitting_an_operation_that_can_collect(self)
+
     def next_op_may_be_in_new_transaction(self):
+        self.flush_read_barrier_cache()
         self.always_inevitable = False
         self.read_barrier_applied.clear()
 
+    def flush_caches(self):
+        self.flush_read_barrier_cache()
+
+    def flush_read_barrier_cache(self):
+        for v_ptr in self.read_barrier_cache:
+            if (v_ptr not in self.read_barrier_applied # if multiple times in this list
+                and v_ptr not in self.write_barrier_applied):
+                op1 = ResOperation(rop.STM_READ, [v_ptr], None)
+                self.newops.append(op1)
+                self.read_barrier_applied[v_ptr] = None
+
+        del self.read_barrier_cache[:]
+
     def handle_getfields(self, op):
         # XXX missing optimitations: the placement of stm_read should
         # ideally be delayed for a bit longer after the getfields; if we
@@ -116,9 +142,7 @@
         v_ptr = op.getarg(0)
         if (v_ptr not in self.read_barrier_applied and
             v_ptr not in self.write_barrier_applied):
-            op1 = ResOperation(rop.STM_READ, [v_ptr], None)
-            self.newops.append(op1)
-            self.read_barrier_applied[v_ptr] = None
+            self.read_barrier_cache.append(v_ptr)
 
 
     def must_apply_write_barrier(self, val, v=None):
@@ -142,7 +166,6 @@
         debug_print("fallback for", op.repr())
 
     def maybe_handle_raw_accesses(self, op):
-        from rpython.jit.backend.llsupport.descr import FieldDescr
         descr = op.getdescr()
         assert isinstance(descr, FieldDescr)
         if descr.stm_dont_track_raw_accesses:
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -157,11 +157,11 @@
         """, """
             [p1, p2]
             p3 = getfield_gc(p1, descr=tzdescr)
-            stm_read(p1)
             p4 = getfield_gc(p1, descr=tzdescr)
             p5 = getfield_gc(p2, descr=tzdescr)
+            p6 = getfield_gc(p1, descr=tzdescr)
+            stm_read(p1)
             stm_read(p2)
-            p6 = getfield_gc(p1, descr=tzdescr)
             jump()
         """)
 
@@ -191,10 +191,10 @@
         """, """
             [p0, p1, p2]
             p3 = getfield_gc(p1, descr=tzdescr)
-            stm_read(p1)
             cond_call_gc_wb(p2, descr=wbdescr)
             setfield_gc(p2, p0, descr=tzdescr)
             p4 = getfield_gc(p1, descr=tzdescr)
+            stm_read(p1)
             jump()
             """, t=NULL)
 
@@ -388,8 +388,8 @@
         """, """
             [p1]
             p2 = getfield_gc(p1, descr=tzdescr)
+            i2 = getfield_gc(p2, descr=tydescr)
             stm_read(p1)
-            i2 = getfield_gc(p2, descr=tydescr)
             stm_read(p2)
             jump(p2, i2)
         """)
@@ -406,7 +406,6 @@
         """, """
             [p1]
             i1 = getfield_gc(p1, descr=tydescr)
-            stm_read(p1)
             i2 = int_add(i1, 1)
             cond_call_gc_wb(p1, descr=wbdescr)
             setfield_gc(p1, i2, descr=tydescr)
@@ -767,7 +766,7 @@
         """, """
         [i0, f0, p1]
         p2 = getfield_gc(p1, descr=tzdescr)
-        stm_read(p1)
+
         cond_call_gc_wb(p1, descr=wbdescr)
         setfield_gc(p1, p2, descr=tzdescr)
 
@@ -782,7 +781,6 @@
         guard_not_forced() []
 
         p3 = getfield_gc(p1, descr=tzdescr)
-        stm_read(p1)
         cond_call_gc_wb(p1, descr=wbdescr)
         setfield_gc(p1, p3, descr=tzdescr)
         """)
@@ -1182,8 +1180,8 @@
             """ % d, """
                 [p1, p3, i1, p4]
                 p2 = getfield_gc%(pure)s(p1, descr=uxdescr)
+                i4 = getarrayitem_gc%(pure)s(p4, i1, descr=vdescr)
                 %(comment)s stm_read(p1)
-                i4 = getarrayitem_gc%(pure)s(p4, i1, descr=vdescr)
                 %(comment)s stm_read(p4)
                 jump(p2)
             """ % d, uxdescr=uxdescr, vdescr=vdescr)


More information about the pypy-commit mailing list