[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