[pypy-svn] r66843 - in pypy/branch/pyjitpl5/pypy: jit/metainterp jit/metainterp/test rlib

arigo at codespeak.net arigo at codespeak.net
Sat Aug 15 17:05:13 CEST 2009


Author: arigo
Date: Sat Aug 15 17:05:12 2009
New Revision: 66843

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
   pypy/branch/pyjitpl5/pypy/rlib/jit.py
Log:
Support jitdriver.set_param(), encoded as jit_markers by pypy/rlib/jit.py.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py	Sat Aug 15 17:05:12 2009
@@ -747,6 +747,28 @@
                                optimizer=simple_optimize)
         assert res == 42
 
+    def test_set_param(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n', 'x'])
+        def g(n):
+            x = 0
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n, x=x)
+                myjitdriver.jit_merge_point(n=n, x=x)
+                n -= 1
+                x += n
+            return x
+        def f(n, threshold):
+            myjitdriver.set_param('threshold', threshold)
+            return g(n)
+
+        res = self.meta_interp(f, [10, 3])
+        assert res == 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
+        self.check_tree_loop_count(1)
+
+        res = self.meta_interp(f, [10, 13])
+        assert res == 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
+        self.check_tree_loop_count(0)
+
 
 class TestOOtype(BasicTests, OOJitMixin):
 

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	Sat Aug 15 17:05:12 2009
@@ -79,33 +79,33 @@
     return ll_meta_interp(function, args, backendopt=backendopt,
                           translate_support_code=True, **kwds)
 
-def find_can_enter_jit(graphs):
+def _find_jit_marker(graphs, marker_name):
     results = []
     for graph in graphs:
         for block in graph.iterblocks():
             for i in range(len(block.operations)):
                 op = block.operations[i]
                 if (op.opname == 'jit_marker' and
-                    op.args[0].value == 'can_enter_jit'):
+                    op.args[0].value == marker_name):
                     results.append((graph, block, i))
+    return results
+
+def find_can_enter_jit(graphs):
+    results = _find_jit_marker(graphs, 'can_enter_jit')
     if not results:
         raise Exception("no can_enter_jit found!")
     return results
 
 def find_jit_merge_point(graphs):
-    results = []
-    for graph in graphs:
-        for block in graph.iterblocks():
-            for i in range(len(block.operations)):
-                op = block.operations[i]
-                if (op.opname == 'jit_marker' and
-                    op.args[0].value == 'jit_merge_point'):
-                    results.append((graph, block, i))
+    results = _find_jit_marker(graphs, 'jit_merge_point')
     if len(results) != 1:
         raise Exception("found %d jit_merge_points, need exactly one!" %
                         (len(results),))
     return results[0]
 
+def find_set_param(graphs):
+    return _find_jit_marker(graphs, 'set_param')
+
 def get_stats():
     return pyjitpl._warmrunnerdesc.stats
 
@@ -138,11 +138,10 @@
         self.metainterp_sd.generate_bytecode(policy, self.ts)
         self.make_enter_function()
         self.rewrite_can_enter_jit()
+        self.rewrite_set_param()
         self.add_profiler_finish()
         self.metainterp_sd.finish_setup()
-        # hook back for set_param
         self.make_can_inline_graph()
-        self.jitdriver.state = self.state
 
     def finish(self):
         vinfo = self.metainterp_sd.virtualizable_info
@@ -496,6 +495,27 @@
             call_final_function(self.translator, finish_profiler,
                                 annhelper = self.annhelper)
 
+    def rewrite_set_param(self):
+        closures = {}
+        graphs = self.translator.graphs
+        _, PTR_SET_PARAM_FUNCTYPE = self.ts.get_FuncType([lltype.Signed],
+                                                         lltype.Void)
+        def make_closure(fullfuncname):
+            state = self.state
+            def closure(i):
+                getattr(state, fullfuncname)(i)
+            funcptr = self.helper_func(PTR_SET_PARAM_FUNCTYPE, closure)
+            return Constant(funcptr, PTR_SET_PARAM_FUNCTYPE)
+        #
+        for graph, block, i in find_set_param(graphs):
+            op = block.operations[i]
+            assert op.args[1].value == self.jitdriver
+            funcname = op.args[2].value
+            if funcname not in closures:
+                closures[funcname] = make_closure('set_param_' + funcname)
+            op.opname = 'direct_call'
+            op.args[:3] = [closures[funcname]]
+
 
 def decode_hp_hint_args(op):
     # Returns (list-of-green-vars, list-of-red-vars) without Voids.

Modified: pypy/branch/pyjitpl5/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/rlib/jit.py	(original)
+++ pypy/branch/pyjitpl5/pypy/rlib/jit.py	Sat Aug 15 17:05:12 2009
@@ -124,7 +124,6 @@
         # special-cased by ExtRegistryEntry
         # (internal, must receive a constant 'name')
         assert name in PARAMETERS
-        #getattr(self.state, 'set_param_' + name)(value)   -- ignored
 
     def set_param(self, name, value):
         """Set one of the tunable JIT parameter."""



More information about the Pypy-commit mailing list