[pypy-commit] pypy stmgc-c8: zero stm_flags in the JIT

Raemi noreply at buildbot.pypy.org
Thu Mar 12 15:43:42 CET 2015


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: stmgc-c8
Changeset: r76350:b31739603c93
Date: 2015-03-12 10:30 +0100
http://bitbucket.org/pypy/pypy/changeset/b31739603c93/

Log:	zero stm_flags in the JIT

diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,7 +1,12 @@
+------------------------------------------------------------
+
+fuse the two 32bit setfield_gc for stmflags & tid in the jit
+
 ------------------------------------------------------------
 
 better heuristic of when to break transactions? e.g., we should
 rarely break if there are not threads running in parallel.
+But we need to break sometimes in order to run finalizers...
 
 ------------------------------------------------------------
 
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
@@ -173,8 +173,10 @@
 
 def build_stm_tid_field_descr():
     from rpython.rlib import rstm
-    return FieldDescr('tid', rstm.tid_offset, rffi.sizeof(rstm.TID),
-                      get_type_flag(rstm.TID), False, True)
+    return (FieldDescr('stmflags', rstm.stmflags_offset, rffi.sizeof(rstm.STMFLAGS),
+                       get_type_flag(rstm.STMFLAGS), False, True),
+            FieldDescr('tid', rstm.tid_offset, rffi.sizeof(rstm.TID),
+                       get_type_flag(rstm.TID), False, True))
 
 def get_type_flag(TYPE):
     if isinstance(TYPE, lltype.Ptr):
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -487,6 +487,8 @@
     def _initialize_for_tests(self):
         self.layoutbuilder = None
         self.fielddescr_tid = AbstractDescr()
+        if self.stm:
+            self.fielddescr_stmflags = AbstractDescr()
         self.max_size_of_young_obj = 1000
         self.GCClass = None
         self.gcheaderbuilder = None
@@ -531,7 +533,7 @@
             self.fielddescr_tid = get_field_descr(self, self.GCClass.HDR,
                                                   'tid')
         else:
-            self.fielddescr_tid = build_stm_tid_field_descr()
+            self.fielddescr_stmflags, self.fielddescr_tid = build_stm_tid_field_descr()
         frame_tid = self.layoutbuilder.get_type_id(jitframe.JITFRAME)
         self.translator._jit2gc['frame_tid'] = frame_tid
 
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
@@ -134,6 +134,17 @@
     def must_apply_write_barrier(self, val, v=None):
         return val not in self.write_barrier_applied
 
+    def gen_initialize_tid(self, v_newgcobj, tid):
+        # Also emit a setfield that zeroes the stm_flags field.
+        # This is necessary since we merge some allocations together and
+        # stmgc assumes flags to be cleared.
+        assert self.gc_ll_descr.fielddescr_stmflags is not None
+
+        op = ResOperation(rop.SETFIELD_GC,
+                          [v_newgcobj, ConstInt(0)], None,
+                          descr=self.gc_ll_descr.fielddescr_stmflags)
+        self.newop(op)
+        return GcRewriterAssembler.gen_initialize_tid(self, v_newgcobj, tid)
 
     @specialize.arg(1)
     def _do_stm_call(self, funcname, args, result):
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -73,6 +73,8 @@
         register_known_gctype(self.cpu, o_vtable, O)
         #
         tiddescr = self.gc_ll_descr.fielddescr_tid
+        if self.gc_ll_descr.stm:
+            stmflagsdescr = self.gc_ll_descr.fielddescr_stmflags
         wbdescr = self.gc_ll_descr.write_barrier_descr
         WORD = globals()['WORD']
         #
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
@@ -55,6 +55,7 @@
             lambda cpu: True)
         self.gc_ll_descr.minimal_size_in_nursery = 16
         self.gc_ll_descr.malloc_zero_filled = False
+        assert self.gc_ll_descr.stm
         #
         class FakeCPU(BaseFakeCPU):
             def sizeof(self, STRUCT):
@@ -224,6 +225,7 @@
             cond_call_gc_wb(p3, descr=wbdescr)
             setfield_gc(p3, p1, descr=tzdescr)
             p2 = call_malloc_nursery(%(tdescr.size)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
             cond_call_gc_wb(p3, descr=wbdescr)
             setfield_gc(p3, p1, descr=tzdescr)
@@ -243,6 +245,7 @@
             p2 = getfield_gc(p1, descr=tzdescr)
             stm_read(p1)
             p3 = call_malloc_nursery(%(tdescr.size)d)
+            setfield_gc(p3, 0, descr=stmflagsdescr)
             setfield_gc(p3, %(tdescr.tid)d, descr=tiddescr)
             p4 = getfield_gc(p1, descr=tzdescr)
             zero_ptr_field(p3, %(tdescr.gc_fielddescrs[0].offset)s)
@@ -258,6 +261,7 @@
         """, """
             [p1]
             p2 = call_malloc_nursery(%(tdescr.size)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
             setfield_gc(p2, p1, descr=tzdescr)
             jump(p2)
@@ -272,6 +276,7 @@
         """, """
             []
             p2 = call_malloc_nursery(%(tdescr.size)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
             p1 = getfield_gc(p2, descr=tzdescr)
             zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
@@ -779,6 +784,7 @@
         [i0, f0]
         i1 = getfield_raw(ConstClass(frame_info), descr=jfi_frame_depth)
         p1 = call_malloc_nursery_varsize_frame(i1)
+        setfield_gc(p1, 0, descr=stmflagsdescr)
         setfield_gc(p1, 0, descr=tiddescr)
         setfield_gc(p1, i1, descr=framelendescr)
         setfield_gc(p1, ConstClass(frame_info), descr=jf_frame_info)
@@ -809,6 +815,7 @@
 
         i1 = getfield_raw(ConstClass(frame_info), descr=jfi_frame_depth)
         p5 = call_malloc_nursery_varsize_frame(i1)
+        setfield_gc(p5, 0, descr=stmflagsdescr)
         setfield_gc(p5, 0, descr=tiddescr)
         setfield_gc(p5, i1, descr=framelendescr)
         setfield_gc(p5, ConstClass(frame_info), descr=jf_frame_info)
@@ -881,6 +888,7 @@
         """, """
             [p1]
             p0 = call_malloc_nursery(%(sdescr.size)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 1234, descr=tiddescr)
             jump()
         """)
@@ -896,6 +904,7 @@
             []
             p0 = call_malloc_nursery(   \
                                %(sdescr.size + tdescr.size + sdescr.size)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 1234, descr=tiddescr)
             p1 = int_add(p0, %(sdescr.size)d)
             setfield_gc(p1, 0, descr=stmflagsdescr)
@@ -916,6 +925,7 @@
             []
             p0 = call_malloc_nursery(    \
                                 %(adescr.basesize + 10 * adescr.itemsize)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 4321, descr=tiddescr)
             setfield_gc(p0, 10, descr=alendescr)
             jump()
@@ -932,8 +942,10 @@
             p0 = call_malloc_nursery(                                  \
                                 %(sdescr.size +                        \
                                   adescr.basesize + 10 * adescr.itemsize)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 1234, descr=tiddescr)
             p1 = int_add(p0, %(sdescr.size)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 4321, descr=tiddescr)
             setfield_gc(p1, 10, descr=alendescr)
             jump()
@@ -947,6 +959,7 @@
         """, """
             []
             p0 = call_malloc_nursery(%(bdescr.basesize + 8)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 6, descr=blendescr)
             jump()
@@ -963,15 +976,19 @@
         """, """
             []
             p0 = call_malloc_nursery(%(4 * (bdescr.basesize + 8))d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 5, descr=blendescr)
             p1 = int_add(p0, %(bdescr.basesize + 8)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 8765, descr=tiddescr)
             setfield_gc(p1, 5, descr=blendescr)
             p2 = int_add(p1, %(bdescr.basesize + 8)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, 8765, descr=tiddescr)
             setfield_gc(p2, 5, descr=blendescr)
             p3 = int_add(p2, %(bdescr.basesize + 8)d)
+            setfield_gc(p3, 0, descr=stmflagsdescr)
             setfield_gc(p3, 8765, descr=tiddescr)
             setfield_gc(p3, 5, descr=blendescr)
             jump()
@@ -986,8 +1003,10 @@
         """, """
             []
             p0 = call_malloc_nursery(%(4*WORD)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 9000, descr=tiddescr)
             p1 = int_add(p0, %(2*WORD)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 9000, descr=tiddescr)
             jump()
         """)
@@ -1068,13 +1087,16 @@
             []
             p0 = call_malloc_nursery(    \
                               %(2 * (bdescr.basesize + 104))d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 101, descr=blendescr)
             p1 = int_add(p0, %(bdescr.basesize + 104)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 8765, descr=tiddescr)
             setfield_gc(p1, 102, descr=blendescr)
             p2 = call_malloc_nursery(    \
                               %(bdescr.basesize + 104)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, 8765, descr=tiddescr)
             setfield_gc(p2, 103, descr=blendescr)
         """)
@@ -1101,6 +1123,7 @@
         """, """
             [p1]
             p0 = call_malloc_nursery(104)      # rounded up
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 9315, descr=tiddescr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
         """)
@@ -1130,11 +1153,13 @@
             p0 = call_malloc_nursery(                                \
                       %(strdescr.basesize + 16 * strdescr.itemsize + \
                         unicodedescr.basesize + 10 * unicodedescr.itemsize)d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, %(strdescr.tid)d, descr=tiddescr)
             setfield_gc(p0, 14, descr=strlendescr)
             setfield_gc(p0, 0, descr=strhashdescr)
 
             p1 = int_add(p0, %(strdescr.basesize + 16 * strdescr.itemsize)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, %(unicodedescr.tid)d, descr=tiddescr)
             setfield_gc(p1, 10, descr=unicodelendescr)
             setfield_gc(p1, 0, descr=unicodehashdescr)
@@ -1162,6 +1187,7 @@
             [i2, p3]
             p1 = call_malloc_nursery(    \
                                 %(cdescr.basesize + 5 * cdescr.itemsize)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 8111, descr=tiddescr)
             setfield_gc(p1, 5, descr=clendescr)
             zero_array(p1, 0, 5, descr=cdescr)
@@ -1190,9 +1216,11 @@
             [i0, f0]
             p0 = call_malloc_nursery(    \
                               %(2 * (bdescr.basesize + 8))d)
+            setfield_gc(p0, 0, descr=stmflagsdescr)
             setfield_gc(p0, 8765, descr=tiddescr)
             setfield_gc(p0, 5, descr=blendescr)
             p1 = int_add(p0, %(bdescr.basesize + 8)d)
+            setfield_gc(p1, 0, descr=stmflagsdescr)
             setfield_gc(p1, 8765, descr=tiddescr)
             setfield_gc(p1, 5, descr=blendescr)
 
@@ -1201,6 +1229,7 @@
 
             p2 = call_malloc_nursery(    \
                               %(bdescr.basesize + 8)d)
+            setfield_gc(p2, 0, descr=stmflagsdescr)
             setfield_gc(p2, 8765, descr=tiddescr)
             setfield_gc(p2, 5, descr=blendescr)
         """, calldescr2=calldescr2)
@@ -1272,6 +1301,7 @@
         [i0, f0]
         i1 = getfield_raw(ConstClass(frame_info), descr=jfi_frame_depth) {54}
         p1 = call_malloc_nursery_varsize_frame(i1) {54}
+        setfield_gc(p1, 0, descr=stmflagsdescr)
         setfield_gc(p1, 0, descr=tiddescr) {54}
         setfield_gc(p1, i1, descr=framelendescr) {54}
         setfield_gc(p1, ConstClass(frame_info), descr=jf_frame_info) {54}
@@ -1315,6 +1345,7 @@
         """, """
         []
         p2 = call_malloc_nursery(%(tdescr.size)d)
+        setfield_gc(p2, 0, descr=stmflagsdescr)
         setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
         i1 = stm_should_break_transaction()
         zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
@@ -1345,6 +1376,7 @@
         """, """
         []
         p2 = call_malloc_nursery(%(tdescr.size)d)
+        setfield_gc(p2, 0, descr=stmflagsdescr)
         setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
         zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
         label()
@@ -1376,6 +1408,7 @@
         """, """
         []
         p2 = call_malloc_nursery(%(tdescr.size)d)
+        setfield_gc(p2, 0, descr=stmflagsdescr)
         setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
         zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
         $INEV
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -2738,6 +2738,10 @@
             assert IS_X86_64
             self.mc.MOV32(mem(self.SEGMENT_GC, eax, rstm.tid_offset),
                           imm(arraydescr.tid))
+            # also zero stm_flags:
+            self.mc.MOV32(mem(self.SEGMENT_GC, eax, rstm.stmflags_offset),
+                          imm(0))
+
         else:
             self.mc.MOV(mem(self.SEGMENT_GC, eax, 0), imm(arraydescr.tid))
         # while we're at it, this line is not needed if we've done the CALL
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -13,7 +13,9 @@
 
 
 TID = rffi.UINT
+STMFLAGS = rffi.UINT
 tid_offset = CFlexSymbolic('offsetof(struct rpyobj_s, tid)')
+stmflags_offset = CFlexSymbolic('offsetof(struct rpyobj_s, lib)')
 stm_nb_segments = CFlexSymbolic('STM_NB_SEGMENTS')
 adr_nursery_free = CFlexSymbolic('((long)&STM_SEGMENT->nursery_current)')
 adr_nursery_top  = CFlexSymbolic('((long)&STM_SEGMENT->nursery_end)')


More information about the pypy-commit mailing list