[pypy-svn] r67626 - in pypy/trunk/pypy: jit/backend/x86/test jit/metainterp jit/metainterp/test jit/tl jit/tl/tla rlib

pedronis at codespeak.net pedronis at codespeak.net
Thu Sep 10 18:49:16 CEST 2009


Author: pedronis
Date: Thu Sep 10 18:49:15 2009
New Revision: 67626

Added:
   pypy/trunk/pypy/jit/metainterp/test/test_zrpy_set_param.py   (contents, props changed)
Modified:
   pypy/trunk/pypy/jit/backend/x86/test/test_zrpy_gc.py
   pypy/trunk/pypy/jit/metainterp/compile.py
   pypy/trunk/pypy/jit/metainterp/pyjitpl.py
   pypy/trunk/pypy/jit/metainterp/test/test_basic.py
   pypy/trunk/pypy/jit/metainterp/test/test_exception.py
   pypy/trunk/pypy/jit/metainterp/test/test_loop_dummy.py
   pypy/trunk/pypy/jit/metainterp/test/test_recursive.py
   pypy/trunk/pypy/jit/metainterp/test/test_slist.py
   pypy/trunk/pypy/jit/metainterp/test/test_tl.py
   pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py
   pypy/trunk/pypy/jit/metainterp/test/test_warmspot.py
   pypy/trunk/pypy/jit/metainterp/test/test_zrpy_basic.py
   pypy/trunk/pypy/jit/metainterp/warmspot.py
   pypy/trunk/pypy/jit/tl/pypyjit_child.py
   pypy/trunk/pypy/jit/tl/tla/test_tla.py
   pypy/trunk/pypy/rlib/jit.py
Log:
(micke, pedronis) make the optimizer switchable at runtime with

jitdrive.set_param('optimizer', jit.OPTIMIZER_FULL|jit.OPTIMIZER_SIMPLE)

full is the default corresponding to pypy.metainterp.optimize, simpe is simple_optimize



Modified: pypy/trunk/pypy/jit/backend/x86/test/test_zrpy_gc.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/test/test_zrpy_gc.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/test/test_zrpy_gc.py	Thu Sep 10 18:49:15 2009
@@ -9,7 +9,7 @@
 from pypy.rlib import rgc
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi
 from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE
 from pypy.jit.backend.x86.runner import CPU386
 from pypy.jit.backend.llsupport.gc import GcRefList, GcRootMap_asmgcc
 from pypy.jit.backend.x86.regalloc import stack_pos
@@ -58,7 +58,6 @@
     from pypy.annotation.listdef import s_list_of_strings
     from pypy.translator.translator import TranslationContext
     from pypy.jit.metainterp.warmspot import apply_jit
-    from pypy.jit.metainterp import simple_optimize
     from pypy.translator.c import genc
     #
     t = TranslationContext()
@@ -69,7 +68,7 @@
     t.buildannotator().build_types(f, [s_list_of_strings])
     t.buildrtyper().specialize()
     if kwds['jit']:
-        apply_jit(t, CPUClass=CPU386, optimizer=simple_optimize)
+        apply_jit(t, CPUClass=CPU386, optimizer=OPTIMIZER_SIMPLE)
     cbuilder = genc.CStandaloneBuilder(t, f, t.config)
     cbuilder.generate_source()
     cbuilder.compile()

Modified: pypy/trunk/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/compile.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/compile.py	Thu Sep 10 18:49:15 2009
@@ -104,8 +104,8 @@
         loop.operations = history.operations
     loop.operations[-1].jump_target = loop
     metainterp_sd = metainterp.staticdata
-    old_loop = metainterp_sd.optimize_loop(metainterp_sd.options, old_loops,
-                                           loop, metainterp.cpu)
+    old_loop = metainterp_sd.state.optimize_loop(metainterp_sd.options, old_loops,
+                                                 loop, metainterp.cpu)
     if old_loop is not None:
         if we_are_translated() and DEBUG > 0:
             debug_print("reusing old loop")
@@ -374,9 +374,9 @@
     new_loop = create_empty_loop(metainterp)
     new_loop.operations = metainterp.history.operations
     metainterp_sd = metainterp.staticdata
-    target_loop = metainterp_sd.optimize_bridge(metainterp_sd.options,
-                                                old_loops, new_loop,
-                                                metainterp.cpu)
+    target_loop = metainterp_sd.state.optimize_bridge(metainterp_sd.options,
+                                                      old_loops, new_loop,
+                                                      metainterp.cpu)
     # Did it work?  If not, prepare_loop_from_bridge() will probably be used.
     if target_loop is not None:
         # Yes, we managed to create a bridge.  Dispatch to resumekey to

Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py	Thu Sep 10 18:49:15 2009
@@ -1018,7 +1018,7 @@
     virtualizable_info = None
 
     def __init__(self, portal_graph, graphs, cpu, stats, options,
-                 optimizer=None, profile=None, warmrunnerdesc=None,
+                 profile=None, warmrunnerdesc=None,
                  leave_graph=None):
         self.portal_graph = portal_graph
         self.cpu = cpu
@@ -1032,10 +1032,6 @@
         self.opcode_implementations = []
         self.opcode_names = []
         self.opname_to_index = {}
-        if optimizer is None:
-            from pypy.jit.metainterp import optimize as optimizer
-        self.optimize_loop = optimizer.optimize_loop
-        self.optimize_bridge = optimizer.optimize_bridge
 
         if profile is not None:
             self.profiler = profile()
@@ -1046,23 +1042,21 @@
         self.warmrunnerdesc = warmrunnerdesc
         self._op_goto_if_not = self.find_opcode('goto_if_not')
 
-        optmodule = self.optimize_loop.__module__
-        optmodule = optmodule.split('.')[-1]
         backendmodule = self.cpu.__module__
         backendmodule = backendmodule.split('.')[-2]
-        self.jit_starting_line = 'JIT starting (%s, %s)' % (optmodule,
-                                                            backendmodule)
-
+        self.jit_starting_line = 'JIT starting (%s)' % backendmodule
         self.leave_graph = leave_graph
 
     def _freeze_(self):
         return True
 
-    def finish_setup(self):
+    def finish_setup(self, optimizer=None):
         warmrunnerdesc = self.warmrunnerdesc
         if warmrunnerdesc is not None:
             self.num_green_args = warmrunnerdesc.num_green_args
             self.state = warmrunnerdesc.state
+            if optimizer is not None:
+                self.state.set_param_optimizer(optimizer)
         else:
             self.num_green_args = 0
             self.state = None

Modified: pypy/trunk/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_basic.py	Thu Sep 10 18:49:15 2009
@@ -1,6 +1,7 @@
 import py
 import sys
 from pypy.rlib.jit import JitDriver, we_are_jitted, hint, dont_look_inside
+from pypy.rlib.jit import OPTIMIZER_FULL, OPTIMIZER_SIMPLE
 from pypy.jit.metainterp.warmspot import ll_meta_interp, get_stats
 from pypy.jit.backend.llgraph import runner
 from pypy.jit.metainterp import support, codewriter, pyjitpl, history
@@ -12,7 +13,7 @@
 from pypy.rpython.ootypesystem import ootype
 
 def get_metainterp(func, values, CPUClass, type_system, policy,
-                   listops=False, optimizer=None):
+                   listops=False, optimizer=OPTIMIZER_FULL):
     from pypy.annotation.policy import AnnotatorPolicy
     from pypy.annotation.model import lltype_to_annotation
     from pypy.rpython.test.test_llinterp import gengraph
@@ -23,9 +24,8 @@
     cpu = CPUClass(rtyper, stats, False)
     graph = rtyper.annotator.translator.graphs[0]
     opt = history.Options(specialize=False, listops=listops)
-    metainterp_sd = pyjitpl.MetaInterpStaticData(graph, [], cpu, stats, opt,
-                                                 optimizer=optimizer)
-    metainterp_sd.finish_setup()
+    metainterp_sd = pyjitpl.MetaInterpStaticData(graph, [], cpu, stats, opt)
+    metainterp_sd.finish_setup(optimizer=optimizer)
     metainterp = pyjitpl.MetaInterp(metainterp_sd)
     return metainterp, rtyper
 
@@ -74,13 +74,17 @@
             def attach_unoptimized_bridge_from_interp(self, greenkey, newloop):
                 pass
 
+            # pick the optimizer this way
+            optimize_loop = staticmethod(simple_optimize.optimize_loop)
+            optimize_bridge = staticmethod(simple_optimize.optimize_bridge)
+
             trace_limit = sys.maxint
         
         if policy is None:
             policy = JitPolicy()
         metainterp, rtyper = get_metainterp(f, args, self.CPUClass,
                                             self.type_system, policy=policy,
-                                            optimizer=simple_optimize,
+                                            optimizer="bogus",
                                             **kwds)
         cw = codewriter.CodeWriter(metainterp.staticdata, policy)
         graph = rtyper.annotator.translator.graphs[0]
@@ -785,7 +789,6 @@
         self.meta_interp(f, [40, 0])
 
     def test_const_inputargs(self):
-        from pypy.jit.metainterp import simple_optimize
         myjitdriver = JitDriver(greens = ['m'], reds = ['n', 'x'])
         def f(n, x):
             m = 0x7FFFFFFF
@@ -798,7 +801,7 @@
             return x
 
         res = self.meta_interp(f, [50, 1],
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert res == 42
 
     def test_set_param(self):
@@ -832,7 +835,7 @@
         res = self.interp_operations(f, [3, 5])
         assert res == 8
         self.check_history_(int_add=0, call=1)
-
+      
 
 class TestOOtype(BasicTests, OOJitMixin):
 
@@ -886,7 +889,6 @@
 
 
     def test_subclassof(self):
-        from pypy.jit.metainterp import simple_optimize
         A = ootype.Instance("A", ootype.ROOT)
         B = ootype.Instance("B", A)
         clsA = ootype.runtimeClass(A)
@@ -911,12 +913,12 @@
 
         res = self.meta_interp(f, [1, 100],
                                policy=StopAtXPolicy(getcls),
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert not res
         
         res = self.meta_interp(f, [0, 100],
                                policy=StopAtXPolicy(getcls),
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert res
 
 

Modified: pypy/trunk/pypy/jit/metainterp/test/test_exception.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_exception.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_exception.py	Thu Sep 10 18:49:15 2009
@@ -1,9 +1,8 @@
 import py, sys
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE
 from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT, intmask
 from pypy.jit.metainterp.policy import StopAtXPolicy
-from pypy.jit.metainterp import simple_optimize
 
 
 class ExceptionTests:
@@ -447,10 +446,10 @@
                 n += 1
             return m
 
-        res = self.meta_interp(f, [1, 1, 0], optimizer=simple_optimize)
+        res = self.meta_interp(f, [1, 1, 0], optimizer=OPTIMIZER_SIMPLE)
         assert res == f(1, 1, 0)
         res = self.meta_interp(f, [809644098, 16, 0],
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert res == f(809644098, 16, 0)
 
     def test_int_neg_ovf(self):
@@ -471,7 +470,7 @@
             return m
 
         res = self.meta_interp(f, [-sys.maxint-1+100, 0],
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert res == 16
 
     def test_reraise_through_portal(self):
@@ -554,7 +553,7 @@
                 return 8
 
         res = self.meta_interp(main, [41], repeat=7, policy=StopAtXPolicy(x),
-                               optimizer=simple_optimize)
+                               optimizer=OPTIMIZER_SIMPLE)
         assert res == 8
 
 class MyError(Exception):

Modified: pypy/trunk/pypy/jit/metainterp/test/test_loop_dummy.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_loop_dummy.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_loop_dummy.py	Thu Sep 10 18:49:15 2009
@@ -1,12 +1,12 @@
 
 from pypy.jit.metainterp.test import test_loop, test_send
 from pypy.jit.metainterp.warmspot import ll_meta_interp
-from pypy.jit.metainterp import simple_optimize
+from pypy.rlib.jit import OPTIMIZER_SIMPLE
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
 
 class LoopDummyTest(test_loop.LoopTest, test_send.SendTests):
     def meta_interp(self, func, args, **kwds):
-        return ll_meta_interp(func, args, optimizer=simple_optimize,
+        return ll_meta_interp(func, args, optimizer=OPTIMIZER_SIMPLE,
                               CPUClass=self.CPUClass, 
                               type_system=self.type_system,
                               **kwds)

Modified: pypy/trunk/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_recursive.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_recursive.py	Thu Sep 10 18:49:15 2009
@@ -1,7 +1,6 @@
 import py
-from pypy.rlib.jit import JitDriver, we_are_jitted
+from pypy.rlib.jit import JitDriver, we_are_jitted, OPTIMIZER_SIMPLE
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
-from pypy.jit.metainterp import simple_optimize
 from pypy.jit.metainterp.policy import StopAtXPolicy
 from pypy.rpython.annlowlevel import hlstr
 from pypy.jit.metainterp.warmspot import CannotInlineCanEnterJit, get_stats
@@ -23,7 +22,7 @@
                 return f(n+1)
             else:
                 return 1
-        res = self.meta_interp(main, [20], optimizer=simple_optimize)
+        res = self.meta_interp(main, [20], optimizer=OPTIMIZER_SIMPLE)
         assert res == main(20)
 
     def test_simple_recursion_with_exc(self):
@@ -49,7 +48,7 @@
                 return f(n+1)
             else:
                 return 1
-        res = self.meta_interp(main, [20], optimizer=simple_optimize)
+        res = self.meta_interp(main, [20], optimizer=OPTIMIZER_SIMPLE)
         assert res == main(20)
 
     def test_recursion_three_times(self):
@@ -72,7 +71,7 @@
         print
         for i in range(1, 11):
             print '%3d %9d' % (i, f(i))
-        res = self.meta_interp(main, [10], optimizer=simple_optimize)
+        res = self.meta_interp(main, [10], optimizer=OPTIMIZER_SIMPLE)
         assert res == main(10)
         self.check_enter_count_at_most(10)
 
@@ -92,7 +91,7 @@
                 opaque(n, i)
                 i += 1
             return stack.pop()
-        res = self.meta_interp(f, [1], optimizer=simple_optimize, repeat=2,
+        res = self.meta_interp(f, [1], optimizer=OPTIMIZER_SIMPLE, repeat=2,
                                policy=StopAtXPolicy(opaque))
         assert res == 1
 
@@ -144,9 +143,9 @@
         codes = [code, subcode]
         f = self.get_interpreter(codes)
 
-        assert self.meta_interp(f, [0, 0, 0], optimizer=simple_optimize) == 42
+        assert self.meta_interp(f, [0, 0, 0], optimizer=OPTIMIZER_SIMPLE) == 42
         self.check_loops(int_add = 1, call = 1)
-        assert self.meta_interp(f, [0, 0, 0], optimizer=simple_optimize,
+        assert self.meta_interp(f, [0, 0, 0], optimizer=OPTIMIZER_SIMPLE,
                                 inline=True) == 42
         self.check_loops(int_add = 2, call = 0, guard_no_exception = 0)
 
@@ -157,7 +156,7 @@
 
         f = self.get_interpreter(codes)
 
-        assert self.meta_interp(f, [0, 0, 0], optimizer=simple_optimize,
+        assert self.meta_interp(f, [0, 0, 0], optimizer=OPTIMIZER_SIMPLE,
                                 inline=True) == 42
         self.check_loops(call = 1)
 
@@ -169,7 +168,7 @@
         f = self.get_interpreter(codes, always_inline=True)
 
         try:
-            self.meta_interp(f, [0, 0, 0], optimizer=simple_optimize,
+            self.meta_interp(f, [0, 0, 0], optimizer=OPTIMIZER_SIMPLE,
                              inline=True)
         except CannotInlineCanEnterJit:
             pass
@@ -210,7 +209,7 @@
         def main(n):
             return f("c-l", n)
         print main(100)
-        res = self.meta_interp(main, [100], optimizer=simple_optimize, inline=True)
+        res = self.meta_interp(main, [100], optimizer=OPTIMIZER_SIMPLE, inline=True)
         assert res == 0
 
     def test_exception_in_inlined_function(self):
@@ -253,7 +252,7 @@
             return n
         def main(n):
             return f("c-l", n)
-        res = self.meta_interp(main, [100], optimizer=simple_optimize, inline=True)
+        res = self.meta_interp(main, [100], optimizer=OPTIMIZER_SIMPLE, inline=True)
         assert res == main(100)
 
     def test_recurse_during_blackholing(self):
@@ -295,7 +294,7 @@
             myjitdriver.set_param('trace_eagerness', 5)            
             return f("c-l", n)
         expected = main(100)
-        res = self.meta_interp(main, [100], optimizer=simple_optimize, inline=True)
+        res = self.meta_interp(main, [100], optimizer=OPTIMIZER_SIMPLE, inline=True)
         assert res == expected
 
     def check_max_trace_length(self, length):
@@ -321,7 +320,7 @@
                 n -= 1
             return n
         TRACE_LIMIT = 66
-        res = self.meta_interp(loop, [100], optimizer=simple_optimize, inline=True, trace_limit=TRACE_LIMIT)
+        res = self.meta_interp(loop, [100], optimizer=OPTIMIZER_SIMPLE, inline=True, trace_limit=TRACE_LIMIT)
         assert res == 0
         self.check_max_trace_length(TRACE_LIMIT)
         self.check_enter_count(15) # maybe
@@ -345,7 +344,7 @@
                     n = recursive(n)
                 n -= 1
         TRACE_LIMIT = 20
-        res = self.meta_interp(loop, [100], optimizer=simple_optimize, inline=True, trace_limit=TRACE_LIMIT)
+        res = self.meta_interp(loop, [100], optimizer=OPTIMIZER_SIMPLE, inline=True, trace_limit=TRACE_LIMIT)
         self.check_max_trace_length(TRACE_LIMIT)
         self.check_aborted_count(8)
         self.check_enter_count_at_most(30)
@@ -370,10 +369,10 @@
                 myjitdriver.set_param('inlining', False)
             return loop(100)
 
-        res = self.meta_interp(main, [0], optimizer=simple_optimize, trace_limit=TRACE_LIMIT)
+        res = self.meta_interp(main, [0], optimizer=OPTIMIZER_SIMPLE, trace_limit=TRACE_LIMIT)
         self.check_loops(call=1)
 
-        res = self.meta_interp(main, [1], optimizer=simple_optimize, trace_limit=TRACE_LIMIT)
+        res = self.meta_interp(main, [1], optimizer=OPTIMIZER_SIMPLE, trace_limit=TRACE_LIMIT)
         self.check_loops(call=0)
 
     def test_leave_jit_hook(self):
@@ -441,7 +440,7 @@
         def main(n):
             frame = Frame(n)
             return frame.f("C-l")
-        res = self.meta_interp(main, [100], optimizer=simple_optimize, inline=True)
+        res = self.meta_interp(main, [100], optimizer=OPTIMIZER_SIMPLE, inline=True)
         assert res == main(100)
 
 class TestLLtype(RecursiveTests, LLJitMixin):

Modified: pypy/trunk/pypy/jit/metainterp/test/test_slist.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_slist.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_slist.py	Thu Sep 10 18:49:15 2009
@@ -1,7 +1,7 @@
 import py
 from pypy.jit.metainterp.policy import StopAtXPolicy
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE
 
 class ListTests:
 
@@ -61,7 +61,7 @@
                 myjitdriver.jit_merge_point(n=n, lst=lst)
                 n -= 1
             return lst[n]
-        res = self.meta_interp(f, [21], listops=True, optimizer=simple_optimize)
+        res = self.meta_interp(f, [21], listops=True, optimizer=OPTIMIZER_SIMPLE)
         assert res == 0
 
     def test_getitem(self):

Modified: pypy/trunk/pypy/jit/metainterp/test/test_tl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_tl.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_tl.py	Thu Sep 10 18:49:15 2009
@@ -1,5 +1,5 @@
 import py
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE
 from pypy.jit.metainterp.policy import StopAtXPolicy
 from pypy.jit.metainterp.test.test_basic import OOJitMixin, LLJitMixin
 
@@ -144,7 +144,7 @@
         def main(num, arg):
             return interp(codes[num], inputarg=arg)
         
-        res = self.meta_interp(main, [0, 20], optimizer=simple_optimize,
+        res = self.meta_interp(main, [0, 20], optimizer=OPTIMIZER_SIMPLE,
                                listops=listops, backendopt=True, policy=policy)
         assert res == 0
 

Modified: pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py	Thu Sep 10 18:49:15 2009
@@ -4,12 +4,13 @@
 from pypy.rpython.annlowlevel import llhelper
 from pypy.jit.metainterp.policy import StopAtXPolicy
 from pypy.rlib.jit import JitDriver, hint, dont_look_inside
+from pypy.rlib.jit import OPTIMIZER_SIMPLE, OPTIMIZER_FULL
 from pypy.rlib.rarithmetic import intmask
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
 from pypy.rpython.lltypesystem.rvirtualizable2 import VABLERTIPTR
 from pypy.rpython.rclass import FieldListAccessor
 from pypy.jit.metainterp.warmspot import get_stats, get_translator
-from pypy.jit.metainterp import history, heaptracker, simple_optimize
+from pypy.jit.metainterp import history, heaptracker
 from pypy.jit.metainterp.test.test_optimizefindnode import LLtypeMixin
 
 def promote_virtualizable(*args):
@@ -437,7 +438,7 @@
             promote_virtualizable(xy2, 'inst_l2')                
             return xy2.inst_l2[0]
         expected = f(20)
-        res = self.meta_interp(f, [20], optimizer=simple_optimize)
+        res = self.meta_interp(f, [20], optimizer=OPTIMIZER_SIMPLE)
         assert res == expected
         self.check_loops(getfield_gc=3, setfield_gc=0,
                          arraylen_gc=1, getarrayitem_gc=1, setarrayitem_gc=1)
@@ -1021,9 +1022,8 @@
             frame = Frame(n)
             return f("c-l", frame)
         print main(100)
-        from pypy.jit.metainterp import optimize
-        res = self.meta_interp(main, [100],
-                inline=True, optimizer=optimize)
+        res = self.meta_interp(main, [100], inline=True,
+                                            optimizer=OPTIMIZER_FULL)
 
 class TestOOtype(#ExplicitVirtualizableTests,
                  ImplicitVirtualizableTests,

Modified: pypy/trunk/pypy/jit/metainterp/test/test_warmspot.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_warmspot.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_warmspot.py	Thu Sep 10 18:49:15 2009
@@ -1,8 +1,10 @@
 from pypy.jit.metainterp.warmspot import ll_meta_interp, cast_whatever_to_int
 from pypy.jit.metainterp.warmspot import get_stats
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_FULL, OPTIMIZER_SIMPLE
 from pypy.jit.backend.llgraph import runner
 
+from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
+
 
 def test_translate_cast_whatever_to_int():
     from pypy.rpython.test.test_llinterp import interpret
@@ -19,12 +21,6 @@
 
 
 class WarmspotTests(object):
-    def meta_interp(self, *args, **kwds):
-        assert 'CPUClass' not in kwds
-        assert 'type_system' not in kwds
-        kwds['CPUClass'] = self.CPUClass
-        kwds['type_system'] = self.type_system
-        return ll_meta_interp(*args, **kwds)
     
     def test_basic(self):
         mydriver = JitDriver(reds=['a'],
@@ -105,11 +101,62 @@
         for loc in get_stats().locations:
             assert loc == 'GREEN IS 123.'
 
+    def test_set_param_optimizer(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n'])
+        class A(object):
+            def m(self, n):
+                return n-1
+            
+        def g(n):
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n)
+                myjitdriver.jit_merge_point(n=n)
+                n = A().m(n)
+            return n
+        def f(n, optimizer):
+            myjitdriver.set_param('optimizer', optimizer)
+            return g(n)
+
+        # check that the set_param will override the default
+        res = self.meta_interp(f, [10, OPTIMIZER_SIMPLE],
+                               optimizer=OPTIMIZER_FULL)
+        assert res == 0
+        self.check_loops(new_with_vtable=1)
+
+        res = self.meta_interp(f, [10, OPTIMIZER_FULL],
+                               optimizer=OPTIMIZER_SIMPLE)
+        assert res == 0
+        self.check_loops(new_with_vtable=0)
+
+    def test_optimizer_default_choice(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n'])
+        def f(n):
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n)
+                myjitdriver.jit_merge_point(n=n)
+                n -= 1
+            return n
+
+        from pypy.rpython.test.test_llinterp import gengraph
+        t, rtyper, graph = gengraph(f, [int], type_system=self.type_system,
+                                    **{'translation.gc': 'boehm'})
+        
+        from pypy.jit.metainterp.warmspot import WarmRunnerDesc
+
+        warmrunnerdescr = WarmRunnerDesc(t, CPUClass=self.CPUClass,
+                                         optimizer=None) # pick default
+
+        from pypy.jit.metainterp import optimize
+
+        assert warmrunnerdescr.state.optimize_loop is optimize.optimize_loop
+        assert warmrunnerdescr.state.optimize_bridge is optimize.optimize_bridge
+
+
 
-class TestLLWarmspot(WarmspotTests):
+class TestLLWarmspot(WarmspotTests, LLJitMixin):
     CPUClass = runner.LLtypeCPU
     type_system = 'lltype'
 
-class TestOOWarmspot(WarmspotTests):
+class TestOOWarmspot(WarmspotTests, OOJitMixin):
     CPUClass = runner.OOtypeCPU
     type_system = 'ootype'

Modified: pypy/trunk/pypy/jit/metainterp/test/test_zrpy_basic.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_zrpy_basic.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_zrpy_basic.py	Thu Sep 10 18:49:15 2009
@@ -2,7 +2,7 @@
 from pypy.jit.metainterp.warmspot import rpython_ll_meta_interp, ll_meta_interp
 from pypy.jit.metainterp.test import test_basic
 from pypy.jit.backend.llgraph import runner
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, OPTIMIZER_FULL
 from pypy.jit.conftest import option
 
 
@@ -49,7 +49,7 @@
         from pypy.jit.metainterp import optimize
         res = rpython_ll_meta_interp(f, [17], loops=2, CPUClass=self.CPUClass,
                                      type_system=self.type_system,
-                                     optimizer=optimize)
+                                     optimizer=OPTIMIZER_FULL)
         assert res == (17+14+11+8+7+6+5+4) * 10
 
 

Added: pypy/trunk/pypy/jit/metainterp/test/test_zrpy_set_param.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/metainterp/test/test_zrpy_set_param.py	Thu Sep 10 18:49:15 2009
@@ -0,0 +1,10 @@
+import py, sys
+from pypy.jit.metainterp.test import test_warmspot, test_basic
+from pypy.jit.metainterp.test.test_zrpy_basic import LLInterpJitMixin
+
+
+class TestLLSetParam(LLInterpJitMixin):
+
+    test_set_param = test_basic.BasicTests.test_set_param.im_func
+
+    test_set_param_optimizer = test_warmspot.WarmspotTests.test_set_param_optimizer.im_func

Modified: pypy/trunk/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/warmspot.py	Thu Sep 10 18:49:15 2009
@@ -10,7 +10,7 @@
 from pypy.objspace.flow.model import checkgraph, Link, copygraph
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.unroll import unrolling_iterable
-from pypy.rlib.jit import PARAMETERS
+from pypy.rlib.jit import PARAMETERS, OPTIMIZER_SIMPLE, OPTIMIZER_FULL
 from pypy.rlib.rarithmetic import r_uint, intmask
 from pypy.rlib.debug import debug_print
 from pypy.rpython.lltypesystem.lloperation import llop
@@ -135,7 +135,7 @@
 class WarmRunnerDesc:
 
     def __init__(self, translator, policy=None, backendopt=True, CPUClass=None,
-                 **kwds):
+                 optimizer=None, **kwds):
         pyjitpl._warmrunnerdesc = self   # this is a global for debugging only!
         if policy is None:
             policy = JitPolicy()
@@ -160,7 +160,7 @@
         self.rewrite_can_enter_jit()
         self.rewrite_set_param()
         self.add_profiler_finish()
-        self.metainterp_sd.finish_setup()
+        self.metainterp_sd.finish_setup(optimizer=optimizer)
 
     def finish(self):
         vinfo = self.metainterp_sd.virtualizable_info
@@ -217,7 +217,7 @@
                               really_remove_asserts=True)
 
     def build_meta_interp(self, CPUClass, translate_support_code=False,
-                          view="auto", optimizer=None, profile=None, **kwds):
+                          view="auto", profile=None, **kwds):
         assert CPUClass is not None
         opt = history.Options(**kwds)
         self.stats = history.Stats()
@@ -232,7 +232,6 @@
         self.metainterp_sd = MetaInterpStaticData(self.portal_graph,
                                                   self.translator.graphs, cpu,
                                                   self.stats, opt,
-                                                  optimizer=optimizer,
                                                   profile=profile,
                                                   warmrunnerdesc=self,
                                                   leave_graph=self.leave_graph)
@@ -772,6 +771,18 @@
             # invariant: (self.mccounters[j] < 0) if and only if
             #            (self.mcentrypoints[j] is not None)
 
+        def set_param_optimizer(self, optimizer):
+            if optimizer == OPTIMIZER_SIMPLE:
+                from pypy.jit.metainterp import simple_optimize
+                self.optimize_loop = simple_optimize.optimize_loop
+                self.optimize_bridge = simple_optimize.optimize_bridge
+            elif optimizer == OPTIMIZER_FULL:
+                from pypy.jit.metainterp import optimize
+                self.optimize_loop = optimize.optimize_loop
+                self.optimize_bridge = optimize.optimize_bridge                
+            else:
+                raise ValueError("unknown optimizer")
+
         def create_tables_now(self):
             count = 1 << self.hashbits
             self.hashtablemask = count - 1

Modified: pypy/trunk/pypy/jit/tl/pypyjit_child.py
==============================================================================
--- pypy/trunk/pypy/jit/tl/pypyjit_child.py	(original)
+++ pypy/trunk/pypy/jit/tl/pypyjit_child.py	Thu Sep 10 18:49:15 2009
@@ -1,9 +1,6 @@
 from pypy.conftest import option
 from pypy.rpython.lltypesystem import lltype
 from pypy.jit.metainterp import warmspot
-#from pypy.jit.metainterp import simple_optimize as optimize
-from pypy.jit.metainterp import optimize
-#from pypy.jit.metainterp import optimize2 as optimize
 from pypy.module.pypyjit.policy import PyPyJitPolicy
 
 # Current output: http://paste.pocoo.org/show/106540/
@@ -43,8 +40,7 @@
     option.view = True
     warmspot.jittify_and_run(interp, graph, [], policy=policy,
                              listops=True, CPUClass=LLtypeCPU,
-                             backendopt=True,
-                             optimizer=optimize)
+                             backendopt=True)
 
 
 def run_child_ootype(glob, loc):
@@ -58,5 +54,4 @@
     option.view = True
     warmspot.jittify_and_run(interp, graph, [], policy=policy,
                              listops=True, CPUClass=OOtypeCPU,
-                             backendopt=True,
-                             optimizer=optimize)
+                             backendopt=True)

Modified: pypy/trunk/pypy/jit/tl/tla/test_tla.py
==============================================================================
--- pypy/trunk/pypy/jit/tl/tla/test_tla.py	(original)
+++ pypy/trunk/pypy/jit/tl/tla/test_tla.py	Thu Sep 10 18:49:15 2009
@@ -156,7 +156,7 @@
 # ____________________________________________________________ 
 
 from pypy.jit.metainterp.test.test_basic import LLJitMixin
-from pypy.jit.metainterp import optimize
+from pypy.rlib.jit import OPTIMIZER_FULL
 
 class TestLLtype(LLJitMixin):
     def test_loop(self):
@@ -172,5 +172,5 @@
             assert isinstance(w_result, tla.W_IntObject)
             return w_result.intvalue
         res = self.meta_interp(interp_w, [42], listops=True,
-                               optimizer=optimize)
+                               optimizer=OPTIMIZER_FULL)
         assert res == 0

Modified: pypy/trunk/pypy/rlib/jit.py
==============================================================================
--- pypy/trunk/pypy/rlib/jit.py	(original)
+++ pypy/trunk/pypy/rlib/jit.py	Thu Sep 10 18:49:15 2009
@@ -80,11 +80,15 @@
 class JitHintError(Exception):
     """Inconsistency in the JIT hints."""
 
+OPTIMIZER_SIMPLE = 0
+OPTIMIZER_FULL = 1
+
 PARAMETERS = {'threshold': 1000,
               'trace_eagerness': 200,
               'hash_bits': 14,
               'trace_limit': 10000,
               'inlining': False,
+              'optimizer': OPTIMIZER_FULL,
               }
 unroll_parameters = unrolling_iterable(PARAMETERS.keys())
 



More information about the Pypy-commit mailing list