Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r45310:e90e238c3ac2 Date: 2011-07-03 09:48 +0200 http://bitbucket.org/pypy/pypy/changeset/e90e238c3ac2/
Log: merge heads diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py --- a/pypy/jit/metainterp/optimizeopt/__init__.py +++ b/pypy/jit/metainterp/optimizeopt/__init__.py @@ -3,7 +3,7 @@ from pypy.jit.metainterp.optimizeopt.intbounds import OptIntBounds from pypy.jit.metainterp.optimizeopt.virtualize import OptVirtualize from pypy.jit.metainterp.optimizeopt.heap import OptHeap -from pypy.jit.metainterp.optimizeopt.string import OptString +from pypy.jit.metainterp.optimizeopt.vstring import OptString from pypy.jit.metainterp.optimizeopt.unroll import optimize_unroll, OptInlineShortPreamble from pypy.jit.metainterp.optimizeopt.fficall import OptFfiCall from pypy.jit.metainterp.optimizeopt.simplify import OptSimplify @@ -21,15 +21,14 @@ unroll_all_opts = unrolling_iterable(ALL_OPTS) ALL_OPTS_DICT = dict.fromkeys([name for name, _ in ALL_OPTS]) - +ALL_OPTS_LIST = [name for name, _ in ALL_OPTS] ALL_OPTS_NAMES = ':'.join([name for name, _ in ALL_OPTS]) -PARAMETERS['enable_opts'] = ALL_OPTS_NAMES def build_opt_chain(metainterp_sd, enable_opts, inline_short_preamble=True, retraced=False): config = metainterp_sd.config optimizations = [] - unroll = 'unroll' in enable_opts + unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict for name, opt in unroll_all_opts: if name in enable_opts: if opt is not None: diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -4140,7 +4140,6 @@ # ---------- def optimize_strunicode_loop_extradescrs(self, ops, optops): - from pypy.jit.metainterp.optimizeopt import string class FakeCallInfoCollection: def callinfo_for_oopspec(self, oopspecindex): calldescrtype = type(LLtypeMixin.strequaldescr) diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -5373,7 +5373,6 @@ # ---------- def optimize_strunicode_loop_extradescrs(self, ops, optops, preamble=None): - from pypy.jit.metainterp.optimizeopt import string class FakeCallInfoCollection: def callinfo_for_oopspec(self, oopspecindex): calldescrtype = type(LLtypeMixin.strequaldescr) diff --git a/pypy/jit/metainterp/optimizeopt/string.py b/pypy/jit/metainterp/optimizeopt/vstring.py rename from pypy/jit/metainterp/optimizeopt/string.py rename to pypy/jit/metainterp/optimizeopt/vstring.py diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py --- a/pypy/jit/metainterp/warmstate.py +++ b/pypy/jit/metainterp/warmstate.py @@ -237,7 +237,7 @@ d = {} if NonConstant(False): value = 'blah' # not a constant '' - if value is None: + if value is None or value == 'all': value = ALL_OPTS_NAMES for name in value.split(":"): if name: diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py --- a/pypy/module/pypyjit/interp_jit.py +++ b/pypy/module/pypyjit/interp_jit.py @@ -176,6 +176,8 @@ '''Configure the tunable JIT parameters. * set_param(name=value, ...) # as keyword arguments * set_param("name=value,name=value") # as a user-supplied string + * set_param("off") # disable the jit + * set_param("default") # restore all defaults ''' # XXXXXXXXX args_w, kwds_w = __args__.unpack() diff --git a/pypy/module/pypyjit/test/test_jit_setup.py b/pypy/module/pypyjit/test/test_jit_setup.py --- a/pypy/module/pypyjit/test/test_jit_setup.py +++ b/pypy/module/pypyjit/test/test_jit_setup.py @@ -9,21 +9,42 @@ # this just checks that the module is setting up things correctly, and # the resulting code makes sense on top of CPython. import pypyjit - pypyjit.set_param(threshold=5, inlining=1) - pypyjit.set_param("trace_eagerness=3,inlining=0") + try: + pypyjit.set_param(threshold=5, inlining=1) + pypyjit.set_param("trace_eagerness=3,inlining=0") - def f(x, y): - return x*y+1 + def f(x, y): + return x*y+1 - assert f(6, 7) == 43 + assert f(6, 7) == 43 - def gen(x): - i = 0 - while i < x: - yield i*i - i += 1 + def gen(x): + i = 0 + while i < x: + yield i*i + i += 1 - assert list(gen(3)) == [0, 1, 4] + assert list(gen(3)) == [0, 1, 4] + finally: + pypyjit.set_param('default') + + def test_no_jit(self): + import pypyjit + was_called = [] + def should_not_be_called(*args, **kwds): + was_called.append((args, kwds)) + try: + pypyjit.set_param('off') + pypyjit.set_compile_hook(should_not_be_called) + def f(): + pass + for i in range(2500): + f() + assert not was_called + finally: + pypyjit.set_compile_hook(None) + pypyjit.set_param('default') + def test_interface_residual_call(): space = gettestobjspace(usemodules=['pypyjit']) diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py --- a/pypy/rlib/jit.py +++ b/pypy/rlib/jit.py @@ -295,9 +295,10 @@ 'inlining': 0, 'loop_longevity': 1000, 'retrace_limit': 5, - 'enable_opts': None, # patched later by optimizeopt/__init__.py + 'enable_opts': 'all', } unroll_parameters = unrolling_iterable(PARAMETERS.items()) +DEFAULT = object() # ____________________________________________________________ @@ -352,22 +353,33 @@ def _set_param(self, name, value): # special-cased by ExtRegistryEntry # (internal, must receive a constant 'name') + # if value is DEFAULT, sets the default value. assert name in PARAMETERS @specialize.arg(0, 1) def set_param(self, name, value): """Set one of the tunable JIT parameter.""" - for name1, _ in unroll_parameters: - if name1 == name: - self._set_param(name1, value) - return - raise ValueError("no such parameter") + self._set_param(name, value) + + @specialize.arg(0, 1) + def set_param_to_default(self, name): + """Reset one of the tunable JIT parameters to its default value.""" + self._set_param(name, DEFAULT) def set_user_param(self, text): """Set the tunable JIT parameters from a user-supplied string - following the format 'param=value,param=value'. For programmatic - setting of parameters, use directly JitDriver.set_param(). + following the format 'param=value,param=value', or 'off' to + disable the JIT. For programmatic setting of parameters, use + directly JitDriver.set_param(). """ + if text == 'off': + self.set_param('threshold', -1) + self.set_param('function_threshold', -1) + return + if text == 'default': + for name1, _ in unroll_parameters: + self.set_param_to_default(name1) + return for s in text.split(','): s = s.strip(' ') parts = s.split('=') @@ -590,15 +602,17 @@ def compute_result_annotation(self, s_name, s_value): from pypy.annotation import model as annmodel assert s_name.is_constant() - if s_name.const == 'enable_opts': - assert annmodel.SomeString(can_be_None=True).contains(s_value) - else: - assert annmodel.SomeInteger().contains(s_value) + if not self.bookkeeper.immutablevalue(DEFAULT).contains(s_value): + if s_name.const == 'enable_opts': + assert annmodel.SomeString(can_be_None=True).contains(s_value) + else: + assert annmodel.SomeInteger().contains(s_value) return annmodel.s_None def specialize_call(self, hop): from pypy.rpython.lltypesystem import lltype from pypy.rpython.lltypesystem.rstr import string_repr + from pypy.objspace.flow.model import Constant hop.exception_cannot_occur() driver = self.instance.im_self @@ -607,7 +621,12 @@ repr = string_repr else: repr = lltype.Signed - v_value = hop.inputarg(repr, arg=1) + if (isinstance(hop.args_v[1], Constant) and + hop.args_v[1].value is DEFAULT): + value = PARAMETERS[name] + v_value = hop.inputconst(repr, value) + else: + v_value = hop.inputarg(repr, arg=1) vlist = [hop.inputconst(lltype.Void, "set_param"), hop.inputconst(lltype.Void, driver), hop.inputconst(lltype.Void, name), diff --git a/pypy/translator/goal/app_main.py b/pypy/translator/goal/app_main.py --- a/pypy/translator/goal/app_main.py +++ b/pypy/translator/goal/app_main.py @@ -143,6 +143,7 @@ for key, value in items: print ' --jit %s=N %slow-level JIT parameter (default %s)' % ( key, ' '*(18-len(key)), value) + print ' --jit off turn off the JIT' def print_version(*args): print "Python", sys.version _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit