[pypy-svn] r66988 - in pypy/branch/pyjitpl5/pypy: jit/metainterp jit/metainterp/test translator translator/goal translator/test

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Aug 19 17:58:31 CEST 2009


Author: cfbolz
Date: Wed Aug 19 17:58:30 2009
New Revision: 66988

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/policy.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_policy.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
   pypy/branch/pyjitpl5/pypy/translator/driver.py
   pypy/branch/pyjitpl5/pypy/translator/goal/translate.py
   pypy/branch/pyjitpl5/pypy/translator/test/test_driver.py
Log:
(mikke, cfbolz): remove the prejitbackendopt driver phase and give warmspot the
responsibility of doing backendopts before code writing. This makes it possible
to sanely enable inlining before code writing because the inlining is restricted
to those graphs that the policy would look into.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/policy.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/policy.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/policy.py	Wed Aug 19 17:58:30 2009
@@ -73,10 +73,6 @@
             return 'residual'
         return 'regular'
 
-    def all_graphs(self, translator):
-        return [graph for graph in translator.graphs
-                if self.look_inside_graph(graph)]
-
 def contains_unsupported_variable_type(graph):
     getkind = history.getkind
     try:

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	Wed Aug 19 17:58:30 2009
@@ -53,6 +53,8 @@
     def meta_interp(self, *args, **kwds):
         kwds['CPUClass'] = self.CPUClass
         kwds['type_system'] = self.type_system
+        if "backendopt" not in kwds:
+            kwds["backendopt"] = False
         return ll_meta_interp(*args, **kwds)
 
     def interp_operations(self, f, args, policy=None, **kwds):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_policy.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_policy.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_policy.py	Wed Aug 19 17:58:30 2009
@@ -1,8 +1,10 @@
-from pypy.jit.metainterp import policy, support
+from pypy.jit.metainterp import policy, support, warmspot
 from pypy.rlib.jit import purefunction, dont_look_inside
 
-def test_all_graphs():
+def test_find_all_graphs():
     def f(x):
+        if x < 0:
+            return f(-x)
         return x + 1
     @purefunction
     def g(x):
@@ -16,9 +18,21 @@
     rtyper = support.annotate(i, [7])
 
     jitpolicy = policy.JitPolicy()
-    res = jitpolicy.all_graphs(rtyper.annotator.translator)
+    translator = rtyper.annotator.translator
+    res = warmspot.find_all_graphs(translator.graphs[0], jitpolicy, translator)
 
     funcs = [graph.func for graph in res]
-    assert funcs[:2] == [i, f]
-    assert g not in funcs
-    assert h not in funcs
+    assert funcs == [i, f]
+
+def test_find_all_graphs_str_join():
+    def i(x, y):
+        return "hello".join([str(x), str(y), "bye"])
+
+    rtyper = support.annotate(i, [7, 100])
+
+    jitpolicy = policy.JitPolicy()
+    translator = rtyper.annotator.translator
+    res = warmspot.find_all_graphs(translator.graphs[0], jitpolicy, translator)
+
+    funcs = [graph.func for graph in res]
+    assert funcs[:1] == [i]

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	Wed Aug 19 17:58:30 2009
@@ -51,12 +51,13 @@
                                     type_system=type_system,
                                     inline_threshold=0)
     clear_tcache()
-    return jittify_and_run(interp, graph, args, **kwds)
+    return jittify_and_run(interp, graph, args, backendopt=backendopt, **kwds)
 
-def jittify_and_run(interp, graph, args, repeat=1, hash_bits=None, **kwds):
+def jittify_and_run(interp, graph, args, repeat=1, hash_bits=None, backendopt=False,
+                    **kwds):
     translator = interp.typer.annotator.translator
     translator.config.translation.gc = "boehm"
-    warmrunnerdesc = WarmRunnerDesc(translator, **kwds)
+    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.create_tables_now()             # for tests
@@ -124,11 +125,15 @@
 
 class WarmRunnerDesc:
 
-    def __init__(self, translator, policy=None, **kwds):
+    def __init__(self, translator, policy=None, backendopt=True, **kwds):
         pyjitpl._warmrunnerdesc = self   # this is a global for debugging only!
         if policy is None:
             policy = JitPolicy()
         self.set_translator(translator)
+        self.find_portal()
+        if backendopt:
+            self.prejit_optimizations(policy)
+
         self.build_meta_interp(**kwds)
         self.make_args_specification()
         self.rewrite_jit_merge_point()
@@ -162,20 +167,7 @@
             self.ts = OOTypeHelper()
         self.gcdescr = gc.get_description(translator.config)
 
-    def build_meta_interp(self, CPUClass=None, view="auto",
-                          translate_support_code=False, optimizer=None,
-                          profile=None, **kwds):
-        assert CPUClass is not None
-        opt = history.Options(**kwds)
-        self.stats = history.Stats()
-        if translate_support_code:
-            self.annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
-            annhelper = self.annhelper
-        else:
-            annhelper = None
-        cpu = CPUClass(self.translator.rtyper, self.stats,
-                       translate_support_code, annhelper, self.gcdescr)
-        self.cpu = cpu
+    def find_portal(self):
         graphs = self.translator.graphs
         self.jit_merge_point_pos = find_jit_merge_point(graphs)
         graph, block, pos = self.jit_merge_point_pos
@@ -193,7 +185,33 @@
         self.translator.graphs.append(graph)
         self.portal_graph = graph
         self.jitdriver = block.operations[pos].args[1].value
-        self.metainterp_sd = MetaInterpStaticData(graph, graphs, cpu,
+
+    def prejit_optimizations(self, policy):
+        from pypy.translator.backendopt.all import backend_optimizations
+        graphs = find_all_graphs(self.portal_graph, policy, self.translator)
+        backend_optimizations(self.translator,
+                              graphs=graphs,
+                              merge_if_blocks=True,
+                              constfold=True,
+                              raisingop2direct_call=False,
+                              remove_asserts=True,
+                              really_remove_asserts=True)
+
+    def build_meta_interp(self, CPUClass=None, translate_support_code=False,
+                          view="auto", optimizer=None, profile=None, **kwds):
+        assert CPUClass is not None
+        opt = history.Options(**kwds)
+        self.stats = history.Stats()
+        if translate_support_code:
+            self.annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
+            annhelper = self.annhelper
+        else:
+            annhelper = None
+        cpu = CPUClass(self.translator.rtyper, self.stats,
+                       translate_support_code, annhelper, self.gcdescr)
+        self.cpu = cpu
+        self.metainterp_sd = MetaInterpStaticData(self.portal_graph,
+                                                  self.translator.graphs, cpu,
                                                   self.stats, opt,
                                                   optimizer=optimizer,
                                                   profile=profile,
@@ -513,6 +531,30 @@
             op.args[:3] = [closures[funcname]]
 
 
+def find_all_graphs(portal, policy, translator):
+    from pypy.translator.simplify import get_graph
+    all_graphs = [portal]
+    seen = set([portal])
+    todo = [portal]
+    while todo:
+        top_graph = todo.pop()
+        for _, op in top_graph.iterblockops():
+            if op.opname not in ("direct_call", "indirect_call", "oosend"):
+                continue
+            kind = policy.guess_call_kind(op)
+            if kind != "regular":
+                continue
+            for graph in policy.graphs_from(op):
+                if graph in seen:
+                    continue
+                if policy.look_inside_graph(graph):
+                    todo.append(graph)
+                    all_graphs.append(graph)
+                    seen.add(graph)
+    return all_graphs
+
+
+
 def decode_hp_hint_args(op):
     # Returns (list-of-green-vars, list-of-red-vars) without Voids.
     assert op.opname == 'jit_marker'

Modified: pypy/branch/pyjitpl5/pypy/translator/driver.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/driver.py	(original)
+++ pypy/branch/pyjitpl5/pypy/translator/driver.py	Wed Aug 19 17:58:30 2009
@@ -120,7 +120,7 @@
             else:
                 task, postfix = parts
                 if task in ('rtype', 'backendopt', 'llinterpret',
-                            'prejitbackendopt', 'pyjitpl'):
+                            'pyjitpl'):
                     if ts:
                         if ts == postfix:
                             expose_task(task, explicit_task)
@@ -355,36 +355,6 @@
     task_rtype_ootype = taskdef(task_rtype_ootype, ['annotate'], "ootyping")
     OOTYPE = 'rtype_ootype'
 
-    def task_prejitbackendopt_lltype(self):
-        from pypy.translator.backendopt.all import backend_optimizations
-        backend_optimizations(self.translator,
-                              inline_threshold=0,
-                              merge_if_blocks=True,
-                              constfold=True,
-                              raisingop2direct_call=False,
-                              remove_asserts=True,
-                              really_remove_asserts=True)
-    #
-    task_prejitbackendopt_lltype = taskdef(
-        task_prejitbackendopt_lltype,
-        [RTYPE],
-        "Backendopt before jitting")
-
-    def task_prejitbackendopt_ootype(self):
-        from pypy.translator.backendopt.all import backend_optimizations
-        backend_optimizations(self.translator,
-                              inline_threshold=0,
-                              merge_if_blocks=True,
-                              constfold=False, # XXX?
-                              raisingop2direct_call=False,
-                              remove_asserts=True,
-                              really_remove_asserts=True)
-    #
-    task_prejitbackendopt_ootype = taskdef(
-        task_prejitbackendopt_ootype,
-        [OOTYPE],
-        "Backendopt before jitting")
-
     def task_pyjitpl_lltype(self):
         get_policy = self.extra['jitpolicy']
         self.jitpolicy = get_policy(self)
@@ -397,7 +367,7 @@
         self.log.info("the JIT compiler was generated")
     #
     task_pyjitpl_lltype = taskdef(task_pyjitpl_lltype,
-                                  [RTYPE, '?prejitbackendopt_lltype'],
+                                  [RTYPE],
                                   "JIT compiler generation")
 
     def task_pyjitpl_ootype(self):
@@ -412,7 +382,7 @@
         self.log.info("the JIT compiler was generated")
     #
     task_pyjitpl_ootype = taskdef(task_pyjitpl_ootype,
-                                  [OOTYPE, '?prejitbackendopt_ootype'],
+                                  [OOTYPE],
                                   "JIT compiler generation")
 
     def task_backendopt_lltype(self):

Modified: pypy/branch/pyjitpl5/pypy/translator/goal/translate.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/goal/translate.py	(original)
+++ pypy/branch/pyjitpl5/pypy/translator/goal/translate.py	Wed Aug 19 17:58:30 2009
@@ -20,8 +20,6 @@
 GOALS= [
         ("annotate", "do type inference", "-a --annotate", ""),
         ("rtype", "do rtyping", "-t --rtype", ""),
-        ("prejitbackendopt", "backend optimize before jitting",
-         "--prejitbackendopt", ""),
         ("pyjitpl", "JIT generation step", "--pyjitpl", ""),
         ("backendopt", "do backend optimizations", "--backendopt", ""),
         ("source", "create source", "-s --source", ""),

Modified: pypy/branch/pyjitpl5/pypy/translator/test/test_driver.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/translator/test/test_driver.py	(original)
+++ pypy/branch/pyjitpl5/pypy/translator/test/test_driver.py	Wed Aug 19 17:58:30 2009
@@ -6,7 +6,7 @@
 def test_ctr():
     td = TranslationDriver()
     expected = ['annotate', 'backendopt', 'llinterpret', 'rtype', 'source',
-                'compile', 'run', 'prejitbackendopt', 'pyjitpl']
+                'compile', 'run', 'pyjitpl']
     assert set(td.exposed) == set(expected)
 
     assert td.backend_select_goals(['compile_c']) == ['compile_c']
@@ -35,8 +35,8 @@
                  'compile_cli', 'compile_c',
                  'run_c', 'run_cli',
                  'compile_jvm', 'source_jvm', 'run_jvm',
-                 'prejitbackendopt_lltype', 'pyjitpl_lltype',
-                 'prejitbackendopt_ootype', 'pyjitpl_ootype']
+                 'pyjitpl_lltype',
+                 'pyjitpl_ootype']
     assert set(td.exposed) == set(expected)                             
 
     td = TranslationDriver({'backend': None, 'type_system': 'lltype'})
@@ -50,6 +50,6 @@
         'backendopt_lltype']
 
     expected = ['annotate', 'backendopt', 'llinterpret', 'rtype', 'source_c',
-                'compile_c', 'run_c', 'prejitbackendopt', 'pyjitpl']
+                'compile_c', 'run_c', 'pyjitpl']
 
     assert set(td.exposed) == set(expected)



More information about the Pypy-commit mailing list