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

Reply via email to