PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/jit/metainterp/optimizeopt/__init__.py

https://bitbucket.org/pypy/pypy/
Python | 75 lines | 61 code | 10 blank | 4 comment | 16 complexity | 5cdb19a208331706782784c42fb0e216 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
  2. from rpython.jit.metainterp.optimizeopt.rewrite import OptRewrite
  3. from rpython.jit.metainterp.optimizeopt.intbounds import OptIntBounds
  4. from rpython.jit.metainterp.optimizeopt.virtualize import OptVirtualize
  5. from rpython.jit.metainterp.optimizeopt.heap import OptHeap
  6. from rpython.jit.metainterp.optimizeopt.vstring import OptString
  7. from rpython.jit.metainterp.optimizeopt.simplify import OptSimplify
  8. from rpython.jit.metainterp.optimizeopt.pure import OptPure
  9. from rpython.jit.metainterp.optimizeopt.earlyforce import OptEarlyForce
  10. from rpython.rlib.rjitlog import rjitlog as jl
  11. from rpython.rlib.jit import PARAMETERS, ENABLE_ALL_OPTS
  12. from rpython.rlib.unroll import unrolling_iterable
  13. from rpython.rlib.debug import debug_start, debug_stop, debug_print
  14. ALL_OPTS = [('intbounds', OptIntBounds),
  15. ('rewrite', OptRewrite),
  16. ('virtualize', OptVirtualize),
  17. ('string', OptString),
  18. ('pure', OptPure),
  19. ('earlyforce', OptEarlyForce),
  20. ('heap', OptHeap),
  21. ('unroll', None)]
  22. # no direct instantiation of unroll
  23. unroll_all_opts = unrolling_iterable(ALL_OPTS)
  24. ALL_OPTS_DICT = dict.fromkeys([name for name, _ in ALL_OPTS])
  25. ALL_OPTS_LIST = [name for name, _ in ALL_OPTS]
  26. ALL_OPTS_NAMES = ':'.join([name for name, _ in ALL_OPTS])
  27. assert ENABLE_ALL_OPTS == ALL_OPTS_NAMES, (
  28. 'please fix rlib/jit.py to say ENABLE_ALL_OPTS = %r' % (ALL_OPTS_NAMES,))
  29. def build_opt_chain(metainterp_sd, enable_opts):
  30. optimizations = []
  31. unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict
  32. if (metainterp_sd.cpu is not None and
  33. not metainterp_sd.cpu.supports_guard_gc_type):
  34. unroll = False
  35. for name, opt in unroll_all_opts:
  36. if name in enable_opts:
  37. if opt is not None:
  38. o = opt()
  39. optimizations.append(o)
  40. if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts
  41. or 'heap' not in enable_opts or 'pure' not in enable_opts):
  42. optimizations.append(OptSimplify(unroll))
  43. return optimizations, unroll
  44. def optimize_trace(metainterp_sd, jitdriver_sd, compile_data, memo=None):
  45. """Optimize loop.operations to remove internal overheadish operations.
  46. """
  47. debug_start("jit-optimize")
  48. try:
  49. # mark that a new trace has been started
  50. log = metainterp_sd.jitlog.log_trace(jl.MARK_TRACE, metainterp_sd, None)
  51. log.write_trace(compile_data.trace)
  52. if compile_data.log_noopt:
  53. metainterp_sd.logger_noopt.log_loop_from_trace(compile_data.trace, memo=memo)
  54. if memo is None:
  55. memo = {}
  56. compile_data.box_names_memo = memo
  57. optimizations, unroll = build_opt_chain(metainterp_sd,
  58. compile_data.enable_opts)
  59. return compile_data.optimize(metainterp_sd, jitdriver_sd,
  60. optimizations, unroll)
  61. finally:
  62. compile_data.forget_optimization_info()
  63. debug_stop("jit-optimize")
  64. if __name__ == '__main__':
  65. print ALL_OPTS_NAMES