[pypy-commit] pypy optimizeopt-cleanup: Move some methods from OptUnroll to UnrollOptimizer
rlamy
pypy.commits at gmail.com
Thu May 9 15:10:56 EDT 2019
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: optimizeopt-cleanup
Changeset: r96588:cfa068539b62
Date: 2019-05-09 19:46 +0100
http://bitbucket.org/pypy/pypy/changeset/cfa068539b62/
Log: Move some methods from OptUnroll to UnrollOptimizer
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -72,8 +72,8 @@
self.runtime_boxes = runtime_boxes
def optimize(self, metainterp_sd, jitdriver_sd, optimizations):
- from rpython.jit.metainterp.optimizeopt.unroll import OptUnroll
- opt = OptUnroll(metainterp_sd, jitdriver_sd, optimizations)
+ from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
+ opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
return opt.optimize_preamble(
self.trace, self.runtime_boxes, self.call_pure_results,
self.box_names_memo)
@@ -110,9 +110,9 @@
self.resumestorage = resumestorage
def optimize(self, metainterp_sd, jitdriver_sd, optimizations):
- from rpython.jit.metainterp.optimizeopt.unroll import OptUnroll
+ from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
- opt = OptUnroll(metainterp_sd, jitdriver_sd, optimizations)
+ opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
return opt.optimize_bridge(self.trace, self.runtime_boxes,
self.call_pure_results,
self.inline_short_preamble,
@@ -136,8 +136,8 @@
self.inline_short_preamble = inline_short_preamble
def optimize(self, metainterp_sd, jitdriver_sd, optimizations):
- from rpython.jit.metainterp.optimizeopt.unroll import OptUnroll
- opt = OptUnroll(metainterp_sd, jitdriver_sd, optimizations)
+ from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
+ opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
return opt.optimize_peeled_loop(self.trace, self.celltoken, self.state,
self.call_pure_results, self.inline_short_preamble)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -17,6 +17,11 @@
have_debug_prints
class UnrollOptimizer(Optimizer):
+ def __init__(self, metainterp_sd, jitdriver_sd, optimizations):
+ Optimizer.__init__(self, metainterp_sd, jitdriver_sd, optimizations)
+ self.optunroll = OptUnroll()
+ self.optunroll.optimizer = self
+
def force_op_from_preamble(self, preamble_op):
if isinstance(preamble_op, PreambleOp):
if self.optunroll.short_preamble_producer is None:
@@ -98,6 +103,148 @@
elif isinstance(preamble_info, info.FloatConstInfo):
op.set_forwarded(preamble_info._const)
+ def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo):
+ info, newops = self.propagate_all_forward(
+ trace.get_iter(), call_pure_results, flush=False)
+ exported_state = self.optunroll.export_state(info.jump_op.getarglist(),
+ info.inputargs,
+ runtime_boxes, memo)
+ exported_state.quasi_immutable_deps = info.quasi_immutable_deps
+ # we need to absolutely make sure that we've cleaned up all
+ # the optimization info
+ self._clean_optimization_info(self._newoperations)
+ return exported_state, self._newoperations
+
+ def optimize_peeled_loop(self, trace, celltoken, state,
+ call_pure_results, inline_short_preamble=True):
+ trace = trace.get_iter()
+ try:
+ label_args = self.optunroll.import_state(trace.inputargs, state)
+ except VirtualStatesCantMatch:
+ raise InvalidLoop("Cannot import state, virtual states don't match")
+ self.optunroll.potential_extra_ops = {}
+ try:
+ info, _ = self.propagate_all_forward(
+ trace, call_pure_results, flush=False)
+ except SpeculativeError:
+ raise InvalidLoop("Speculative heap access would be ill-typed")
+ end_jump = info.jump_op
+ label_op = ResOperation(rop.LABEL, label_args, descr=celltoken)
+ for a in end_jump.getarglist():
+ self.force_box_for_end_of_preamble(get_box_replacement(a))
+ current_vs = self.optunroll.get_virtual_state(end_jump.getarglist())
+ # pick the vs we want to jump to
+ assert isinstance(celltoken, JitCellToken)
+
+ target_virtual_state = self.optunroll.pick_virtual_state(
+ current_vs, state.virtual_state, celltoken.target_tokens)
+ # force the boxes for virtual state to match
+ try:
+ args = target_virtual_state.make_inputargs(
+ [get_box_replacement(x) for x in end_jump.getarglist()],
+ self, force_boxes=True)
+ for arg in args:
+ if arg is not None:
+ self.force_box(arg)
+ except VirtualStatesCantMatch:
+ raise InvalidLoop("Virtual states did not match "
+ "after picking the virtual state, when forcing"
+ " boxes")
+ extra_same_as = self.optunroll.short_preamble_producer.extra_same_as[:]
+ target_token = self.optunroll.finalize_short_preamble(label_op,
+ state.virtual_state)
+ label_op.setdescr(target_token)
+
+ if not inline_short_preamble:
+ self.optunroll.jump_to_preamble(celltoken, end_jump, info)
+ return (UnrollInfo(target_token, label_op, extra_same_as,
+ self.quasi_immutable_deps),
+ self._newoperations)
+
+ try:
+ new_virtual_state = self.optunroll.jump_to_existing_trace(
+ end_jump, label_op, state.runtime_boxes, force_boxes=False)
+ except InvalidLoop:
+ # inlining short preamble failed, jump to preamble
+ self.optunroll.jump_to_preamble(celltoken, end_jump, info)
+ return (UnrollInfo(target_token, label_op, extra_same_as,
+ self.quasi_immutable_deps),
+ self._newoperations)
+
+ if new_virtual_state is not None:
+ # Attempt to force virtual boxes in order to avoid jumping
+ # to the preamble.
+ try:
+ new_virtual_state = self.optunroll.jump_to_existing_trace(
+ end_jump, label_op, state.runtime_boxes, force_boxes=True)
+ except InvalidLoop:
+ pass
+
+ if new_virtual_state is not None:
+ self.optunroll.jump_to_preamble(celltoken, end_jump, info)
+ return (UnrollInfo(target_token, label_op, extra_same_as,
+ self.quasi_immutable_deps),
+ self._newoperations)
+
+ self.optunroll.disable_retracing_if_max_retrace_guards(
+ self._newoperations, target_token)
+
+ return (UnrollInfo(target_token, label_op, extra_same_as,
+ self.quasi_immutable_deps),
+ self._newoperations)
+
+ def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
+ inline_short_preamble, box_names_memo, resumestorage):
+ from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge
+ frontend_inputargs = trace.inputargs
+ trace = trace.get_iter()
+ self.optunroll._check_no_forwarding([trace.inputargs])
+ if resumestorage:
+ deserialize_optimizer_knowledge(self,
+ resumestorage, frontend_inputargs,
+ trace.inputargs)
+ info, ops = self.propagate_all_forward(trace,
+ call_pure_results, False)
+ jump_op = info.jump_op
+ cell_token = jump_op.getdescr()
+ assert isinstance(cell_token, JitCellToken)
+ if not inline_short_preamble or len(cell_token.target_tokens) == 1:
+ return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ # force all the information that does not go to the short
+ # preamble at all
+ self.flush()
+ for a in jump_op.getarglist():
+ self.force_box_for_end_of_preamble(a)
+ try:
+ vs = self.optunroll.jump_to_existing_trace(jump_op, None, runtime_boxes,
+ force_boxes=False)
+ except InvalidLoop:
+ return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ if vs is None:
+ return info, self._newoperations[:]
+ warmrunnerdescr = self.metainterp_sd.warmrunnerdesc
+ limit = warmrunnerdescr.memory_manager.retrace_limit
+ if cell_token.retraced_count < limit:
+ cell_token.retraced_count += 1
+ debug_print('Retracing (%d/%d)' % (cell_token.retraced_count, limit))
+ else:
+ # Try forcing boxes to avoid jumping to the preamble
+ try:
+ vs = self.optunroll.jump_to_existing_trace(jump_op, None, runtime_boxes,
+ force_boxes=True)
+ except InvalidLoop:
+ pass
+ if vs is None:
+ return info, self._newoperations[:]
+ debug_print("Retrace count reached, jumping to preamble")
+ return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ exported_state = self.optunroll.export_state(info.jump_op.getarglist(),
+ info.inputargs, runtime_boxes,
+ box_names_memo)
+ exported_state.quasi_immutable_deps = self.quasi_immutable_deps
+ self._clean_optimization_info(self._newoperations)
+ return exported_state, self._newoperations
+
class OptUnroll(Optimization):
"""Unroll the loop into two iterations. The first one will
@@ -106,11 +253,6 @@
short_preamble_producer = None
- def __init__(self, metainterp_sd, jitdriver_sd, optimizations):
- self.optimizer = UnrollOptimizer(metainterp_sd, jitdriver_sd,
- optimizations)
- self.optimizer.optunroll = self
-
def get_virtual_state(self, args):
modifier = VirtualStateConstructor(self.optimizer)
return modifier.get_virtual_state(args)
@@ -123,99 +265,6 @@
assert not self.optimizer._newoperations
- def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo):
- info, newops = self.optimizer.propagate_all_forward(
- trace.get_iter(), call_pure_results, flush=False)
- exported_state = self.export_state(info.jump_op.getarglist(),
- info.inputargs,
- runtime_boxes, memo)
- exported_state.quasi_immutable_deps = info.quasi_immutable_deps
- # we need to absolutely make sure that we've cleaned up all
- # the optimization info
- self.optimizer._clean_optimization_info(self.optimizer._newoperations)
- return exported_state, self.optimizer._newoperations
-
- def optimize_peeled_loop(self, trace, celltoken, state,
- call_pure_results, inline_short_preamble=True):
- trace = trace.get_iter()
- try:
- label_args = self.import_state(trace.inputargs, state)
- except VirtualStatesCantMatch:
- raise InvalidLoop("Cannot import state, virtual states don't match")
- self.potential_extra_ops = {}
- try:
- info, _ = self.optimizer.propagate_all_forward(
- trace, call_pure_results, flush=False)
- except SpeculativeError:
- raise InvalidLoop("Speculative heap access would be ill-typed")
- end_jump = info.jump_op
- label_op = ResOperation(rop.LABEL, label_args,
- descr=celltoken)
- for a in end_jump.getarglist():
- self.optimizer.force_box_for_end_of_preamble(
- get_box_replacement(a))
- current_vs = self.get_virtual_state(end_jump.getarglist())
- # pick the vs we want to jump to
- assert isinstance(celltoken, JitCellToken)
-
- target_virtual_state = self.pick_virtual_state(current_vs,
- state.virtual_state,
- celltoken.target_tokens)
- # force the boxes for virtual state to match
- try:
- args = target_virtual_state.make_inputargs(
- [get_box_replacement(x) for x in end_jump.getarglist()],
- self.optimizer, force_boxes=True)
- for arg in args:
- if arg is not None:
- self.optimizer.force_box(arg)
- except VirtualStatesCantMatch:
- raise InvalidLoop("Virtual states did not match "
- "after picking the virtual state, when forcing"
- " boxes")
- extra_same_as = self.short_preamble_producer.extra_same_as[:]
- target_token = self.finalize_short_preamble(label_op,
- state.virtual_state)
- label_op.setdescr(target_token)
-
- if not inline_short_preamble:
- self.jump_to_preamble(celltoken, end_jump, info)
- return (UnrollInfo(target_token, label_op, extra_same_as,
- self.optimizer.quasi_immutable_deps),
- self.optimizer._newoperations)
-
- try:
- new_virtual_state = self.jump_to_existing_trace(
- end_jump, label_op, state.runtime_boxes, force_boxes=False)
- except InvalidLoop:
- # inlining short preamble failed, jump to preamble
- self.jump_to_preamble(celltoken, end_jump, info)
- return (UnrollInfo(target_token, label_op, extra_same_as,
- self.optimizer.quasi_immutable_deps),
- self.optimizer._newoperations)
-
- if new_virtual_state is not None:
- # Attempt to force virtual boxes in order to avoid jumping
- # to the preamble.
- try:
- new_virtual_state = self.jump_to_existing_trace(
- end_jump, label_op, state.runtime_boxes, force_boxes=True)
- except InvalidLoop:
- pass
-
- if new_virtual_state is not None:
- self.jump_to_preamble(celltoken, end_jump, info)
- return (UnrollInfo(target_token, label_op, extra_same_as,
- self.optimizer.quasi_immutable_deps),
- self.optimizer._newoperations)
-
- self.disable_retracing_if_max_retrace_guards(
- self.optimizer._newoperations, target_token)
-
- return (UnrollInfo(target_token, label_op, extra_same_as,
- self.optimizer.quasi_immutable_deps),
- self.optimizer._newoperations)
-
def disable_retracing_if_max_retrace_guards(self, ops, target_token):
maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards
count = 0
@@ -236,58 +285,6 @@
return token.virtual_state
return label_vs
- def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
- inline_short_preamble, box_names_memo, resumestorage):
- from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge
- frontend_inputargs = trace.inputargs
- trace = trace.get_iter()
- self._check_no_forwarding([trace.inputargs])
- if resumestorage:
- deserialize_optimizer_knowledge(self.optimizer,
- resumestorage, frontend_inputargs,
- trace.inputargs)
- info, ops = self.optimizer.propagate_all_forward(trace,
- call_pure_results, False)
- jump_op = info.jump_op
- cell_token = jump_op.getdescr()
- assert isinstance(cell_token, JitCellToken)
- if not inline_short_preamble or len(cell_token.target_tokens) == 1:
- return self.jump_to_preamble(cell_token, jump_op, info)
- # force all the information that does not go to the short
- # preamble at all
- self.optimizer.flush()
- for a in jump_op.getarglist():
- self.optimizer.force_box_for_end_of_preamble(a)
- try:
- vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes,
- force_boxes=False)
- except InvalidLoop:
- return self.jump_to_preamble(cell_token, jump_op, info)
- if vs is None:
- return info, self.optimizer._newoperations[:]
- warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
- limit = warmrunnerdescr.memory_manager.retrace_limit
- if cell_token.retraced_count < limit:
- cell_token.retraced_count += 1
- debug_print('Retracing (%d/%d)' % (cell_token.retraced_count, limit))
- else:
- # Try forcing boxes to avoid jumping to the preamble
- try:
- vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes,
- force_boxes=True)
- except InvalidLoop:
- pass
- if vs is None:
- return info, self.optimizer._newoperations[:]
- debug_print("Retrace count reached, jumping to preamble")
- return self.jump_to_preamble(cell_token, jump_op, info)
- exported_state = self.export_state(info.jump_op.getarglist(),
- info.inputargs, runtime_boxes,
- box_names_memo)
- exported_state.quasi_immutable_deps = self.optimizer.quasi_immutable_deps
- self.optimizer._clean_optimization_info(self.optimizer._newoperations)
- return exported_state, self.optimizer._newoperations
-
def finalize_short_preamble(self, label_op, virtual_state):
sb = self.short_preamble_producer
self.optimizer._clean_optimization_info(sb.short_inputargs)
More information about the pypy-commit
mailing list