[pypy-commit] pypy unrecursive-opt: Now in RPython.

jerith noreply at buildbot.pypy.org
Mon Oct 12 14:11:59 CEST 2015


Author: Jeremy Thurgood <firxen at gmail.com>
Branch: unrecursive-opt
Changeset: r80133:e80e2fc935ca
Date: 2015-10-12 14:11 +0200
http://bitbucket.org/pypy/pypy/changeset/e80e2fc935ca/

Log:	Now in RPython.

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -288,14 +288,14 @@
             cf = submap[index] = ArrayCachedField(index)
         return cf
 
-    def emit(self, op, callback_func=None, *callback_args):
+    def emit(self, op):
         self.emitting_operation(op)
         self.emit_postponed_op()
         if (op.is_comparison() or op.is_call_may_force()
             or op.is_ovf()):
             self.postponed_op = op
         else:
-            return Optimization.emit(self, op, callback_func, *callback_args)
+            return Optimization.emit(self, op)
 
     def emitting_operation(self, op):
         if op.has_no_side_effect():
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -35,16 +35,12 @@
 
 
 class OptimizationResult(object):
-    def __init__(self, opt, op, callback_func=None, *callback_args):
+    def __init__(self, opt, op):
         self.opt = opt
         self.op = op
-        if callback_func is None:
-            callback_func = opt.propagate_postprocess
-        self.callback_func = callback_func
-        self.callback_args = callback_args
 
     def callback(self):
-        self.callback_func(self.op, *self.callback_args)
+        self.opt.propagate_postprocess(self.op)
 
 
 class Optimization(object):
@@ -66,9 +62,12 @@
     def emit_operation(self, op):
         assert False, "This should never be called."
 
-    def emit(self, op, callback_func=None, *callback_args):
-        self.last_emitted_operation = op
-        return OptimizationResult(self, op, callback_func, *callback_args)
+    def emit(self, op):
+        return self.emit_result(OptimizationResult(self, op))
+
+    def emit_result(self, opt_result):
+        self.last_emitted_operation = opt_result.op
+        return opt_result
 
     def emit_extra(self, op, emit=True):
         if emit:
@@ -579,11 +578,11 @@
     def propagate_forward(self, op):
         dispatch_opt(self, op)
 
-    def emit_extra(self, op):
+    def emit_extra(self, op, emit=True):
         # no forwarding, because we're at the end of the chain
         self.emit(op)
 
-    def emit(self, op, callback_func=None, *callback_args):
+    def emit(self, op):
         # this actually emits the operation instead of forwarding it
         if op.returns_bool_result():
             self.getintbound(op).make_bool()
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -1,10 +1,36 @@
-from rpython.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
+from rpython.jit.metainterp.optimizeopt.optimizer import (
+    Optimization, OptimizationResult, REMOVED)
 from rpython.jit.metainterp.resoperation import rop, OpHelpers, AbstractResOp,\
      ResOperation
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.optimizeopt.shortpreamble import PreambleOp
 
 
+class DefaultOptimizationResult(OptimizationResult):
+    def __init__(self, opt, op, save, nextop):
+        OptimizationResult.__init__(self, opt, op)
+        self.save = save
+        self.nextop = nextop
+
+    def callback(self):
+        self._callback(self.op, self.save, self.nextop)
+
+    def _callback(self, op, save, nextop):
+        if op.returns_bool_result():
+            self.opt.getintbound(op).make_bool()
+        if save:
+            recentops = self.opt.getrecentops(op.getopnum())
+            recentops.add(op)
+        if nextop:
+            self.opt.emit_extra(nextop)
+
+
+class CallPureOptimizationResult(OptimizationResult):
+    def callback(self):
+        self.opt.call_pure_positions.append(
+            len(self.opt.optimizer._newoperations) - 1)
+
+
 class RecentPureOps(object):
     REMEMBER_LIMIT = 16
 
@@ -111,17 +137,7 @@
                 return
 
         # otherwise, the operation remains
-        return self.emit(op, self.postprocess_default, save, nextop)
-
-    def postprocess_default(self, op, save, nextop):
-        # postprocessor for optimize_default, not default postprocessor
-        if op.returns_bool_result():
-            self.getintbound(op).make_bool()
-        if save:
-            recentops = self.getrecentops(op.getopnum())
-            recentops.add(op)
-        if nextop:
-            self.emit_extra(nextop)
+        return self.emit_result(DefaultOptimizationResult(self, op, save, nextop))
 
     def getrecentops(self, opnum):
         if rop._OVF_FIRST <= opnum <= rop._OVF_LAST:
@@ -164,11 +180,7 @@
         # replace CALL_PURE with just CALL
         opnum = OpHelpers.call_for_descr(op.getdescr())
         newop = self.optimizer.replace_op_with(op, opnum)
-        return self.emit(newop, self.postprocess_call_pure)
-
-    def postprocess_call_pure(self, op):
-        self.call_pure_positions.append(
-            len(self.optimizer._newoperations) - 1)
+        return self.emit_result(CallPureOptimizationResult(self, newop))
 
     optimize_CALL_PURE_R = optimize_CALL_PURE_I
     optimize_CALL_PURE_F = optimize_CALL_PURE_I
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -5,8 +5,8 @@
                                             ConstFloat)
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
-from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
-    CONST_0, CONST_1)
+from rpython.jit.metainterp.optimizeopt.optimizer import (
+    Optimization, OptimizationResult, REMOVED, CONST_0, CONST_1)
 from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
 from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
@@ -16,6 +16,21 @@
 from rpython.rtyper import rclass
 import math
 
+
+class CallLoopinvariantOptimizationResult(OptimizationResult):
+    def __init__(self, opt, op, old_op):
+        OptimizationResult.__init__(self, opt, op)
+        self.old_op = old_op
+
+    def callback(self):
+        self._callback(self.op, self.old_op)
+
+    def _callback(self, op, old_op):
+        key = make_hashable_int(op.getarg(0).getint())
+        self.opt.loop_invariant_producer[key] = self.opt.optimizer.getlastop()
+        self.opt.loop_invariant_results[key] = old_op
+
+
 class OptRewrite(Optimization):
     """Rewrite operations into equivalent, cheaper operations.
        This includes already executed operations and constants.
@@ -522,21 +537,12 @@
         # there is no reason to have a separate operation for this
         newop = self.replace_op_with(op,
                                      OpHelpers.call_for_descr(op.getdescr()))
-        return self.emit(newop, self.postprocess_CALL_LOOPINVARIANT_I, op)
-
-    def postprocess_CALL_LOOPINVARIANT_I(self, op, oldop):
-        key = make_hashable_int(op.getarg(0).getint())
-        self.loop_invariant_producer[key] = self.optimizer.getlastop()
-        self.loop_invariant_results[key] = oldop
+        return self.emit_result(CallLoopinvariantOptimizationResult(self, newop, op))
 
     optimize_CALL_LOOPINVARIANT_R = optimize_CALL_LOOPINVARIANT_I
     optimize_CALL_LOOPINVARIANT_F = optimize_CALL_LOOPINVARIANT_I
     optimize_CALL_LOOPINVARIANT_N = optimize_CALL_LOOPINVARIANT_I
 
-    postprocess_CALL_LOOPINVARIANT_R = postprocess_CALL_LOOPINVARIANT_I
-    postprocess_CALL_LOOPINVARIANT_F = postprocess_CALL_LOOPINVARIANT_I
-    postprocess_CALL_LOOPINVARIANT_N = postprocess_CALL_LOOPINVARIANT_I
-
     def optimize_COND_CALL(self, op):
         arg = op.getarg(0)
         b = self.getintbound(arg)


More information about the pypy-commit mailing list