Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r67491:d5878ec15352
Date: 2013-10-21 14:38 +0200
http://bitbucket.org/pypy/pypy/changeset/d5878ec15352/
Log: make transaction breaks after calls simply check for stm_active==2
in order to break the transaction if it is inevitable
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
@@ -90,7 +90,8 @@
and insert_transaction_break):
# insert transaction_break after GUARD after calls
self.newops.append(
- ResOperation(rop.STM_TRANSACTION_BREAK, [], None))
+ ResOperation(rop.STM_TRANSACTION_BREAK,
+ [ConstInt(0)], None))
insert_transaction_break = False
self.emitting_an_operation_that_can_collect()
self.next_op_may_be_in_new_transaction()
@@ -169,7 +170,8 @@
# ---------- jumps ----------
if op.getopnum() == rop.JUMP:
self.newops.append(
- ResOperation(rop.STM_TRANSACTION_BREAK, [], None))
+ ResOperation(rop.STM_TRANSACTION_BREAK,
+ [ConstInt(1)], None))
# self.emitting_an_operation_that_can_collect()
self.newops.append(op)
continue
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
@@ -82,7 +82,7 @@
[]
%s
call(123, descr=cd)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""" % ("$INEV" if inev else "",), cd=calldescr)
@@ -95,7 +95,7 @@
[p1, p2]
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -111,7 +111,7 @@
p3 = same_as(ConstPtr(t))
cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p2, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""", t=NULL)
@@ -136,7 +136,7 @@
setfield_gc(p2, p0, descr=tzdescr)
cond_call_stm_b(p1, descr=P2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""", t=NULL)
@@ -159,7 +159,7 @@
setfield_gc(p2, p0, descr=tzdescr)
cond_call_stm_b(p1, descr=P2Rdescr)
p5 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -183,7 +183,7 @@
setfield_gc(p2, p0, descr=tzdescr)
cond_call_stm_b(p1, descr=P2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -209,7 +209,7 @@
setfield_gc(p2, p0, descr=tzdescr)
cond_call_stm_b(p1, descr=P2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
"""
for op in ops:
@@ -232,7 +232,7 @@
stm_set_revision_gc(p2, descr=revdescr)
cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -251,7 +251,7 @@
setfield_gc(p3, %(tdescr.tid)d, descr=tiddescr)
stm_set_revision_gc(p3, descr=revdescr)
p4 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -267,7 +267,7 @@
setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
stm_set_revision_gc(p2, descr=revdescr)
setfield_gc(p2, p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -283,7 +283,7 @@
setfield_gc(p1, p2, descr=tzdescr)
cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p4, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -298,7 +298,7 @@
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
setfield_gc(p1, i3, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -316,7 +316,7 @@
label(p1, i3)
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, i3, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p1)
""")
@@ -327,7 +327,7 @@
jump()
""", """
[i1, i2]
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -360,7 +360,7 @@
[p1]
cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -376,7 +376,7 @@
p3 = same_as(ConstPtr(t))
cond_call_stm_b(p3, descr=P2Rdescr)
p2 = getfield_gc(p3, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""", t=NULL)
# XXX could do better: G2Rdescr
@@ -390,7 +390,7 @@
[p1, i2]
cond_call_stm_b(p1, descr=P2Rdescr)
i3 = getarrayitem_gc(p1, i2, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i3)
""")
@@ -403,7 +403,7 @@
[p1, i2]
cond_call_stm_b(p1, descr=P2Rdescr)
i3 = getinteriorfield_gc(p1, i2, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i3)
""")
@@ -418,7 +418,7 @@
cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
i2 = getfield_gc(p1, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2, i2)
""")
@@ -434,7 +434,7 @@
p2 = getfield_gc(p1, descr=tzdescr)
cond_call_stm_b(p2, descr=P2Rdescr)
i2 = getfield_gc(p2, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2, i2)
""")
@@ -454,7 +454,7 @@
i2 = int_add(i1, 1)
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, i2, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p1)
""")
@@ -469,7 +469,7 @@
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 123, descr=tydescr)
p2 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -485,7 +485,7 @@
setfield_gc(p1, %(tdescr.tid)d, descr=tiddescr)
stm_set_revision_gc(p1, descr=revdescr)
p2 = getfield_gc(p1, descr=tzdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""")
@@ -511,7 +511,7 @@
call(p2, descr=calldescr1)
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 5, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p2)
""", calldescr1=calldescr1)
@@ -528,7 +528,7 @@
i3 = getfield_raw(i1, descr=tydescr)
keepalive(i3)
i4 = getfield_raw(i2, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i3, i4)
""")
@@ -544,7 +544,7 @@
""", """
[i1]
i2 = getfield_raw(i1, descr=fdescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i2)
""", fdescr=fdescr)
@@ -562,7 +562,7 @@
label(i1, i2, i3)
$INEV
i4 = getfield_raw(i2, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i3, i4)
""")
@@ -577,7 +577,7 @@
$INEV
i3 = getarrayitem_raw(i1, 5, descr=adescr)
i4 = getarrayitem_raw(i2, i3, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i3, i4)
""")
@@ -593,7 +593,7 @@
setarrayitem_gc(p1, i1, p2, descr=adescr)
cond_call_stm_b(p3, descr=P2Wdescr)
setarrayitem_gc(p3, i3, p4, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -610,7 +610,7 @@
setarrayitem_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setarrayitem_gc(p1, i3, p3, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -627,7 +627,7 @@
setinteriorfield_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setinteriorfield_gc(p1, i3, p3, descr=adescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -642,7 +642,7 @@
cond_call_stm_b(p1, descr=P2Wdescr)
strsetitem(p1, i2, i3)
unicodesetitem(p1, i2, i3)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
py.test.skip("XXX not really right: should instead be an assert "
@@ -664,10 +664,10 @@
setfield_gc(p7, 10, descr=tydescr)
call_release_gil(123, descr=calldescr2)
guard_not_forced() []
- stm_transaction_break()
+ stm_transaction_break(0)
cond_call_stm_b(p7, descr=P2Wdescr)
setfield_gc(p7, 20, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i2, p7)
""", calldescr2=calldescr2)
@@ -695,7 +695,7 @@
%s
cond_call_stm_b(p7, descr=P2Wdescr)
setfield_gc(p7, 20, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i2, p7)
""" % op, calldescr2=calldescr2)
@@ -709,7 +709,7 @@
cond_call_stm_b(p2, descr=P2Wdescr)
cond_call_stm_b(p1, descr=P2Rdescr)
copystrcontent(p1, p2, i1, i2, i3)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -731,7 +731,7 @@
setfield_gc(p1, 10, descr=tydescr)
%s
setfield_gc(p1, 20, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p1)
""" % op)
@@ -748,7 +748,7 @@
("call_loopinvariant(123, descr=calldescr2)", False),
]:
guard = "guard_not_forced() []" if guarded else ""
- tr_break = "stm_transaction_break()" if guarded else ""
+ tr_break = "stm_transaction_break(0)" if guarded else ""
self.check_rewrite("""
[p1]
setfield_gc(p1, 10, descr=tydescr)
@@ -765,7 +765,7 @@
%s
cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 20, descr=tydescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(p1)
""" % (op, guard, tr_break), calldescr2=calldescr2)
@@ -787,7 +787,7 @@
setarrayitem_gc(p1, 1, f0, descr=floatframedescr)
i3 = call_assembler(p1, descr=casmdescr)
guard_not_forced() []
- stm_transaction_break()
+ stm_transaction_break(0)
""")
def test_ptr_eq_null(self):
@@ -798,7 +798,7 @@
""", """
[p1, p2]
i1 = ptr_eq(p1, NULL)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i1)
""")
@@ -810,7 +810,7 @@
""", """
[p1, p2]
i1 = ptr_eq(p1, p2)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i1)
""")
@@ -822,7 +822,7 @@
""", """
[p1, p2]
i1 = instance_ptr_eq(p1, p2)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i1)
""")
@@ -834,7 +834,7 @@
""", """
[p1, p2]
i1 = ptr_ne(p1, p2)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i1)
""")
@@ -846,7 +846,7 @@
""", """
[p1, p2]
i1 = instance_ptr_ne(p1, p2)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i1)
""")
@@ -980,7 +980,7 @@
[i0]
p0 = call_malloc_nursery_varsize(0, 1, i0, descr=bdescr)
setfield_gc(p0, i0, descr=blendescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i0)
""")
@@ -993,7 +993,7 @@
[i0]
p0 = call_malloc_nursery_varsize(1, 1, i0, descr=strdescr)
setfield_gc(p0, i0, descr=strlendescr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i0)
""")
@@ -1017,7 +1017,7 @@
%(nonstd_descr.lendescr.offset)d, \
6464, i0, \
descr=malloc_array_nonstandard_descr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump(i0)
""", nonstd_descr=nonstd_descr)
@@ -1032,7 +1032,7 @@
p0 = call_malloc_gc(ConstClass(malloc_array), 1, \
%(bdescr.tid)d, 103, \
descr=malloc_array_descr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -1072,7 +1072,7 @@
p0 = call_malloc_gc(ConstClass(malloc_array), 1, \
%(bdescr.tid)d, 20000000, \
descr=malloc_array_descr)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""")
@@ -1175,7 +1175,7 @@
call_may_force(123, descr=calldescr2)
guard_not_forced() []
- stm_transaction_break()
+ stm_transaction_break(0)
p2 = call_malloc_nursery( \
%(bdescr.basesize + 8)d)
@@ -1211,7 +1211,7 @@
[]
call_may_force(123, descr=calldescr2)
guard_not_forced() []
- stm_transaction_break()
+ stm_transaction_break(0)
label()
@@ -1220,7 +1220,7 @@
i0 = int_add(1, 2)
- stm_transaction_break()
+ stm_transaction_break(1)
jump()
""", calldescr2=calldescr2)
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
@@ -3065,11 +3065,23 @@
assert self.cpu.gc_ll_descr.stm
if not we_are_translated():
return # tests only
- # "if stm_should_break_transaction()"
+
+ # argument is check_type, 0 being a check for inevitable,
+ # 1 being a check with stm_should_break_transaction()
+ assert isinstance(arglocs[0], ImmedLoc)
+ check_type = arglocs[0].getint()
+
mc = self.mc
- fn = stmtlocal.stm_should_break_transaction_fn
- mc.CALL(imm(self.cpu.cast_ptr_to_int(fn)))
- mc.TEST8(eax.lowest8bits(), eax.lowest8bits())
+ if check_type == 0:
+ # if stm_active == 2
+ nc = self._get_stm_tl(rstm.get_active_adr())
+ self._tl_segment_if_stm(mc)
+ mc.CMP_ji(nc, 2)
+ elif check_type == 1:
+ # "if stm_should_break_transaction()"
+ fn = stmtlocal.stm_should_break_transaction_fn
+ mc.CALL(imm(self.cpu.cast_ptr_to_int(fn)))
+ mc.TEST8(eax.lowest8bits(), eax.lowest8bits())
mc.J_il(rx86.Conditions['Z'], 0xfffff) # patched later
jz_location = mc.get_relative_pos()
#
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1286,9 +1286,11 @@
def consider_stm_transaction_break(self, op):
# XXX use the extra 3 words in the stm resume buffer to save
# up to 3 registers, too. For now we just flush them all.
+ check_type = op.getarg(0)
+ assert isinstance(check_type, ConstInt)
self.xrm.before_call(save_all_regs=1)
self.rm.before_call(save_all_regs=1)
- self.perform(op, [], None)
+ self.perform(op, [self.rm.convert_to_imm(check_type)], None)
def consider_jump(self, op):
assembler = self.assembler
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -510,7 +510,7 @@
'QUASIIMMUT_FIELD/1d', # [objptr], descr=SlowMutateDescr
'RECORD_KNOWN_CLASS/2', # [objptr, clsptr]
'KEEPALIVE/1',
- 'STM_TRANSACTION_BREAK/0',
+ 'STM_TRANSACTION_BREAK/1',
'STM_SET_REVISION_GC/1d', # not really GC, writes raw to the header
'_CANRAISE_FIRST', # ----- start of can_raise operations -----
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit