[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