[pypy-commit] pypy stmgc-c8: In the JIT, copy the stm_dont_track_raw_accesses logic for getfield_raw

arigo noreply at buildbot.pypy.org
Wed Jun 24 19:10:45 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8
Changeset: r78302:972b5349364b
Date: 2015-06-24 19:10 +0200
http://bitbucket.org/pypy/pypy/changeset/972b5349364b/

Log:	In the JIT, copy the stm_dont_track_raw_accesses logic for
	getfield_raw to also apply to getarrayitem_raw

diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -84,16 +84,20 @@
 
 class ArrayOrFieldDescr(AbstractDescr):
     vinfo = None
+    stm_dont_track_raw_accesses = False
 
     def get_vinfo(self):
         return self.vinfo
 
+    def stm_should_track_raw_accesses(self):
+        return not self.stm_dont_track_raw_accesses
+
+
 class FieldDescr(ArrayOrFieldDescr):
     name = ''
     offset = 0      # help translation
     field_size = 0
     flag = '\x00'
-    stm_dont_track_raw_accesses = False
     _immutable = False
 
     def __init__(self, name, offset, field_size, flag,
@@ -147,9 +151,6 @@
     def repr_of_descr(self):
         return '<Field%s %s %s>' % (self.flag, self.name, self.offset)
 
-    def stm_should_track_raw_accesses(self):
-        return not self.stm_dont_track_raw_accesses
-
 
 def get_field_descr(gccache, STRUCT, fieldname):
     cache = gccache._cache_field
@@ -219,11 +220,13 @@
     _immutable = False
 
     def __init__(self, basesize, itemsize, lendescr, flag,
+                 stm_dont_track_raw_accesses=False,
                  immutable=False):
         self.basesize = basesize
         self.itemsize = itemsize
         self.lendescr = lendescr    # or None, if no length
         self.flag = flag
+        self.stm_dont_track_raw_accesses = stm_dont_track_raw_accesses
         self._immutable = immutable
 
     def is_immutable(self):
@@ -282,9 +285,12 @@
             lendescr = None
         else:
             lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
+        stm_dont_track_raw_accesses = ARRAY_INSIDE._hints.get(
+            'stm_dont_track_raw_accesses', False)
         flag = get_type_flag(ARRAY_INSIDE.OF)
         immutable = bool(ARRAY_INSIDE._immutable_field())
         arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag,
+                                stm_dont_track_raw_accesses,
                                 immutable)
         if ARRAY_OR_STRUCT._gckind == 'gc':
             gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
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
@@ -1,5 +1,5 @@
 from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
-from rpython.jit.backend.llsupport.descr import CallDescr, FieldDescr
+from rpython.jit.backend.llsupport.descr import CallDescr, ArrayOrFieldDescr
 from rpython.jit.metainterp.resoperation import ResOperation, rop
 from rpython.jit.metainterp.history import BoxPtr, ConstInt
 from rpython.rlib.objectmodel import specialize
@@ -70,8 +70,9 @@
         if opnum in (rop.COPYSTRCONTENT, rop.COPYUNICODECONTENT):
             self.handle_setters_for_pure_fields(op, 1)
             return
-        # ----------  raw getfields and setfields  ----------
-        if opnum in (rop.GETFIELD_RAW, rop.SETFIELD_RAW):
+        # ----------  raw getfields and setfields and arrays  ----------
+        if opnum in (rop.GETFIELD_RAW, rop.SETFIELD_RAW,
+                     rop.GETARRAYITEM_RAW, rop.SETARRAYITEM_RAW):
             if self.maybe_handle_raw_accesses(op):
                 return
         # ----------  labels  ----------
@@ -168,7 +169,7 @@
 
     def maybe_handle_raw_accesses(self, op):
         descr = op.getdescr()
-        assert isinstance(descr, FieldDescr)
+        assert isinstance(descr, ArrayOrFieldDescr)
         if descr.stm_dont_track_raw_accesses:
             self.newop(op)
             return True
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
@@ -44,8 +44,6 @@
     words.append('ZERO_ARRAY')
     words.append('ZERO_PTR_FIELD')
     # these always turn inevitable
-    words.append('GETARRAYITEM_RAW')
-    words.append('SETARRAYITEM_RAW')
     words.append('SETINTERIORFIELD_RAW')
     words.append('RAW_LOAD')
     words.append('RAW_STORE')
@@ -96,6 +94,7 @@
         to_operations  = to_operations .replace('$DUMMYALLOC', dummyalloc)
         for name, value in self.gc_ll_descr.__dict__.items():
             if name.endswith('descr') and name[1] == '2' and len(name) == 8:
+                assert name not in namespace
                 namespace[name] = value     # "X2Ydescr"
         self.gc_ll_descr.malloc_zero_filled = False
         RewriteTests.check_rewrite(self, frm_operations, to_operations,
@@ -525,6 +524,55 @@
             jump(i2)
         """, fdescr=fdescr)
 
+    def test_setfield_raw_stm_dont_track_raw_accesses(self):
+        c1 = GcCache(True)
+        F = lltype.Struct('F', ('x', lltype.Signed),
+                          hints={'stm_dont_track_raw_accesses': True})
+        fdescr = get_field_descr(c1, F, 'x')
+        self.check_rewrite("""
+            [i1]
+            setfield_raw(i1, 42, descr=fdescr)
+            jump(i1)
+        """, """
+            [i1]
+            setfield_raw(i1, 42, descr=fdescr)
+            $DUMMYALLOC
+            jump(i1)
+        """, fdescr=fdescr)
+
+    def test_getarrayitem_raw_stm_dont_track_raw_accesses(self):
+        c1 = GcCache(True)
+        A = lltype.Array(lltype.Signed, hints={'nolength': True,
+                            'stm_dont_track_raw_accesses': True})
+        aadescr = get_array_descr(c1, A)
+        assert not aadescr.stm_should_track_raw_accesses()
+        self.check_rewrite("""
+            [i1]
+            i2 = getarrayitem_raw(i1, 5, descr=aadescr)
+            jump(i2)
+        """, """
+            [i1]
+            i2 = getarrayitem_raw(i1, 5, descr=aadescr)
+            $DUMMYALLOC
+            jump(i2)
+        """, aadescr=aadescr)
+
+    def test_setarrayitem_raw_stm_dont_track_raw_accesses(self):
+        c1 = GcCache(True)
+        A = lltype.Array(lltype.Signed, hints={'nolength': True,
+                            'stm_dont_track_raw_accesses': True})
+        aadescr = get_array_descr(c1, A)
+        self.check_rewrite("""
+            [i1]
+            setarrayitem_raw(i1, 5, 42, descr=aadescr)
+            jump(i1)
+        """, """
+            [i1]
+            setarrayitem_raw(i1, 5, 42, descr=aadescr)
+            $DUMMYALLOC
+            jump(i1)
+        """, aadescr=aadescr)
+
     def test_getfield_raw_over_label(self):
         self.check_rewrite("""
             [i1, i2]
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -112,7 +112,8 @@
                                                 pure))
 
 def do_getarrayitem_raw(cpu, _, arraybox, indexbox, arraydescr):
-    return _do_getarrayitem_raw(cpu, False, arraybox, indexbox, arraydescr)
+    pure = not arraydescr.stm_should_track_raw_accesses()
+    return _do_getarrayitem_raw(cpu, pure, arraybox, indexbox, arraydescr)
 
 def do_getarrayitem_raw_pure(cpu, _, arraybox, indexbox, arraydescr):
     return _do_getarrayitem_raw(cpu, True, arraybox, indexbox, arraydescr)


More information about the pypy-commit mailing list