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

Reply via email to