[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