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

Reply via email to