Author: Jeremy Thurgood <fir...@gmail.com> Branch: unrecursive-opt Changeset: r79977:c1e114708b34 Date: 2015-10-04 16:39 +0200 http://bitbucket.org/pypy/pypy/changeset/c1e114708b34/
Log: Move rewrite callbacks to postprocess pass, one test fails. diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py --- a/rpython/jit/metainterp/optimizeopt/intbounds.py +++ b/rpython/jit/metainterp/optimizeopt/intbounds.py @@ -38,16 +38,6 @@ return n -class IntBoundsCallbackArgs(object): - def __init__(self, op, callback_func=None): - self.op = op - self.callback_func = callback_func - - def callback(self): - if self.callback_func is not None: - self.callback_func(self.op) - - class OptIntBounds(Optimization): """Keeps track of the bounds placed on integers by guards and remove redundant guards""" @@ -58,8 +48,8 @@ def propagate_forward(self, op): return dispatch_opt(self, op) - def propagate_postprocess(self, op): - return dispatch_postprocess(self, op) + def propagate_postprocess(self, op, oldop): + return dispatch_postprocess(self, op, oldop) def propagate_bounds_backward(self, box): # FIXME: This takes care of the instruction where box is the reuslt @@ -75,7 +65,7 @@ def _optimize_guard_true_false_value(self, op): return op - def _postprocess_guard_true_false_value(self, op): + def _postprocess_guard_true_false_value(self, op, oldop): if op.getarg(0).type == 'i': self.propagate_bounds_backward(op.getarg(0)) @@ -98,7 +88,7 @@ return None return op - def postprocess_INT_OR_or_XOR(self, op): + def postprocess_INT_OR_or_XOR(self, op, oldop): v1 = self.get_box_replacement(op.getarg(0)) b1 = self.getintbound(v1) v2 = self.get_box_replacement(op.getarg(1)) @@ -118,7 +108,7 @@ def optimize_INT_AND(self, op): return op - def postprocess_INT_AND(self, op): + def postprocess_INT_AND(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) r = self.getintbound(op) @@ -137,7 +127,7 @@ def optimize_INT_SUB(self, op): return op - def postprocess_INT_SUB(self, op): + def postprocess_INT_SUB(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) b = b1.sub_bound(b2) @@ -184,7 +174,7 @@ return op - def postprocess_INT_ADD(self, op): + def postprocess_INT_ADD(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) r = self.getintbound(op) @@ -195,7 +185,7 @@ def optimize_INT_MUL(self, op): return op - def postprocess_INT_MUL(self, op): + def postprocess_INT_MUL(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) r = self.getintbound(op) @@ -206,7 +196,7 @@ def optimize_INT_FLOORDIV(self, op): return op - def postprocess_INT_FLOORDIV(self, op): + def postprocess_INT_FLOORDIV(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) r = self.getintbound(op) @@ -227,7 +217,7 @@ args=[arg1, arg2]) return op - def postprocess_INT_MOD(self, op): + def postprocess_INT_MOD(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) known_nonneg = (b1.known_ge(IntBound(0, 0)) and @@ -248,7 +238,7 @@ def optimize_INT_LSHIFT(self, op): return op - def postprocess_INT_LSHIFT(self, op): + def postprocess_INT_LSHIFT(self, op, oldop): arg0 = self.get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg0) arg1 = self.get_box_replacement(op.getarg(1)) @@ -274,7 +264,7 @@ return None return op - def postprocess_INT_RSHIFT(self, op): + def postprocess_INT_RSHIFT(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) b = b1.rshift_bound(b2) @@ -331,7 +321,7 @@ op = self.replace_op_with(op, rop.INT_ADD) return op - def postprocess_INT_ADD_OVF(self, op): + def postprocess_INT_ADD_OVF(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) resbound = b1.add_bound(b2) @@ -351,7 +341,7 @@ op = self.replace_op_with(op, rop.INT_SUB) return op - def postprocess_INT_SUB_OVF(self, op): + def postprocess_INT_SUB_OVF(self, op, oldop): arg0 = self.get_box_replacement(op.getarg(0)) arg1 = self.get_box_replacement(op.getarg(1)) b0 = self.getintbound(arg0) @@ -368,7 +358,7 @@ op = self.replace_op_with(op, rop.INT_MUL) return op - def postprocess_INT_MUL_OVF(self, op): + def postprocess_INT_MUL_OVF(self, op, oldop): b1 = self.getintbound(op.getarg(0)) b2 = self.getintbound(op.getarg(1)) resbound = b1.mul_bound(b2) @@ -469,7 +459,7 @@ else: return op - def postprocess_INT_SIGNEXT(self, op): + def postprocess_INT_SIGNEXT(self, op, oldop): numbits = op.getarg(1).getint() * 8 start = -(1 << (numbits - 1)) stop = 1 << (numbits - 1) @@ -480,14 +470,14 @@ def optimize_ARRAYLEN_GC(self, op): return op - def postprocess_ARRAYLEN_GC(self, op): + def postprocess_ARRAYLEN_GC(self, op, oldop): array = self.ensure_ptr_info_arg0(op) self.optimizer.setintbound(op, array.getlenbound(None)) def optimize_STRLEN(self, op): return op - def postprocess_STRLEN(self, op): + def postprocess_STRLEN(self, op, oldop): self.make_nonnull_str(op.getarg(0), vstring.mode_string) array = self.getptrinfo(op.getarg(0)) self.optimizer.setintbound(op, array.getlenbound(vstring.mode_string)) @@ -495,7 +485,7 @@ def optimize_UNICODELEN(self, op): return op - def postprocess_UNICODELEN(self, op): + def postprocess_UNICODELEN(self, op, oldop): self.make_nonnull_str(op.getarg(0), vstring.mode_unicode) array = self.getptrinfo(op.getarg(0)) self.optimizer.setintbound(op, array.getlenbound(vstring.mode_unicode)) @@ -503,7 +493,7 @@ def optimize_STRGETITEM(self, op): return op - def postprocess_STRGETITEM(self, op): + def postprocess_STRGETITEM(self, op, oldop): v1 = self.getintbound(op) v2 = self.getptrinfo(op.getarg(0)) intbound = self.getintbound(op.getarg(1)) @@ -517,7 +507,7 @@ def optimize_GETFIELD_RAW_I(self, op): return op - def postprocess_GETFIELD_RAW_I(self, op): + def postprocess_GETFIELD_RAW_I(self, op, oldop): descr = op.getdescr() if descr.is_integer_bounded(): b1 = self.getintbound(op) @@ -547,7 +537,7 @@ def optimize_GETARRAYITEM_RAW_I(self, op): return op - def postprocess_GETARRAYITEM_RAW_I(self, op): + def postprocess_GETARRAYITEM_RAW_I(self, op, oldop): descr = op.getdescr() if descr and descr.is_item_integer_bounded(): intbound = self.getintbound(op) @@ -567,7 +557,7 @@ def optimize_UNICODEGETITEM(self, op): return op - def postprocess_UNICODEGETITEM(self, op): + def postprocess_UNICODEGETITEM(self, op, oldop): b1 = self.getintbound(op) b1.make_ge(IntLowerBound(0)) v2 = self.getptrinfo(op.getarg(0)) 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 @@ -272,7 +272,7 @@ def set_optimizations(self, optimizations): if optimizations: - self.first_optimization = optimizations[1] + self.first_optimization = optimizations[2] for i in range(1, len(optimizations)): optimizations[i - 1].next_optimization = optimizations[i] optimizations[-1].next_optimization = self @@ -538,12 +538,15 @@ op.set_forwarded(None) def send_extra_operation(self, op): - newop = self.optimizations[0].propagate_forward(op) - if newop is None: - return - self.optimizations[0].last_emitted_operation = newop - self.first_optimization.propagate_forward(newop) - self.optimizations[0].propagate_postprocess(newop) + oldop = op + for optimization in self.optimizations[:2]: + op = optimization.propagate_forward(op) + if op is None: + return + optimization.last_emitted_operation = op + self.first_optimization.propagate_forward(op) + for optimization in reversed(self.optimizations[:2]): + optimization.propagate_postprocess(op, oldop) def propagate_forward(self, op): dispatch_opt(self, op) 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 @@ -24,6 +24,9 @@ self.loop_invariant_results = {} self.loop_invariant_producer = {} + def opt_default(self, op): + return op + def setup(self): self.optimizer.optrewrite = self @@ -36,7 +39,10 @@ if self.find_rewritable_bool(op): return - dispatch_opt(self, op) + return dispatch_opt(self, op) + + def propagate_postprocess(self, op, oldop): + return dispatch_postprocess(self, op, oldop) def try_boolinvers(self, op, targs): oldop = self.get_pure_result(targs) @@ -97,7 +103,7 @@ self.make_equal_to(op, op.getarg(1)) return - self.emit_operation(op) + return op def optimize_INT_OR(self, op): b1 = self.getintbound(op.getarg(0)) @@ -107,7 +113,7 @@ elif b2.equal(0): self.make_equal_to(op, op.getarg(0)) else: - self.emit_operation(op) + return op def optimize_INT_SUB(self, op): arg1 = self.get_box_replacement(op.getarg(0)) @@ -118,20 +124,18 @@ self.make_equal_to(op, arg1) elif b1.equal(0): op = self.replace_op_with(op, rop.INT_NEG, args=[arg2]) - self.emit_operation(op) + return op elif arg1.same_box(arg2): self.make_constant_int(op, 0) else: - self.emit_operation(op) - self.optimize_INT_SUB_callback(op) + return op - def optimize_INT_SUB_callback(self, op): + def postprocess_INT_SUB(self, op, oldop): self.optimizer.pure_reverse(op) def optimize_INT_ADD(self, op): if self.is_raw_ptr(op.getarg(0)) or self.is_raw_ptr(op.getarg(1)): - self.emit_operation(op) - return + return op arg1 = self.get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg1) arg2 = self.get_box_replacement(op.getarg(1)) @@ -143,10 +147,9 @@ elif b2.equal(0): self.make_equal_to(op, arg1) else: - self.emit_operation(op) - self.optimize_INT_ADD_callback(op) + return op - def optimize_INT_ADD_callback(self, op): + def postprocess_INT_ADD(self, op, oldop): self.optimizer.pure_reverse(op) def optimize_INT_MUL(self, op): @@ -172,7 +175,7 @@ new_rhs = ConstInt(highest_bit(lh_info.getint())) op = self.replace_op_with(op, rop.INT_LSHIFT, args=[rhs, new_rhs]) break - self.emit_operation(op) + return op def optimize_UINT_FLOORDIV(self, op): b2 = self.getintbound(op.getarg(1)) @@ -180,7 +183,7 @@ if b2.is_constant() and b2.getint() == 1: self.make_equal_to(op, op.getarg(0)) else: - self.emit_operation(op) + return op def optimize_INT_LSHIFT(self, op): b1 = self.getintbound(op.getarg(0)) @@ -191,7 +194,7 @@ elif b1.is_constant() and b1.getint() == 0: self.make_constant_int(op, 0) else: - self.emit_operation(op) + return op def optimize_INT_RSHIFT(self, op): b1 = self.getintbound(op.getarg(0)) @@ -202,7 +205,7 @@ elif b1.is_constant() and b1.getint() == 0: self.make_constant_int(op, 0) else: - self.emit_operation(op) + return op def optimize_INT_XOR(self, op): b1 = self.getintbound(op.getarg(0)) @@ -213,7 +216,7 @@ elif b2.equal(0): self.make_equal_to(op, op.getarg(0)) else: - self.emit_operation(op) + return op def optimize_FLOAT_MUL(self, op): arg1 = op.getarg(0) @@ -231,12 +234,10 @@ return elif v1.getfloat() == -1.0: newop = self.replace_op_with(op, rop.FLOAT_NEG, args=[rhs]) - self.emit_operation(newop) - return - self.emit_operation(op) - self.optimize_FLOAT_MUL_callback(op) + return newop + return op - def optimize_FLOAT_MUL_callback(self, op): + def postprocess_FLOAT_MUL(self, op, oldop): self.optimizer.pure_reverse(op) def optimize_FLOAT_TRUEDIV(self, op): @@ -258,16 +259,15 @@ c = ConstFloat(longlong.getfloatstorage(reciprocal)) newop = self.replace_op_with(op, rop.FLOAT_MUL, args=[arg1, c]) - self.emit_operation(newop) + return newop def optimize_FLOAT_NEG(self, op): - self.emit_operation(op) - self.optimize_FLOAT_NEG_callback(op) + return op - def optimize_FLOAT_NEG_callback(self, op): + def postprocess_FLOAT_NEG(self, op, oldop): self.optimizer.pure_reverse(op) - def optimize_guard(self, op, constbox, emit_operation=True): + def optimize_guard(self, op, constbox): box = op.getarg(0) if box.type == 'i': intbound = self.getintbound(box) @@ -288,14 +288,7 @@ 'was proven to always fail' % r) return - if emit_operation: - self.emit_operation(op) - self.optimize_guard_callback(op, box, constbox) - else: - self.optimize_guard_callback(op, box, constbox) - - def optimize_guard_callback(self, op, box, constbox): - self.make_constant(box, constbox) + return op def optimize_GUARD_ISNULL(self, op): info = self.getptrinfo(op.getarg(0)) @@ -306,10 +299,9 @@ r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) raise InvalidLoop('A GUARD_ISNULL (%s) was proven to always ' 'fail' % r) - self.emit_operation(op) - self.optimize_GUARD_ISNULL_callback(op) + return op - def optimize_GUARD_ISNULL_callback(self, op): + def postprocess_GUARD_ISNULL(self, op, oldop): self.make_constant(op.getarg(0), self.optimizer.cpu.ts.CONST_NULL) def optimize_GUARD_IS_OBJECT(self, op): @@ -326,7 +318,7 @@ return if info.is_precise(): raise InvalidLoop() - self.emit_operation(op) + return op def optimize_GUARD_GC_TYPE(self, op): info = self.getptrinfo(op.getarg(0)) @@ -340,7 +332,7 @@ if info.get_descr().get_type_id() != op.getarg(1).getint(): raise InvalidLoop("wrong GC types passed around!") return - self.emit_operation(op) + return op def _check_subclass(self, vtable1, vtable2): # checks that vtable1 is a subclass of vtable2 @@ -374,7 +366,7 @@ if self._check_subclass(info.get_descr().get_vtable(), op.getarg(1).getint()): return - self.emit_operation(op) + return op def optimize_GUARD_NONNULL(self, op): opinfo = self.getptrinfo(op.getarg(0)) @@ -385,10 +377,9 @@ r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) raise InvalidLoop('A GUARD_NONNULL (%s) was proven to always ' 'fail' % r) - self.emit_operation(op) - self.optimize_GUARD_NONNULL_callback(op) + return op - def optimize_GUARD_NONNULL_callback(self, op): + def postprocess_GUARD_NONNULL(self, op, oldop): self.make_nonnull(op.getarg(0)) self.getptrinfo(op.getarg(0)).mark_last_guard(self.optimizer) @@ -409,7 +400,11 @@ return constbox = op.getarg(1) assert isinstance(constbox, Const) - self.optimize_guard(op, constbox) + return self.optimize_guard(op, constbox) + + def postprocess_GUARD_VALUE(self, op, oldop): + box = self.get_box_replacement(op.getarg(0)) + self.make_constant(box, op.getarg(1)) def replace_guard_class_with_guard_value(self, op, info, old_guard_op): if old_guard_op.opnum != rop.GUARD_NONNULL: @@ -437,10 +432,18 @@ return op def optimize_GUARD_TRUE(self, op): - self.optimize_guard(op, CONST_1) + return self.optimize_guard(op, CONST_1) + + def postprocess_GUARD_TRUE(self, op, oldop): + box = self.get_box_replacement(op.getarg(0)) + self.make_constant(box, CONST_1) def optimize_GUARD_FALSE(self, op): - self.optimize_guard(op, CONST_0) + return self.optimize_guard(op, CONST_0) + + def postprocess_GUARD_FALSE(self, op, oldop): + box = self.get_box_replacement(op.getarg(0)) + self.make_constant(box, CONST_0) def optimize_RECORD_EXACT_CLASS(self, op): opinfo = self.getptrinfo(op.getarg(0)) @@ -483,17 +486,16 @@ # not put in short preambles guard_nonnull and guard_class # on the same box. self.optimizer.replace_guard(op, info) - self.emit_operation(op) - self.optimize_GUARD_CLASS_callback_1(op, expectedclassbox) - return - self.emit_operation(op) - self.optimize_GUARD_CLASS_callback_2(op, expectedclassbox) + return op + return op - def optimize_GUARD_CLASS_callback_1(self, op, expectedclassbox): - self.make_constant_class(op.getarg(0), expectedclassbox, False) - - def optimize_GUARD_CLASS_callback_2(self, op, expectedclassbox): - self.make_constant_class(op.getarg(0), expectedclassbox) + def postprocess_GUARD_CLASS(self, op, oldop): + expectedclassbox = op.getarg(1) + info = self.getptrinfo(op.getarg(0)) + old_guard_op = info.get_last_guard(self.optimizer) + update_last_guard = not old_guard_op or isinstance( + old_guard_op.getdescr(), compile.ResumeAtPositionDescr) + self.make_constant_class(op.getarg(0), expectedclassbox, update_last_guard) def optimize_GUARD_NONNULL_CLASS(self, op): info = self.getptrinfo(op.getarg(0)) @@ -501,7 +503,9 @@ r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) raise InvalidLoop('A GUARD_NONNULL_CLASS (%s) was proven to ' 'always fail' % r) - self.optimize_GUARD_CLASS(op) + return self.optimize_GUARD_CLASS(op) + + postprocess_GUARD_NONNULL_CLASS = postprocess_GUARD_CLASS def optimize_CALL_LOOPINVARIANT_I(self, op): arg = op.getarg(0) @@ -521,16 +525,21 @@ # there is no reason to have a separate operation for this newop = self.replace_op_with(op, OpHelpers.call_for_descr(op.getdescr())) - self.emit_operation(newop) - self.optimize_CALL_LOOPINVARIANT_I_callback(newop, op, key) + return op - def optimize_CALL_LOOPINVARIANT_I_callback(self, newop, op, key): + 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] = op + self.loop_invariant_results[key] = oldop + 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) @@ -540,7 +549,7 @@ return opnum = OpHelpers.call_for_type(op.type) op = op.copy_and_change(opnum, args=op.getarglist()[1:]) - self.emit_operation(op) + return op def _optimize_nullness(self, op, box, expect_nonnull): info = self.getnullness(box) @@ -549,17 +558,17 @@ elif info == INFO_NULL: self.make_constant_int(op, not expect_nonnull) else: - self.emit_operation(op) + return op def optimize_INT_IS_TRUE(self, op): if (not self.is_raw_ptr(op.getarg(0)) and self.getintbound(op.getarg(0)).is_bool()): self.make_equal_to(op, op.getarg(0)) return - self._optimize_nullness(op, op.getarg(0), True) + return self._optimize_nullness(op, op.getarg(0), True) def optimize_INT_IS_ZERO(self, op): - self._optimize_nullness(op, op.getarg(0), False) + return self._optimize_nullness(op, op.getarg(0), False) def _optimize_oois_ooisnot(self, op, expect_isnot, instance): arg0 = self.get_box_replacement(op.getarg(0)) @@ -575,9 +584,9 @@ elif info1 and info1.is_virtual(): self.make_constant_int(op, expect_isnot) elif info1 and info1.is_null(): - self._optimize_nullness(op, op.getarg(0), expect_isnot) + return self._optimize_nullness(op, op.getarg(0), expect_isnot) elif info0 and info0.is_null(): - self._optimize_nullness(op, op.getarg(1), expect_isnot) + return self._optimize_nullness(op, op.getarg(1), expect_isnot) elif arg0 is arg1: self.make_constant_int(op, not expect_isnot) else: @@ -596,19 +605,19 @@ # class is different self.make_constant_int(op, expect_isnot) return - self.emit_operation(op) + return op def optimize_PTR_EQ(self, op): - self._optimize_oois_ooisnot(op, False, False) + return self._optimize_oois_ooisnot(op, False, False) def optimize_PTR_NE(self, op): - self._optimize_oois_ooisnot(op, True, False) + return self._optimize_oois_ooisnot(op, True, False) def optimize_INSTANCE_PTR_EQ(self, op): - self._optimize_oois_ooisnot(op, False, True) + return self._optimize_oois_ooisnot(op, False, True) def optimize_INSTANCE_PTR_NE(self, op): - self._optimize_oois_ooisnot(op, True, True) + return self._optimize_oois_ooisnot(op, True, True) def optimize_CALL_N(self, op): # dispatch based on 'oopspecindex' to a method that handles @@ -617,14 +626,13 @@ effectinfo = op.getdescr().get_extra_info() oopspecindex = effectinfo.oopspecindex if oopspecindex == EffectInfo.OS_ARRAYCOPY: - if self._optimize_CALL_ARRAYCOPY(op): - return - self.emit_operation(op) + return self._optimize_CALL_ARRAYCOPY(op) + return op def _optimize_CALL_ARRAYCOPY(self, op): length = self.get_constant_box(op.getarg(5)) if length and length.getint() == 0: - return True # 0-length arraycopy + return None # 0-length arraycopy source_info = self.getptrinfo(op.getarg(1)) dest_info = self.getptrinfo(op.getarg(2)) @@ -640,7 +648,7 @@ dest_start = dest_start_box.getint() arraydescr = extrainfo.write_descrs_arrays[0] if arraydescr.is_array_of_structs(): - return False # not supported right now + return op # not supported right now # XXX fish fish fish for index in range(length.getint()): @@ -666,9 +674,9 @@ ConstInt(index + dest_start), val], descr=arraydescr) - self.emit_operation(newop) - return True - return False + self.optimizer.send_extra_operation(newop) + return None + return op def optimize_CALL_PURE_I(self, op): # this removes a CALL_PURE with all constant arguments. @@ -678,7 +686,8 @@ self.make_constant(op, result) self.last_emitted_operation = REMOVED return - self.emit_operation(op) + return op + optimize_CALL_PURE_R = optimize_CALL_PURE_I optimize_CALL_PURE_F = optimize_CALL_PURE_I optimize_CALL_PURE_N = optimize_CALL_PURE_I @@ -688,7 +697,7 @@ # it was a CALL_PURE or a CALL_LOOPINVARIANT that was killed; # so we also kill the following GUARD_NO_EXCEPTION return - self.emit_operation(op) + return op def optimize_GUARD_FUTURE_CONDITION(self, op): self.optimizer.notice_guard_future_condition(op) @@ -710,15 +719,15 @@ if val & (val - 1) == 0 and val > 0: # val == 2**shift op = self.replace_op_with(op, rop.INT_RSHIFT, args = [op.getarg(0), ConstInt(highest_bit(val))]) - self.emit_operation(op) + return op def optimize_CAST_PTR_TO_INT(self, op): self.optimizer.pure_reverse(op) - self.emit_operation(op) + return op def optimize_CAST_INT_TO_PTR(self, op): self.optimizer.pure_reverse(op) - self.emit_operation(op) + return op def optimize_SAME_AS_I(self, op): self.make_equal_to(op, op.getarg(0)) @@ -726,5 +735,6 @@ optimize_SAME_AS_F = optimize_SAME_AS_I dispatch_opt = make_dispatcher_method(OptRewrite, 'optimize_', - default=OptRewrite.emit_operation) + default=OptRewrite.opt_default) optimize_guards = _findall(OptRewrite, 'optimize_', 'GUARD') +dispatch_postprocess = make_dispatcher_method(OptRewrite, 'postprocess_') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit