[pypy-svn] r78750 - in pypy/branch/jit-signals/pypy: jit/codewriter jit/metainterp jit/metainterp/test rlib

arigo at codespeak.net arigo at codespeak.net
Fri Nov 5 16:21:41 CET 2010


Author: arigo
Date: Fri Nov  5 16:21:39 2010
New Revision: 78750

Modified:
   pypy/branch/jit-signals/pypy/jit/codewriter/jtransform.py
   pypy/branch/jit-signals/pypy/jit/metainterp/blackhole.py
   pypy/branch/jit-signals/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/jit-signals/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/jit-signals/pypy/rlib/jit.py
Log:
Implement jit.current_trace_length().  See docstring.


Modified: pypy/branch/jit-signals/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/jit-signals/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/jit-signals/pypy/jit/codewriter/jtransform.py	Fri Nov  5 16:21:39 2010
@@ -873,6 +873,8 @@
         elif oopspec_name == 'jit.assert_green':
             kind = getkind(args[0].concretetype)
             return SpaceOperation('%s_assert_green' % kind, args, None)
+        elif oopspec_name == 'jit.current_trace_length':
+            return SpaceOperation('current_trace_length', [], op.result)
         else:
             raise AssertionError("missing support for %r" % oopspec_name)
 

Modified: pypy/branch/jit-signals/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/jit-signals/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/jit-signals/pypy/jit/metainterp/blackhole.py	Fri Nov  5 16:21:39 2010
@@ -774,6 +774,10 @@
     def bhimpl_float_assert_green(x):
         pass
 
+    @arguments(returns="i")
+    def bhimpl_current_trace_length():
+        return -1
+
     # ----------
     # the main hints and recursive calls
 

Modified: pypy/branch/jit-signals/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/jit-signals/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/jit-signals/pypy/jit/metainterp/pyjitpl.py	Fri Nov  5 16:21:39 2010
@@ -948,6 +948,11 @@
     opimpl_ref_assert_green   = _opimpl_assert_green
     opimpl_float_assert_green = _opimpl_assert_green
 
+    @arguments()
+    def opimpl_current_trace_length(self):
+        trace_length = len(self.metainterp.history.operations)
+        return ConstInt(trace_length)
+
     @arguments("box")
     def opimpl_virtual_ref(self, box):
         # Details on the content of metainterp.virtualref_boxes:

Modified: pypy/branch/jit-signals/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/jit-signals/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/jit-signals/pypy/jit/metainterp/test/test_basic.py	Fri Nov  5 16:21:39 2010
@@ -3,6 +3,7 @@
 from pypy.rlib.jit import JitDriver, we_are_jitted, hint, dont_look_inside
 from pypy.rlib.jit import OPTIMIZER_FULL, OPTIMIZER_SIMPLE, loop_invariant
 from pypy.rlib.jit import jit_debug, assert_green, AssertGreenFailed
+from pypy.rlib.jit import unroll_safe, current_trace_length
 from pypy.jit.metainterp.warmspot import ll_meta_interp, get_stats
 from pypy.jit.backend.llgraph import runner
 from pypy.jit.metainterp import pyjitpl, history
@@ -1672,6 +1673,31 @@
         assert res == 8
         py.test.raises(AssertGreenFailed, self.interp_operations, f, [8, 0])
 
+    def test_current_trace_length(self):
+        myjitdriver = JitDriver(greens = ['g'], reds = ['x'])
+        @dont_look_inside
+        def residual():
+            print "hi there"
+        @unroll_safe
+        def loop(g):
+            y = 0
+            while y < g:
+                residual()
+                y += 1
+        def f(x, g):
+            n = 0
+            while x > 0:
+                myjitdriver.can_enter_jit(x=x, g=g)
+                myjitdriver.jit_merge_point(x=x, g=g)
+                loop(g)
+                x -= 1
+                n = current_trace_length()
+            return n
+        res = self.meta_interp(f, [5, 8])
+        assert 14 < res < 42
+        res = self.meta_interp(f, [5, 2])
+        assert 4 < res < 14
+
 
 class TestOOtype(BasicTests, OOJitMixin):
 

Modified: pypy/branch/jit-signals/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/jit-signals/pypy/rlib/jit.py	(original)
+++ pypy/branch/jit-signals/pypy/rlib/jit.py	Fri Nov  5 16:21:39 2010
@@ -4,6 +4,7 @@
 from pypy.rlib.objectmodel import CDefinedIntSymbolic
 from pypy.rlib.objectmodel import keepalive_until_here
 from pypy.rlib.unroll import unrolling_iterable
+from pypy.rlib.nonconst import NonConstant
 
 def purefunction(func):
     """ Decorate a function as pure. Pure means precisely that:
@@ -145,6 +146,14 @@
         return hop.inputconst(lltype.Signed, _we_are_jitted)
 
 
+def current_trace_length():
+    """During JIT tracing, returns the current trace length (as a constant).
+    If not tracing, returns -1."""
+    if NonConstant(False):
+        return 73
+    return -1
+current_trace_length.oopspec = 'jit.current_trace_length()'
+
 def jit_debug(string, arg1=-sys.maxint-1, arg2=-sys.maxint-1,
                       arg3=-sys.maxint-1, arg4=-sys.maxint-1):
     """When JITted, cause an extra operation DEBUG_MERGE_POINT to appear in



More information about the Pypy-commit mailing list