[pypy-commit] pypy stmgc-c7: The point of the 'stm_set_location' operation.

arigo noreply at buildbot.pypy.org
Sun Apr 20 13:48:04 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r70802:25d8b67514fd
Date: 2014-04-20 13:47 +0200
http://bitbucket.org/pypy/pypy/changeset/25d8b67514fd/

Log:	The point of the 'stm_set_location' operation.

diff --git a/rpython/jit/metainterp/optimizeopt/stm.py b/rpython/jit/metainterp/optimizeopt/stm.py
--- a/rpython/jit/metainterp/optimizeopt/stm.py
+++ b/rpython/jit/metainterp/optimizeopt/stm.py
@@ -95,6 +95,12 @@
             self.optimizer.stm_location = (num, ref)
         self.emit_operation(op)
 
+    def optimize_STM_SET_LOCATION(self, op):
+        num = op.getarg(0).getint()
+        ref = op.getarg(1).getref_base()
+        self.optimizer.stm_location = (num, ref)
+        self.emit_operation(op)
+
 
 dispatch_opt = make_dispatcher_method(OptSTM, 'optimize_',
                                       default=OptSTM.default_emit)
diff --git a/rpython/jit/metainterp/test/test_stm.py b/rpython/jit/metainterp/test/test_stm.py
--- a/rpython/jit/metainterp/test/test_stm.py
+++ b/rpython/jit/metainterp/test/test_stm.py
@@ -122,6 +122,43 @@
         [op] = seen
         assert op.getarg(0).getint() == -42
 
+    def test_stm_report_location_2(self):
+        myjitdriver = JitDriver(greens = ['a', 'r'], reds = ['x', 'res', 'n'],
+                                stm_report_location = [0, 1])
+        class Code(object):
+            pass
+        def g(a, r, x, n):
+            res = 0
+            while x > 0:
+                myjitdriver.jit_merge_point(a=a, r=r, x=x, res=res, n=n)
+                res += x
+                x -= 1
+                a = -a
+            if n & 1:
+                pass   # sub-bridge of this bridge
+            return res
+        def main(a, x):
+            r = Code()
+            res = -1
+            n = 7
+            while n > 0:
+                res = g(a, r, x, n)
+                n -= 1
+            return res
+        res = self.meta_interp(main, [42, 10], translationoptions={"stm":True})
+        assert res == 55
+        self.check_resops(debug_merge_point=6)
+        #
+        from rpython.jit.metainterp.warmspot import get_stats
+        seen = []
+        for loop in get_stats().get_all_loops():
+            for op in loop._all_operations():
+                if op.getopname() == "stm_set_location":
+                    seen.append(op)
+        [op1, op2] = seen
+        assert op1.getarg(0).getint() == -42
+        assert op2.getarg(0).getint() == -42
+
 
 class TestLLtype(STMTests, LLJitMixin):
     pass


More information about the pypy-commit mailing list