[pypy-commit] pypy stm-thread-2: Progress

arigo noreply at buildbot.pypy.org
Tue Sep 11 14:35:41 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: stm-thread-2
Changeset: r57276:b49679359373
Date: 2012-09-11 14:31 +0200
http://bitbucket.org/pypy/pypy/changeset/b49679359373/

Log:	Progress

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -757,8 +757,10 @@
     def _setup_write_barrier(self):
         if self.stm:
             from pypy.rpython.memory.gc import stmgc
-            self.P2Wdescr = WriteBarrierDescr(self,
-                                (stmgc.GCFLAG_NOT_WRITTEN, 'P2W'))
+            WBDescr = WriteBarrierDescr
+            self.P2Rdescr = WBDescr(self, (stmgc.GCFLAG_GLOBAL,      'P2R'))
+            self.P2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'P2W'))
+            self.R2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'R2W'))
             self.write_barrier_descr = "wbdescr: do not use"
         else:
             self.write_barrier_descr = WriteBarrierDescr(self)
diff --git a/pypy/jit/backend/llsupport/stmrewrite.py b/pypy/jit/backend/llsupport/stmrewrite.py
--- a/pypy/jit/backend/llsupport/stmrewrite.py
+++ b/pypy/jit/backend/llsupport/stmrewrite.py
@@ -30,10 +30,10 @@
         self.known_category = {}    # variable: letter (R, W, ...)
         self.always_inevitable = False
         self.more_precise_categories = {
-            'P': {#'R': self.gc_ll_descr.P2Rdescr,
+            'P': {'R': self.gc_ll_descr.P2Rdescr,
                   'W': self.gc_ll_descr.P2Wdescr,
                  },
-            'R': {#'W': self.gc_ll_descr.R2Wdescr,
+            'R': {'W': self.gc_ll_descr.R2Wdescr,
                  },
             'W': {},
            }
@@ -52,7 +52,7 @@
             if op.getopnum() in (rop.GETFIELD_GC,
                                  rop.GETARRAYITEM_GC,
                                  rop.GETINTERIORFIELD_GC):
-                self.handle_getfield_operations(op)
+                self.handle_category_operations(op, 'R')
                 continue
             # ----------  setfields  ----------
             if op.getopnum() in (rop.SETFIELD_GC,
@@ -60,7 +60,7 @@
                                  rop.SETINTERIORFIELD_GC,
                                  rop.STRSETITEM,
                                  rop.UNICODESETITEM):
-                self.handle_setfield_operations(op)
+                self.handle_category_operations(op, 'W')
                 continue
             # ----------  mallocs  ----------
             if op.is_malloc():
@@ -129,30 +129,15 @@
         assert isinstance(v, BoxPtr)
         return v
 
-    def handle_setfield_operations(self, op):
+    def handle_category_operations(self, op, target_category):
         lst = op.getarglist()
-        lst[0] = self.gen_barrier(lst[0], 'W')
+        lst[0] = self.gen_barrier(lst[0], target_category)
         self.newops.append(op.copy_and_change(op.getopnum(), args=lst))
 
     def handle_malloc_operation(self, op):
         GcRewriterAssembler.handle_malloc_operation(self, op)
         self.known_category[op.result] = 'W'
 
-    def handle_getfield_operations(self, op):
-        lst = op.getarglist()
-        if lst[0] in self.known_local:
-            self.newops.append(op)
-            return
-        lst[0] = self.unconstifyptr(lst[0])
-        write_barrier_descr = self.gc_ll_descr.write_barrier_descr
-        XXX
-        op_before = ResOperation(rop.STM_READ_BEFORE, [lst[0]], None,
-                                 descr=write_barrier_descr)
-        op_after  = ResOperation(rop.STM_READ_AFTER, [lst[0]], None)
-        self.newops.append(op_before)
-        self.newops.append(op.copy_and_change(op.getopnum(), args=lst))
-        self.newops.append(op_after)
-
     def handle_copystrcontent(self, op):
         # first, a write barrier on the target string
         lst = op.getarglist()
diff --git a/pypy/jit/backend/llsupport/test/test_stmrewrite.py b/pypy/jit/backend/llsupport/test/test_stmrewrite.py
--- a/pypy/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_stmrewrite.py
@@ -29,7 +29,9 @@
                 " descr=stm_try_inevitable_descr)")
         frm_operations = frm_operations.replace('$INEV', inev)
         to_operations  = to_operations .replace('$INEV', inev)
-        namespace['P2Wdescr'] = self.gc_ll_descr.P2Wdescr
+        for name, value in self.gc_ll_descr.__dict__.items():
+            if name.endswith('descr') and name[1] == '2' and len(name) == 8:
+                namespace[name] = value     # "X2Ydescr"
         RewriteTests.check_rewrite(self, frm_operations, to_operations,
                                    **namespace)
 
@@ -157,9 +159,8 @@
             jump(p2)
         """, """
             [p1]
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
-            stm_read_after(p1)
             jump(p2)
         """)
 
@@ -171,11 +172,11 @@
         """, """
             [p1]
             p3 = same_as(ConstPtr(t))
-            stm_read_before(p3, descr=wbdescr)
+            cond_call_gc_wb(p3, 0, descr=P2Rdescr)
             p2 = getfield_gc(p3, descr=tzdescr)
-            stm_read_after(p3)
             jump(p2)
         """)
+        # XXX could do better: G2Rdescr
 
     def test_rewrite_getarrayitem_gc(self):
         self.check_rewrite("""
@@ -184,9 +185,8 @@
             jump(i3)
         """, """
             [p1, i2]
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             i3 = getarrayitem_gc(p1, i2, descr=adescr)
-            stm_read_after(p1)
             jump(i3)
         """)
 
@@ -197,14 +197,12 @@
             jump(i3)
         """, """
             [p1, i2]
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             i3 = getinteriorfield_gc(p1, i2, descr=adescr)
-            stm_read_after(p1)
             jump(i3)
         """)
 
     def test_rewrite_several_getfield_gcs(self):
-        py.test.skip("optimization")
         self.check_rewrite("""
             [p1]
             p2 = getfield_gc(p1, descr=tzdescr)
@@ -212,10 +210,9 @@
             jump(p2, i2)
         """, """
             [p1]
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             i2 = getfield_gc(p1, descr=tydescr)
-            stm_read_after(p1)
             jump(p2, i2)
         """)
 
@@ -227,62 +224,42 @@
             jump(p2, i2)
         """, """
             [p1]
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
-            stm_read_after(p1)
-            stm_read_before(p2, descr=wbdescr)
+            cond_call_gc_wb(p2, 0, descr=P2Rdescr)
             i2 = getfield_gc(p2, descr=tydescr)
-            stm_read_after(p2)
             jump(p2, i2)
         """)
 
-    def test_move_forward_getfield_gc(self):
-        py.test.skip("optimization")
+    def test_getfield_followed_by_setfield(self):
+        # XXX coalesce the two barriers into one if there are e.g. no
+        # calls inbetween
         self.check_rewrite("""
             [p1]
-            p2 = getfield_gc(p1, descr=tzdescr)
-            guard_nonnull(p2) [i1]
-            i2 = getfield_gc(p1, descr=tydescr)
-            jump(p2, i2)
+            i1 = getfield_gc(p1, descr=tydescr)
+            i2 = int_add(i1, 1)
+            setfield_gc(p1, i2, descr=tydescr)
+            jump(p1)
         """, """
             [p1]
-            stm_read_before(p1, descr=wbdescr)
-            p2 = getfield_gc(p1, descr=tzdescr)
-            i2 = getfield_gc(p1, descr=tydescr)
-            stm_read_after(p1)
-            guard_nonnull(p2) [i1]
-            jump(p2, i2)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
+            i1 = getfield_gc(p1, descr=tydescr)
+            i2 = int_add(i1, 1)
+            cond_call_gc_wb(p1, 0, descr=R2Wdescr)
+            setfield_gc(p1, i2, descr=tydescr)
+            jump(p1)
         """)
 
-    def test_dont_move_forward_over_sideeffect(self):
+    def test_setfield_followed_by_getfield(self):
         self.check_rewrite("""
             [p1]
-            p2 = getfield_gc(p1, descr=tzdescr)
-            call(123)
-            i2 = getfield_gc(p1, descr=tydescr)
-            jump(p2, i2)
-        """, """
-            [p1]
-            stm_read_before(p1, descr=wbdescr)
-            p2 = getfield_gc(p1, descr=tzdescr)
-            stm_read_after(p1)
-            call(123)
-            stm_read_before(p1, descr=wbdescr)
-            i2 = getfield_gc(p1, descr=tydescr)
-            stm_read_after(p1)
-            jump(p2, i2)
-        """)
-
-    def test_rewrite_getfield_gc_on_local(self):
-        self.check_rewrite("""
-            [p1]
-            setfield_gc(p1, 5, descr=tydescr)
+            setfield_gc(p1, 123, descr=tydescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             jump(p2)
         """, """
             [p1]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
-            setfield_gc(p1, 5, descr=tydescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
+            setfield_gc(p1, 123, descr=tydescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             jump(p2)
         """)
@@ -302,23 +279,9 @@
             jump(p2)
         """)
 
-    def test_rewrite_getfield_gc_on_future_local(self):
-        py.test.skip("optimization")
-        self.check_rewrite("""
-            [p1]
-            p2 = getfield_gc(p1, descr=tzdescr)
-            setfield_gc(p1, 5, descr=tydescr)
-            jump(p2)
-        """, """
-            [p1]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
-            p2 = getfield_gc(p1, descr=tzdescr)
-            setfield_gc(p1, 5, descr=tydescr)
-            jump(p2)
-        """)
-
     def test_rewrite_getfield_gc_on_future_local_after_call(self):
-        py.test.skip("optimization")
+        # XXX could detect CALLs that cannot interrupt the transaction
+        # and/or could use the L category
         self.check_rewrite("""
             [p1]
             p2 = getfield_gc(p1, descr=tzdescr)
@@ -327,10 +290,10 @@
             jump(p2)
         """, """
             [p1]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             call(p2)
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setfield_gc(p1, 5, descr=tydescr)
             jump(p2)
         """)
@@ -404,9 +367,9 @@
             jump()
         """, """
             [p1, i1, p2, p3, i3, p4]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setarrayitem_gc(p1, i1, p2, descr=?)
-            cond_call_gc_wb(p3, 0, descr=wbdescr)
+            cond_call_gc_wb(p3, 0, descr=P2Wdescr)
             setarrayitem_gc(p3, i3, p4, descr=?)
             jump()
         """)
@@ -420,7 +383,7 @@
             jump()
         """, """
             [p1, p2, i2, p3, i3]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setarrayitem_gc(p1, i2, p2, descr=adescr)
             i4 = read_timestamp()
             setarrayitem_gc(p1, i3, p3, descr=adescr)
@@ -436,7 +399,7 @@
             jump()
         """, """
             [p1, p2, i2, p3, i3]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setinteriorfield_gc(p1, i2, p2, descr=adescr)
             i4 = read_timestamp()
             setinteriorfield_gc(p1, i3, p3, descr=adescr)
@@ -451,7 +414,7 @@
             jump()
         """, """
             [p1, i2, i3]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             strsetitem(p1, i2, i3)
             unicodesetitem(p1, i2, i3)
             jump()
@@ -474,11 +437,11 @@
                 jump(i2, p7)
             """ % op, """
                 [i1, i2, i3, p7]
-                cond_call_gc_wb(p7, 0, descr=wbdescr)
+                cond_call_gc_wb(p7, 0, descr=P2Wdescr)
                 setfield_gc(p7, 10, descr=tydescr)
                 $INEV
                 %s
-                cond_call_gc_wb(p7, 0, descr=wbdescr)
+                cond_call_gc_wb(p7, 0, descr=P2Wdescr)
                 setfield_gc(p7, 20, descr=tydescr)
                 jump(i2, p7)
             """ % op)
@@ -490,10 +453,9 @@
             jump()
         """, """
             [p1, p2, i1, i2, i3]
-            cond_call_gc_wb(p2, 0, descr=wbdescr)
-            stm_read_before(p1, descr=wbdescr)
+            cond_call_gc_wb(p2, 0, descr=P2Wdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Rdescr)
             copystrcontent(p1, p2, i1, i2, i3)
-            stm_read_after(p1)
             jump()
         """)
 
@@ -511,7 +473,7 @@
                 jump(p1)
             """ % op, """
                 [p1]
-                cond_call_gc_wb(p1, 0, descr=wbdescr)
+                cond_call_gc_wb(p1, 0, descr=P2Wdescr)
                 setfield_gc(p1, 10, descr=tydescr)
                 %s
                 setfield_gc(p1, 20, descr=tydescr)
@@ -532,10 +494,10 @@
                 jump(p1)
             """ % op, """
                 [p1]
-                cond_call_gc_wb(p1, 0, descr=wbdescr)
+                cond_call_gc_wb(p1, 0, descr=P2Wdescr)
                 setfield_gc(p1, 10, descr=tydescr)
                 %s
-                cond_call_gc_wb(p1, 0, descr=wbdescr)
+                cond_call_gc_wb(p1, 0, descr=P2Wdescr)
                 setfield_gc(p1, 20, descr=tydescr)
                 jump(p1)
             """ % op)


More information about the pypy-commit mailing list