Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r67109:64209c0ce0e5
Date: 2013-09-26 10:15 +0200
http://bitbucket.org/pypy/pypy/changeset/64209c0ce0e5/

Log:    Don't force inevitable when doing a raw getfield/setfield if the
        struct has 'stm_dont_track_raw_accesses'.

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
@@ -87,12 +87,15 @@
     offset = 0      # help translation
     field_size = 0
     flag = '\x00'
+    stm_dont_track_raw_accesses = False
 
-    def __init__(self, name, offset, field_size, flag):
+    def __init__(self, name, offset, field_size, flag,
+                 stm_dont_track_raw_accesses=False):
         self.name = name
         self.offset = offset
         self.field_size = field_size
         self.flag = flag
+        self.stm_dont_track_raw_accesses = stm_dont_track_raw_accesses
 
     def is_pointer_field(self):
         return self.flag == FLAG_POINTER
@@ -120,7 +123,10 @@
         FIELDTYPE = getattr(STRUCT, fieldname)
         flag = get_type_flag(FIELDTYPE)
         name = '%s.%s' % (STRUCT._name, fieldname)
-        fielddescr = FieldDescr(name, offset, size, flag)
+        stm_dont_track_raw_accesses = STRUCT._hints.get(
+            'stm_dont_track_raw_accesses', False)
+        fielddescr = FieldDescr(name, offset, size, flag,
+                                stm_dont_track_raw_accesses)
         cachedict = cache.setdefault(STRUCT, {})
         cachedict[fieldname] = fielddescr
         return fielddescr
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
@@ -127,6 +127,10 @@
                                  rop.COPYUNICODECONTENT):
                 self.handle_copystrcontent(op)
                 continue
+            # ----------  raw getfields and setfields  ----------
+            if op.getopnum() in (rop.GETFIELD_RAW, rop.SETFIELD_RAW):
+                if self.maybe_handle_raw_accesses(op):
+                    continue
             # ----------  labels  ----------
             if op.getopnum() == rop.LABEL:
                 self.known_category.clear()
@@ -241,3 +245,12 @@
 
     def handle_ptr_eq(self, op):
         self.newops.append(op)
+
+    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:
+            self.newops.append(op)
+            return True
+        return False
diff --git a/rpython/jit/backend/llsupport/test/test_descr.py 
b/rpython/jit/backend/llsupport/test/test_descr.py
--- a/rpython/jit/backend/llsupport/test/test_descr.py
+++ b/rpython/jit/backend/llsupport/test/test_descr.py
@@ -118,6 +118,16 @@
     assert descr.flag == FLAG_FLOAT
     assert descr.field_size == 8
 
+def test_get_field_descr_stm_dont_track_raw_accesses():
+    c2 = GcCache(True)
+    S = lltype.Struct('S', ('x', lltype.Signed))
+    T = lltype.Struct('T', ('y', lltype.Signed),
+                      hints={'stm_dont_track_raw_accesses': True})
+    descr_x = get_field_descr(c2, S, 'x')
+    descr_y = get_field_descr(c2, T, 'y')
+    assert descr_x.stm_dont_track_raw_accesses == False
+    assert descr_y.stm_dont_track_raw_accesses == True
+
 
 def test_get_array_descr():
     U = lltype.Struct('U')
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
@@ -507,6 +507,21 @@
             jump(i3, i4)
         """)
 
+    def test_getfield_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]
+            i2 = getfield_raw(i1, descr=fdescr)
+            jump(i2)
+        """, """
+            [i1]
+            i2 = getfield_raw(i1, descr=fdescr)
+            jump(i2)
+        """, fdescr=fdescr)
+
     def test_getfield_raw_over_label(self):
         self.check_rewrite("""
             [i1, i2]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to