[pypy-commit] pypy stm-jit: in-progress

arigo noreply at buildbot.pypy.org
Wed Aug 8 15:33:37 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: stm-jit
Changeset: r56655:219d5fb056be
Date: 2012-08-08 15:33 +0200
http://bitbucket.org/pypy/pypy/changeset/219d5fb056be/

Log:	in-progress

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -441,10 +441,10 @@
             def setcontext(iself, context):
                 iself.context = context
 
-            def nextleft(iself, gc, range_lowest, prev):
+            def nextleft(iself, gc, prev):
                 # Return the next valid GC object's address, in right-to-left
                 # order from the shadowstack array.  This usually means just
-                # returning "prev - sizeofaddr", until we reach "range_lowest",
+                # returning "prev - sizeofaddr", until we stop being called,
                 # except that we are skipping NULLs.  If "prev - sizeofaddr"
                 # contains a MARKER_FRAME instead, then we go into
                 # JIT-frame-lookup mode.
@@ -456,14 +456,12 @@
                         #
                         # Look for the next shadowstack address that
                         # contains a valid pointer
-                        while prev != range_lowest:
+                        while True:
                             prev -= llmemory.sizeof(llmemory.Address)
                             if prev.signed[0] == self.MARKER_FRAME:
                                 break
                             if gc.points_to_valid_gc_object(prev):
                                 return prev
-                        else:
-                            return llmemory.NULL     # done
                         #
                         # It's a JIT frame.  Save away 'prev' for later, and
                         # go into JIT-frame-exploring mode.
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -132,7 +132,11 @@
                 prev_interpreter = LLInterpreter.current_interpreter
                 LLInterpreter.current_interpreter = self.debug_ll_interpreter
             try:
-                fail_index = func(*args)
+                if not self.gc_ll_descr.stm:
+                    fail_index = func(*args)
+                else:
+                    fail_index = llop.stm_jit_invoke_code(lltype.Signed,
+                                                          func, *args)
             finally:
                 if not self.translate_support_code:
                     LLInterpreter.current_interpreter = prev_interpreter
diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py
--- a/pypy/rpython/lltypesystem/lloperation.py
+++ b/pypy/rpython/lltypesystem/lloperation.py
@@ -413,6 +413,8 @@
     'gc_store':               LLOp(),                    # so far, only if stm
     'stm_gc_load':            LLOp(sideeffects=False),
 
+    'stm_jit_invoke_code':    LLOp(canmallocgc=True),
+
     # __________ address operations __________
 
     'boehm_malloc':         LLOp(),
diff --git a/pypy/rpython/memory/gc/stmgc.py b/pypy/rpython/memory/gc/stmgc.py
--- a/pypy/rpython/memory/gc/stmgc.py
+++ b/pypy/rpython/memory/gc/stmgc.py
@@ -423,6 +423,7 @@
             stm_operations.tldict_add(obj, localobj)
             #
             return localobj
+        self._stm_write_barrier_global = _stm_write_barrier_global
         #
         def stm_normalize_global(obj):
             """Normalize a pointer for the purpose of equality
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -224,6 +224,7 @@
             if inline:
                 self.graphs_to_inline[graph] = True
             return annhelper.graph2const(graph)
+        self._getfn = getfn
 
         self.frameworkgc_setup_ptr = getfn(frameworkgc_setup, [],
                                            annmodel.s_None)
@@ -905,6 +906,8 @@
 
     def gct_get_write_barrier_failing_case(self, hop):
         op = hop.spaceop
+        assert (lltype.typeOf(self.write_barrier_failing_case_ptr.value) ==
+                op.result.concretetype)
         hop.genop("same_as",
                   [self.write_barrier_failing_case_ptr],
                   resultvar=op.result)
diff --git a/pypy/rpython/memory/gctransform/stmframework.py b/pypy/rpython/memory/gctransform/stmframework.py
--- a/pypy/rpython/memory/gctransform/stmframework.py
+++ b/pypy/rpython/memory/gctransform/stmframework.py
@@ -34,6 +34,9 @@
         self.stm_normalize_global_ptr = getfn(
             self.gcdata.gc.stm_normalize_global,
             [annmodel.SomeAddress()], annmodel.SomeAddress())
+        self.write_barrier_failing_case_ptr = getfn(
+            self.gcdata.gc._stm_write_barrier_global,
+            [annmodel.SomeAddress()], annmodel.SomeAddress())
 
     def build_root_walker(self):
         return StmShadowStackRootWalker(self)
diff --git a/pypy/translator/stm/transform.py b/pypy/translator/stm/transform.py
--- a/pypy/translator/stm/transform.py
+++ b/pypy/translator/stm/transform.py
@@ -301,6 +301,8 @@
     if op.opname == 'setinteriorfield':
         OUTER = op.args[0].concretetype.TO
         return OUTER._immutable_interiorfield(unwraplist(op.args[1:-1]))
+    if op.opname in ('gc_load', 'gc_store'):
+        return False
     raise AssertionError(op)
 
 def pre_insert_stm_writebarrier(graph):
@@ -337,13 +339,13 @@
                 if gcsource.is_gc(op.result) and gcsource.is_gc(op.args[0]):
                     copies[op.result] = op
             elif (op.opname in ('getfield', 'getarrayitem',
-                                'getinteriorfield') and
+                                'getinteriorfield', 'gc_load') and
                   op.result.concretetype is not lltype.Void and
                   op.args[0].concretetype.TO._gckind == 'gc' and
                   not is_immutable(op)):
                 wants_a_writebarrier.setdefault(op, False)
             elif (op.opname in ('setfield', 'setarrayitem',
-                                'setinteriorfield') and
+                                'setinteriorfield', 'gc_store') and
                   op.args[-1].concretetype is not lltype.Void and
                   op.args[0].concretetype.TO._gckind == 'gc' and
                   not is_immutable(op)):


More information about the pypy-commit mailing list