[pypy-commit] pypy stm-thread-2: Finish the setfield tests.

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


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

Log:	Finish the setfield tests.

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
@@ -27,8 +27,16 @@
 
     def __init__(self, *args):
         GcRewriterAssembler.__init__(self, *args)
-        self.known_local = set()    # set of variables
+        self.known_category = {}    # variable: letter (R, W, ...)
         self.always_inevitable = False
+        self.more_precise_categories = {
+            'P': {#'R': self.gc_ll_descr.P2Rdescr,
+                  'W': self.gc_ll_descr.P2Wdescr,
+                 },
+            'R': {#'W': self.gc_ll_descr.R2Wdescr,
+                 },
+            'W': {},
+           }
 
     def rewrite(self, operations):
         # overridden method from parent class
@@ -60,7 +68,7 @@
                 continue
             # ----------  calls  ----------
             if op.is_call():
-                self.known_local.clear()
+                self.known_category.clear()
                 if op.getopnum() == rop.CALL_RELEASE_GIL:
                     self.fallback_inevitable(op)
                 else:
@@ -73,7 +81,7 @@
                 continue
             # ----------  labels  ----------
             if op.getopnum() == rop.LABEL:
-                self.known_local.clear()
+                self.known_category.clear()
                 self.always_inevitable = False
                 self.newops.append(op)
                 continue
@@ -94,16 +102,22 @@
         return self.newops
 
 
-    def gen_write_barrier(self, v_base, cat):
+    def gen_write_barrier(self, v):
+        raise NotImplementedError
+
+    def gen_barrier(self, v_base, target_category):
         v_base = self.unconstifyptr(v_base)
         assert isinstance(v_base, BoxPtr)
-        if v_base in self.known_local:
-            return v_base    # no write barrier needed
-        write_barrier_descr = getattr(self.gc_ll_descr, '%sdescr' % (cat,))
+        source_category = self.known_category.get(v_base, 'P')
+        mpcat = self.more_precise_categories[source_category]
+        try:
+            write_barrier_descr = mpcat[target_category]
+        except KeyError:
+            return v_base    # no barrier needed
         args = [v_base, self.c_zero]
         self.newops.append(ResOperation(rop.COND_CALL_GC_WB, args, None,
                                         descr=write_barrier_descr))
-        self.known_local.add(v_base)
+        self.known_category[v_base] = target_category
         return v_base
 
     def unconstifyptr(self, v):
@@ -117,12 +131,12 @@
 
     def handle_setfield_operations(self, op):
         lst = op.getarglist()
-        lst[0] = self.gen_write_barrier(lst[0], 'P2W')
+        lst[0] = self.gen_barrier(lst[0], 'W')
         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_local.add(op.result)
+        self.known_category[op.result] = 'W'
 
     def handle_getfield_operations(self, op):
         lst = op.getarglist()
@@ -131,6 +145,7 @@
             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)
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
@@ -53,7 +53,7 @@
         """, """
             [p1, p2]
             p3 = same_as(ConstPtr(t))
-            cond_call_gc_wb(p3, 0, descr=wbdescr)
+            cond_call_gc_wb(p3, 0, descr=P2Wdescr)
             setfield_gc(p3, p2, descr=tzdescr)
             jump()
         """)
@@ -81,9 +81,9 @@
             jump()
         """, """
             [p1, p2, p3, p4]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
-            cond_call_gc_wb(p3, 0, descr=wbdescr)
+            cond_call_gc_wb(p3, 0, descr=P2Wdescr)
             setfield_gc(p3, p4, descr=tzdescr)
             jump()
         """)
@@ -96,7 +96,7 @@
             jump()
         """, """
             [p1, p2, i3]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
             setfield_gc(p1, i3, descr=tydescr)
             jump()
@@ -111,10 +111,10 @@
             jump(p1)
         """, """
             [p1, p2, i3]
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
             label(p1, i3)
-            cond_call_gc_wb(p1, 0, descr=wbdescr)
+            cond_call_gc_wb(p1, 0, descr=P2Wdescr)
             setfield_gc(p1, i3, descr=tydescr)
             jump(p1)
         """)


More information about the pypy-commit mailing list