Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r67486:f979ce4ca940
Date: 2013-10-18 13:42 +0200
http://bitbucket.org/pypy/pypy/changeset/f979ce4ca940/
Log: fix little mistake in stmrewrite and make it not emit transaction
breaks in loops (except before JUMP)
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
@@ -43,6 +43,14 @@
}
def rewrite(self, operations):
+ # try to find a loop body:
+ last_label = None
+ in_loop_body = False
+ if operations[-1].getopnum() == rop.JUMP:
+ for op in operations:
+ if op.getopnum() == rop.LABEL:
+ last_label = op
+
# overridden method from parent class
#
insert_transaction_break = False
@@ -93,6 +101,7 @@
ResOperation(rop.STM_TRANSACTION_BREAK, [], None))
insert_transaction_break = False
self.emitting_an_operation_that_can_collect()
+ self.next_op_may_be_in_new_transaction()
else:
assert insert_transaction_break is False
@@ -120,9 +129,12 @@
# ---------- calls ----------
if op.is_call():
self.emitting_an_operation_that_can_collect()
- if (op.getopnum() == rop.CALL_MAY_FORCE or
- op.getopnum() == rop.CALL_ASSEMBLER or
- op.getopnum() == rop.CALL_RELEASE_GIL):
+ self.next_op_may_be_in_new_transaction()
+
+ if (not in_loop_body and (
+ op.getopnum() == rop.CALL_MAY_FORCE or
+ op.getopnum() == rop.CALL_ASSEMBLER or
+ op.getopnum() == rop.CALL_RELEASE_GIL)):
# insert more transaction breaks after function
# calls since they are likely to return as
# inevitable transactions
@@ -157,9 +169,13 @@
# ---------- labels ----------
if op.getopnum() == rop.LABEL:
self.emitting_an_operation_that_can_collect()
+ self.next_op_may_be_in_new_transaction()
+
self.known_lengths.clear()
self.always_inevitable = False
self.newops.append(op)
+ if op is last_label:
+ in_loop_body = True
continue
# ---------- jumps ----------
if op.getopnum() == rop.JUMP:
@@ -188,10 +204,9 @@
assert not insert_transaction_break
return self.newops
- def emitting_an_operation_that_can_collect(self):
- GcRewriterAssembler.emitting_an_operation_that_can_collect(self)
+ def next_op_may_be_in_new_transaction(self):
self.known_category.clear()
-
+
def write_to_read_categories(self):
for v, c in self.known_category.items():
if c == 'W':
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
@@ -227,9 +227,9 @@
[p1, p3]
cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p1, descr=tzdescr)
- p2 = call_malloc_gc(ConstClass(malloc_big_fixedsize), \
- %(tdescr.size)d, %(tdescr.tid)d, \
- descr=malloc_big_fixedsize_descr)
+ p2 = call_malloc_nursery(%(tdescr.size)d)
+ setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
+ stm_set_revision_gc(p2, descr=revdescr)
cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p1, descr=tzdescr)
stm_transaction_break()
@@ -247,9 +247,9 @@
[p1]
cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
- p3 = call_malloc_gc(ConstClass(malloc_big_fixedsize), \
- %(tdescr.size)d, %(tdescr.tid)d, \
- descr=malloc_big_fixedsize_descr)
+ p3 = call_malloc_nursery(%(tdescr.size)d)
+ setfield_gc(p3, %(tdescr.tid)d, descr=tiddescr)
+ stm_set_revision_gc(p3, descr=revdescr)
p4 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break()
jump(p2)
@@ -263,9 +263,9 @@
jump(p2)
""", """
[p1]
- p2 = call_malloc_gc(ConstClass(malloc_big_fixedsize), \
- %(tdescr.size)d, %(tdescr.tid)d, \
- descr=malloc_big_fixedsize_descr)
+ p2 = call_malloc_nursery(%(tdescr.size)d)
+ setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
+ stm_set_revision_gc(p2, descr=revdescr)
setfield_gc(p2, p1, descr=tzdescr)
stm_transaction_break()
jump(p2)
@@ -481,9 +481,9 @@
jump(p2)
""", """
[p0]
- p1 = call_malloc_gc(ConstClass(malloc_big_fixedsize), \
- %(tdescr.size)d, %(tdescr.tid)d, \
- descr=malloc_big_fixedsize_descr)
+ p1 = call_malloc_nursery(%(tdescr.size)d)
+ setfield_gc(p1, %(tdescr.tid)d, descr=tiddescr)
+ stm_set_revision_gc(p1, descr=revdescr)
p2 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break()
jump(p2)
@@ -1183,6 +1183,45 @@
stm_set_revision_gc(p2, descr=revdescr)
setfield_gc(p2, 5, descr=blendescr)
""", calldescr2=calldescr2)
+
+ def test_no_transactionbreak_in_loop_body(self):
+ class fakeextrainfo:
+ def call_needs_inevitable(self):
+ return False
+ T = rffi.CArrayPtr(rffi.TIME_T)
+ calldescr2 = get_call_descr(self.gc_ll_descr, [T], rffi.TIME_T,
+ fakeextrainfo())
+
+ self.check_rewrite("""
+ []
+ call_may_force(123, descr=calldescr2)
+ guard_not_forced() []
+
+ label()
+
+ call_may_force(123, descr=calldescr2)
+ guard_not_forced() []
+
+ i0 = int_add(1, 2)
+
+ jump()
+ """, """
+ []
+ call_may_force(123, descr=calldescr2)
+ guard_not_forced() []
+ stm_transaction_break()
+
+ label()
+
+ call_may_force(123, descr=calldescr2)
+ guard_not_forced() []
+
+ i0 = int_add(1, 2)
+
+ stm_transaction_break()
+ jump()
+ """, calldescr2=calldescr2)
+
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit