[pypy-svn] r70988 - in pypy/branch/multijit/pypy: jit/backend/llgraph jit/backend/llsupport jit/backend/x86 jit/metainterp jit/metainterp/test rlib translator/goal

arigo at codespeak.net arigo at codespeak.net
Sat Jan 30 16:56:55 CET 2010


Author: arigo
Date: Sat Jan 30 16:56:54 2010
New Revision: 70988

Modified:
   pypy/branch/multijit/pypy/jit/backend/llgraph/runner.py
   pypy/branch/multijit/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/multijit/pypy/jit/backend/x86/runner.py
   pypy/branch/multijit/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/multijit/pypy/jit/metainterp/test/test_two.py
   pypy/branch/multijit/pypy/jit/metainterp/warmspot.py
   pypy/branch/multijit/pypy/rlib/jit.py
   pypy/branch/multijit/pypy/translator/goal/targetpypystandalone.py
   pypy/branch/multijit/pypy/translator/goal/translate.py
Log:
Small refactorings until test_two passes.


Modified: pypy/branch/multijit/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/multijit/pypy/jit/backend/llgraph/runner.py	Sat Jan 30 16:56:54 2010
@@ -74,14 +74,15 @@
 class BaseCPU(model.AbstractCPU):
     supports_floats = True
 
-    def __init__(self, rtyper, stats=None, opts=None,
+    def __init__(self, rtyper, opts=None,
                  translate_support_code=False,
                  annmixlevel=None, gcdescr=None):
         assert type(opts) is not bool
         model.AbstractCPU.__init__(self)
         self.rtyper = rtyper
+        self.opts = opts
         self.translate_support_code = translate_support_code
-        self.stats = stats or MiniStats()
+        self.stats = MiniStats()
         self.stats.exec_counters = {}
         self.stats.exec_jumps = 0
         self.stats.exec_conditional_jumps = 0

Modified: pypy/branch/multijit/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/multijit/pypy/jit/backend/llsupport/llmodel.py	Sat Jan 30 16:56:54 2010
@@ -17,7 +17,7 @@
 class AbstractLLCPU(AbstractCPU):
     from pypy.jit.metainterp.typesystem import llhelper as ts
 
-    def __init__(self, rtyper, stats, opts, translate_support_code=False,
+    def __init__(self, rtyper, opts, translate_support_code=False,
                  gcdescr=None):
         assert type(opts) is not bool
         self.opts = opts
@@ -25,7 +25,6 @@
         from pypy.jit.backend.llsupport.gc import get_ll_description
         AbstractCPU.__init__(self)
         self.rtyper = rtyper
-        self.stats = stats
         self.translate_support_code = translate_support_code
         if translate_support_code:
             translator = rtyper.annotator.translator

Modified: pypy/branch/multijit/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/multijit/pypy/jit/backend/x86/runner.py	Sat Jan 30 16:56:54 2010
@@ -16,9 +16,9 @@
     BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
     dont_keepalive_stuff = False # for tests
 
-    def __init__(self, rtyper, stats, opts=None, translate_support_code=False,
+    def __init__(self, rtyper, opts=None, translate_support_code=False,
                  gcdescr=None):
-        AbstractLLCPU.__init__(self, rtyper, stats, opts,
+        AbstractLLCPU.__init__(self, rtyper, opts,
                                translate_support_code, gcdescr)
 
     def setup(self):

Modified: pypy/branch/multijit/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/multijit/pypy/jit/metainterp/test/test_basic.py	Sat Jan 30 16:56:54 2010
@@ -646,15 +646,15 @@
             return n + k
 
         from pypy.rpython.test.test_llinterp import get_interpreter, clear_tcache
-        from pypy.jit.metainterp.warmspot import WarmRunnerDesc
+        from pypy.jit.metainterp.warmspot import WarmRunnerDesc, build_cpu
         
         interp, graph = get_interpreter(f, [0, 0], backendopt=False,
                                         inline_threshold=0, type_system=self.type_system)
         clear_tcache()
         translator = interp.typer.annotator.translator
         translator.config.translation.gc = "boehm"
-        warmrunnerdesc = WarmRunnerDesc(translator,
-                                        CPUClass=self.CPUClass)
+        cpu = build_cpu(translator, self.CPUClass)
+        warmrunnerdesc = WarmRunnerDesc(translator, cpu)
         warmrunnerdesc.state.set_param_threshold(3)          # for tests
         warmrunnerdesc.state.set_param_trace_eagerness(0)    # for tests
         warmrunnerdesc.finish()

Modified: pypy/branch/multijit/pypy/jit/metainterp/test/test_two.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/metainterp/test/test_two.py	(original)
+++ pypy/branch/multijit/pypy/jit/metainterp/test/test_two.py	Sat Jan 30 16:56:54 2010
@@ -20,13 +20,13 @@
                 myjitdriver2.can_enter_jit(m=m, x=x)
                 myjitdriver2.jit_merge_point(m=m, x=x)
                 m -= 1
-                x += 7
+                x += 3
             return x
         #
         def main(n, m, x):
             return f1(n) * f2(m, x)
         #
-        res = self.meta_interp(main, [78, 3, 0])
+        res = self.meta_interp(main, [78, 7, 0], num_jit_drivers=2)
         assert res == -2 * 21
 
 

Modified: pypy/branch/multijit/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/multijit/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/multijit/pypy/jit/metainterp/warmspot.py	Sat Jan 30 16:56:54 2010
@@ -19,7 +19,6 @@
 from pypy.jit.metainterp import codewriter
 from pypy.jit.metainterp import support, history, pyjitpl, gc
 from pypy.jit.metainterp.pyjitpl import MetaInterpStaticData, MetaInterp
-from pypy.jit.metainterp.policy import JitPolicy
 from pypy.jit.metainterp.typesystem import LLTypeHelper, OOTypeHelper
 from pypy.jit.metainterp.jitprof import Profiler, EmptyProfiler
 from pypy.rlib.jit import DEBUG_STEPS, DEBUG_DETAILED, DEBUG_OFF, DEBUG_PROFILE
@@ -28,17 +27,17 @@
 # Bootstrapping
 
 def apply_jit(translator, backend_name="auto", debug_level=DEBUG_STEPS,
-              inline=False,
+              inline=False, CPUClass=None,
               **kwds):
-    if 'CPUClass' not in kwds:
+    if CPUClass is None:
         from pypy.jit.backend.detect_cpu import getcpuclass
-        kwds['CPUClass'] = getcpuclass(backend_name)
+        CPUClass = getcpuclass(backend_name)
     if debug_level > DEBUG_OFF:
         ProfilerClass = Profiler
     else:
         ProfilerClass = EmptyProfiler
-    warmrunnerdesc = WarmRunnerDesc(translator,
-                                    translate_support_code=True,
+    cpu = build_cpu(translator, CPUClass, translate_support_code=True)
+    warmrunnerdesc = WarmRunnerDesc(translator, cpu,
                                     listops=True,
                                     no_stats = True,
                                     ProfilerClass = ProfilerClass,
@@ -46,7 +45,10 @@
     warmrunnerdesc.state.set_param_inlining(inline)
     warmrunnerdesc.state.set_param_debug(debug_level)
     warmrunnerdesc.finish()
-    translator.warmrunnerdesc = warmrunnerdesc    # for later debugging
+    # attach it to 'translator' for possible debugging only
+    if not hasattr(translator, 'warmrunnerdescs'):
+        translator.warmrunnerdescs = []
+    translator.warmrunnerdescs.append(warmrunnerdesc)
 
 def ll_meta_interp(function, args, backendopt=False, type_system='lltype',
                    listcomp=False, **kwds):
@@ -61,19 +63,25 @@
     clear_tcache()
     return jittify_and_run(interp, graph, args, backendopt=backendopt, **kwds)
 
-def jittify_and_run(interp, graph, args, repeat=1,
+def jittify_and_run(interp, graph, args, repeat=1, CPUClass=None,
                     backendopt=False, trace_limit=sys.maxint,
-                    debug_level=DEBUG_STEPS, inline=False, **kwds):
+                    debug_level=DEBUG_STEPS, inline=False,
+                    num_jit_drivers=1, **kwds):
     translator = interp.typer.annotator.translator
     translator.config.translation.gc = "boehm"
     translator.config.translation.list_comprehension_operations = True
-    warmrunnerdesc = WarmRunnerDesc(translator, backendopt=backendopt, **kwds)
-    warmrunnerdesc.state.set_param_threshold(3)          # for tests
-    warmrunnerdesc.state.set_param_trace_eagerness(2)    # for tests
-    warmrunnerdesc.state.set_param_trace_limit(trace_limit)
-    warmrunnerdesc.state.set_param_inlining(inline)
-    warmrunnerdesc.state.set_param_debug(debug_level)
-    warmrunnerdesc.finish()
+    jmpps = find_jit_merge_points(translator.graphs)
+    assert len(jmpps) == num_jit_drivers
+    cpu = build_cpu(translator, CPUClass)
+    for jmpp in jmpps:
+        warmrunnerdesc = WarmRunnerDesc(translator, cpu, backendopt=backendopt,
+                                        jit_merge_point_pos=jmpp, **kwds)
+        warmrunnerdesc.state.set_param_threshold(3)          # for tests
+        warmrunnerdesc.state.set_param_trace_eagerness(2)    # for tests
+        warmrunnerdesc.state.set_param_trace_limit(trace_limit)
+        warmrunnerdesc.state.set_param_inlining(inline)
+        warmrunnerdesc.state.set_param_debug(debug_level)
+        warmrunnerdesc.finish()
     res = interp.eval_graph(graph, args)
     if not kwds.get('translate_support_code', False):
         warmrunnerdesc.metainterp_sd.profiler.finish()
@@ -102,18 +110,20 @@
                     results.append((graph, block, i))
     return results
 
-def find_can_enter_jit(graphs):
+def find_can_enter_jit(graphs, jitdriver):
     results = _find_jit_marker(graphs, 'can_enter_jit')
+    results = [(graph, block, index)
+                   for (graph, block, index) in results
+                       if block.operations[index].args[1].value == jitdriver]
     if not results:
         raise Exception("no can_enter_jit found!")
     return results
 
-def find_jit_merge_point(graphs):
+def find_jit_merge_points(graphs):
     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]
+    if not results:
+        raise Exception("jit_merge_point not found!")
+    return results
 
 def find_set_param(graphs):
     return _find_jit_marker(graphs, 'set_param')
@@ -140,27 +150,35 @@
 
 # ____________________________________________________________
 
+def build_cpu(translator, CPUClass, translate_support_code=False, **kwds):
+    opts = history.Options(**kwds)
+    gcdescr = gc.get_description(translator.config)
+    return CPUClass(translator.rtyper, opts, translate_support_code,
+                    gcdescr=gcdescr)
+
+# ____________________________________________________________
+
 class WarmRunnerDesc(object):
 
-    def __init__(self, translator, policy=None, backendopt=True, CPUClass=None,
-                 optimizer=None, **kwds):
+    def __init__(self, translator, cpu, policy=None, backendopt=True,
+                 optimizer=None, jit_merge_point_pos=None, **kwds):
+        self.set_translator(translator, cpu)
         pyjitpl._warmrunnerdesc = self   # this is a global for debugging only!
-        if policy is None:
-            policy = JitPolicy()
-        self.set_translator(translator)
+        self.jit_merge_point_pos = jit_merge_point_pos
         self.find_portal()
         self.make_leave_jit_graph()
         self.codewriter = codewriter.CodeWriter(self.rtyper)
+        policy = policy or self.jitdriver.getpolicy()
         graphs = self.codewriter.find_all_graphs(self.portal_graph,
                                                  self.leave_graph,
                                                  policy,
-                                                 CPUClass.supports_floats)
+                                                 cpu.supports_floats)
         policy.dump_unsafe_loops()
         self.check_access_directly_sanity(graphs)
         if backendopt:
             self.prejit_optimizations(policy, graphs)
 
-        self.build_meta_interp(CPUClass, **kwds)
+        self.build_meta_interp(**kwds)
         self.make_args_specification()
         #
         from pypy.jit.metainterp.virtualref import VirtualRefInfo
@@ -195,14 +213,17 @@
     def _freeze_(self):
         return True
 
-    def set_translator(self, translator):
+    def set_translator(self, translator, cpu):
+        from pypy.jit.backend.model import AbstractCPU
+        assert isinstance(cpu, AbstractCPU)
         self.translator = translator
         self.rtyper = translator.rtyper
-        self.gcdescr = gc.get_description(translator.config)
+        self.cpu = cpu
 
     def find_portal(self):
-        graphs = self.translator.graphs
-        self.jit_merge_point_pos = find_jit_merge_point(graphs)
+        if self.jit_merge_point_pos is None:    # tests only
+            graphs = self.translator.graphs
+            [self.jit_merge_point_pos] = find_jit_merge_points(graphs)
         graph, block, pos = self.jit_merge_point_pos
         op = block.operations[pos]
         args = op.args[2:]
@@ -210,8 +231,8 @@
         self.portal_args_s = [s_binding(v) for v in args]
         graph = copygraph(graph)
         graph.startblock.isstartblock = False
-        graph.startblock = support.split_before_jit_merge_point(
-            *find_jit_merge_point([graph]))
+        [jmpp] = find_jit_merge_points([graph])
+        graph.startblock = support.split_before_jit_merge_point(*jmpp)
         graph.startblock.isstartblock = True
         # a crash in the following checkgraph() means that you forgot
         # to list some variable in greens=[] or reds=[] in JitDriver.
@@ -246,27 +267,21 @@
                               remove_asserts=True,
                               really_remove_asserts=True)
 
-    def build_meta_interp(self, CPUClass, translate_support_code=False,
-                          view="auto", no_stats=False,
+    def build_meta_interp(self, view="auto", no_stats=False,
                           ProfilerClass=EmptyProfiler, **kwds):
-        assert CPUClass is not None
-        opt = history.Options(**kwds)
         if no_stats:
             stats = history.NoStats()
         else:
             stats = history.Stats()
         self.stats = stats 
-        if translate_support_code:
+        if self.cpu.translate_support_code:
             self.annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
             annhelper = self.annhelper
         else:
             annhelper = None
-        cpu = CPUClass(self.translator.rtyper, self.stats, opt,
-                       translate_support_code, gcdescr=self.gcdescr)
-        self.cpu = cpu
         self.metainterp_sd = MetaInterpStaticData(self.portal_graph, # xxx
-                                                  cpu,
-                                                  self.stats, opt,
+                                                  self.cpu,
+                                                  self.stats, self.cpu.opts,
                                                   ProfilerClass=ProfilerClass,
                                                   warmrunnerdesc=self)
 
@@ -450,7 +465,7 @@
         jit_enter_fnptr = self.helper_func(FUNCPTR, self.maybe_enter_jit_fn)
 
         graphs = self.translator.graphs
-        can_enter_jits = find_can_enter_jit(graphs)
+        can_enter_jits = find_can_enter_jit(graphs, self.jitdriver)
         for graph, block, index in can_enter_jits:
             if graph is self.jit_merge_point_pos[0]:
                 continue

Modified: pypy/branch/multijit/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/multijit/pypy/rlib/jit.py	(original)
+++ pypy/branch/multijit/pypy/rlib/jit.py	Sat Jan 30 16:56:54 2010
@@ -218,7 +218,7 @@
     """
 
     virtualizables = []
-    
+
     def __init__(self, greens=None, reds=None, virtualizables=None,
                  get_jitcell_at=None, set_jitcell_at=None,
                  can_inline=None, get_printable_location=None,
@@ -246,6 +246,10 @@
     def _freeze_(self):
         return True
 
+    def getpolicy(self):
+        from pypy.jit.metainterp import policy
+        return policy.JitPolicy()
+
     def jit_merge_point(_self, **livevars):
         # special-cased by ExtRegistryEntry
         assert dict.fromkeys(livevars) == _self._alllivevars

Modified: pypy/branch/multijit/pypy/translator/goal/targetpypystandalone.py
==============================================================================
--- pypy/branch/multijit/pypy/translator/goal/targetpypystandalone.py	(original)
+++ pypy/branch/multijit/pypy/translator/goal/targetpypystandalone.py	Sat Jan 30 16:56:54 2010
@@ -94,6 +94,7 @@
     usage = SUPPRESS_USAGE
 
     take_options = True
+    supports_jit = True
 
     def opt_parser(self, config):
         parser = to_optparse(config, useoptions=["objspace.*"],
@@ -210,10 +211,6 @@
             streamio._setfd_binary = _setfd_binary_dummy
 
         return self.get_entry_point(config)
-
-    def jitpolicy(self, driver):
-        from pypy.module.pypyjit.policy import PyPyJitPolicy
-        return PyPyJitPolicy()
     
     def get_entry_point(self, config):
         space = make_objspace(config)
@@ -228,7 +225,7 @@
 
     def interface(self, ns):
         for name in ['take_options', 'handle_config', 'print_help', 'target',
-                     'jitpolicy',
+                     'supports_jit',
                      'get_additional_config_options']:
             ns[name] = getattr(self, name)
 

Modified: pypy/branch/multijit/pypy/translator/goal/translate.py
==============================================================================
--- pypy/branch/multijit/pypy/translator/goal/translate.py	(original)
+++ pypy/branch/multijit/pypy/translator/goal/translate.py	Sat Jan 30 16:56:54 2010
@@ -259,8 +259,8 @@
                                                        default_goal='compile')
         log_config(translateconfig, "translate.py configuration")
         if config.translation.jit:
-            if 'jitpolicy' not in targetspec_dic:
-                raise Exception('target has no jitpolicy defined.')
+            if not targetspec_dic.get('supportsjit'):
+                raise Exception('target does not define "supportsjit=True".')
             if (translateconfig.goals != ['annotate'] and
                 translateconfig.goals != ['rtype']):
                 drv.set_extra_goals(['pyjitpl'])



More information about the Pypy-commit mailing list