Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r86408:532f12cdb886
Date: 2016-08-22 11:32 +0200
http://bitbucket.org/pypy/pypy/changeset/532f12cdb886/
Log: merge const-fold-we-are-jitted:
when running the final backend-optimization phase before emitting C
code, constant-fold calls to we_are_jitted to return False. This
makes the generated C code a few percent smaller.
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -144,3 +144,9 @@
``type.__dict__`` now returns a ``dict_proxy`` object, like on CPython.
Previously it returned what looked like a regular dict object (but it
was already read-only).
+
+
+.. branch: const-fold-we-are-jitted
+
+Reduce the size of the generated C code by constant-folding ``we_are_jitted``
+in non-jitcode.
diff --git a/rpython/config/translationoption.py
b/rpython/config/translationoption.py
--- a/rpython/config/translationoption.py
+++ b/rpython/config/translationoption.py
@@ -261,6 +261,9 @@
"stack based virtual machines (only for backends that
support it)",
default=True),
BoolOption("storesink", "Perform store sinking", default=True),
+ BoolOption("replace_we_are_jitted",
+ "Replace we_are_jitted() calls by False",
+ default=False, cmdline=None),
BoolOption("none",
"Do not run any backend optimizations",
requires=[('translation.backendopt.inline', False),
diff --git a/rpython/jit/metainterp/warmspot.py
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -452,7 +452,8 @@
merge_if_blocks=True,
constfold=True,
remove_asserts=True,
- really_remove_asserts=True)
+ really_remove_asserts=True,
+ replace_we_are_jitted=False)
def prejit_optimizations_minimal_inline(self, policy, graphs):
from rpython.translator.backendopt.inline import auto_inline_graphs
diff --git a/rpython/translator/backendopt/all.py
b/rpython/translator/backendopt/all.py
--- a/rpython/translator/backendopt/all.py
+++ b/rpython/translator/backendopt/all.py
@@ -2,6 +2,7 @@
from rpython.translator.backendopt import inline
from rpython.translator.backendopt.malloc import remove_mallocs
from rpython.translator.backendopt.constfold import constant_fold_graph
+from rpython.translator.backendopt.constfold import replace_we_are_jitted
from rpython.translator.backendopt.stat import print_statistics
from rpython.translator.backendopt.merge_if_blocks import merge_if_blocks
from rpython.translator import simplify
@@ -36,6 +37,7 @@
# inline_threshold, mallocs
# merge_if_blocks, constfold, heap2stack
# clever_malloc_removal, remove_asserts
+ # replace_we_are_jitted
config = translator.config.translation.backendopt.copy(as_default=True)
config.set(**kwds)
@@ -49,6 +51,10 @@
print "before optimizations:"
print_statistics(translator.graphs[0], translator, "per-graph.txt")
+ if config.replace_we_are_jitted:
+ for graph in graphs:
+ replace_we_are_jitted(graph)
+
if config.remove_asserts:
constfold(config, graphs)
remove_asserts(translator, graphs)
diff --git a/rpython/translator/backendopt/constfold.py
b/rpython/translator/backendopt/constfold.py
--- a/rpython/translator/backendopt/constfold.py
+++ b/rpython/translator/backendopt/constfold.py
@@ -276,3 +276,25 @@
rewire_links(splitblocks, graph)
if not diffused and not splitblocks:
break # finished
+
+def replace_symbolic(graph, symbolic, value):
+ result = False
+ for block in graph.iterblocks():
+ for op in block.operations:
+ for i, arg in enumerate(op.args):
+ if isinstance(arg, Constant) and arg.value is symbolic:
+ op.args[i] = value
+ result = True
+ if block.exitswitch is symbolic:
+ block.exitswitch = value
+ result = True
+ return result
+
+def replace_we_are_jitted(graph):
+ from rpython.rlib import jit
+ replacement = Constant(0)
+ replacement.concretetype = lltype.Signed
+ did_replacement = replace_symbolic(graph, jit._we_are_jitted, replacement)
+ if did_replacement:
+ constant_fold_graph(graph)
+ return did_replacement
diff --git a/rpython/translator/backendopt/test/test_all.py
b/rpython/translator/backendopt/test/test_all.py
--- a/rpython/translator/backendopt/test/test_all.py
+++ b/rpython/translator/backendopt/test/test_all.py
@@ -289,3 +289,19 @@
llinterp = LLInterpreter(t.rtyper)
res = llinterp.eval_graph(later_graph, [10])
assert res == 1
+
+ def test_replace_we_are_jitted(self):
+ from rpython.rlib import jit
+ def f():
+ if jit.we_are_jitted():
+ return 1
+ return 2 + jit.we_are_jitted()
+
+ t = self.translateopt(f, [])
+ graph = graphof(t, f)
+ # by default, replace_we_are_jitted is off
+ assert graph.startblock.operations[0].args[0].value is
jit._we_are_jitted
+
+ t = self.translateopt(f, [], replace_we_are_jitted=True)
+ graph = graphof(t, f)
+ assert graph.startblock.exits[0].args[0].value == 2
diff --git a/rpython/translator/backendopt/test/test_constfold.py
b/rpython/translator/backendopt/test/test_constfold.py
--- a/rpython/translator/backendopt/test/test_constfold.py
+++ b/rpython/translator/backendopt/test/test_constfold.py
@@ -7,6 +7,7 @@
from rpython.rtyper import rclass
from rpython.rlib import objectmodel
from rpython.translator.backendopt.constfold import constant_fold_graph
+from rpython.translator.backendopt.constfold import replace_we_are_jitted
from rpython.conftest import option
def get_graph(fn, signature):
@@ -343,3 +344,18 @@
merge_if_blocks.merge_if_blocks_once(graph)
constant_fold_graph(graph)
check_graph(graph, [], 66, t)
+
+def test_replace_we_are_jitted():
+ from rpython.rlib import jit
+ def fn():
+ if jit.we_are_jitted():
+ return 1
+ return 2 + jit.we_are_jitted()
+ graph, t = get_graph(fn, [])
+ result = replace_we_are_jitted(graph)
+ assert result
+ checkgraph(graph)
+ # check shape of graph
+ assert len(graph.startblock.operations) == 0
+ assert graph.startblock.exitswitch is None
+ assert graph.startblock.exits[0].target.exits[0].args[0].value == 2
diff --git a/rpython/translator/driver.py b/rpython/translator/driver.py
--- a/rpython/translator/driver.py
+++ b/rpython/translator/driver.py
@@ -381,7 +381,7 @@
""" Run all backend optimizations - lltype version
"""
from rpython.translator.backendopt.all import backend_optimizations
- backend_optimizations(self.translator)
+ backend_optimizations(self.translator, replace_we_are_jitted=True)
STACKCHECKINSERTION = 'stackcheckinsertion_lltype'
diff --git a/rpython/translator/test/test_interactive.py
b/rpython/translator/test/test_interactive.py
--- a/rpython/translator/test/test_interactive.py
+++ b/rpython/translator/test/test_interactive.py
@@ -78,3 +78,15 @@
dll = ctypes.CDLL(str(t.driver.c_entryp))
f = dll.pypy_g_f
assert f(2, 3) == 5
+
+def test_check_that_driver_uses_replace_we_are_jitted():
+ from rpython.rlib import jit
+ def f():
+ if jit.we_are_jitted():
+ return 1
+ return 2 + jit.we_are_jitted()
+
+ t = Translation(f, [])
+ t.backendopt()
+ graph = t.driver.translator.graphs[0]
+ assert graph.startblock.exits[0].args[0].value == 2
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit