Author: Maciej Fijalkowski <[email protected]>
Branch: optmodel-refactor
Changeset: r66181:775cba7b3be1
Date: 2013-08-15 00:02 +0200
http://bitbucket.org/pypy/pypy/changeset/775cba7b3be1/

Log:    start refactoring optimizeopt

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
@@ -510,5 +510,5 @@
 
 
 dispatch_opt = make_dispatcher_method(OptHeap, 'optimize_',
-        default=OptHeap.emit_operation)
+        emit_op=True)
 OptHeap.propagate_forward = dispatch_opt
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
@@ -19,10 +19,6 @@
     def propagate_forward(self, op):
         dispatch_opt(self, op)
 
-    def opt_default(self, op):
-        assert not op.is_ovf()
-        self.emit_operation(op)
-
     def propagate_bounds_backward(self, box):
         # FIXME: This takes care of the instruction where box is the reuslt
         #        but the bounds produced by all instructions where box is
@@ -473,6 +469,5 @@
     propagate_bounds_INT_MUL_OVF = propagate_bounds_INT_MUL
 
 
-dispatch_opt = make_dispatcher_method(OptIntBounds, 'optimize_',
-        default=OptIntBounds.opt_default)
+dispatch_opt = make_dispatcher_method(OptIntBounds, 'optimize_', emit_op=True)
 dispatch_bounds_ops = make_dispatcher_method(OptIntBounds, 'propagate_bounds_')
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
@@ -372,6 +372,7 @@
             for i in range(1, len(optimizations)):
                 optimizations[i - 1].next_optimization = optimizations[i]
             optimizations[-1].next_optimization = self
+
             for o in optimizations:
                 o.optimizer = self
                 o.last_emitted_operation = None
@@ -514,6 +515,22 @@
             self.clear_newoperations()
         for op in self.loop.operations:
             self.first_optimization.propagate_forward(op)
+            #            for opt in self.optimizations:
+            #    func = getattr(opt, 'optimize_' + op.getopname().upper(), 
None)
+            #    if func is not None:
+            #        op = func(op)
+            #        if op is None:
+            #            break
+            #        op = opt.emitted_operation(op)
+            #        if op is None:
+            #            break
+            #else:
+            #    self._emit_operation(op)
+            #for opt in self.optimizations:
+            #    func = getattr(opt, 'postprocess_' + op.getopname().upper(),
+            #                   None)
+            #    if func:
+            #       func(op)
         self.loop.operations = self.get_newoperations()
         self.loop.quasi_immutable_deps = self.quasi_immutable_deps
         # accumulate counters
@@ -623,9 +640,6 @@
         args[n + 1] = op.getdescr()
         return args
 
-    def optimize_default(self, op):
-        self.emit_operation(op)
-
     def constant_fold(self, op):
         argboxes = [self.get_constant_box(op.getarg(i))
                     for i in range(op.numargs())]
@@ -647,21 +661,21 @@
         if indexvalue.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), 
indexvalue.box.getint())
-        self.optimize_default(op)
+        self.emit_operation(op)
 
     def optimize_STRGETITEM(self, op):
         indexvalue = self.getvalue(op.getarg(1))
         if indexvalue.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_STR, op.getdescr(), 
indexvalue.box.getint())
-        self.optimize_default(op)
+        self.emit_operation(op)
 
     def optimize_UNICODEGETITEM(self, op):
         indexvalue = self.getvalue(op.getarg(1))
         if indexvalue.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_UNICODE, op.getdescr(), 
indexvalue.box.getint())
-        self.optimize_default(op)
+        self.emit_operation(op)
 
     # These are typically removed already by OptRewrite, but it can be
     # dissabled and unrolling emits some SAME_AS ops to setup the
@@ -673,8 +687,7 @@
         value = self.getvalue(op.getarg(0))
         self.optimizer.opaque_pointers[value] = True
 
-dispatch_opt = make_dispatcher_method(Optimizer, 'optimize_',
-        default=Optimizer.optimize_default)
+dispatch_opt = make_dispatcher_method(Optimizer, 'optimize_', emit_op=True)
 
 
 
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
@@ -52,7 +52,7 @@
         # otherwise, the operation remains
         self.emit_operation(op)
         if op.returns_bool_result():
-            self.optimizer.bool_boxes[self.getvalue(op.result)] = None        
+            self.optimizer.bool_boxes[self.getvalue(op.result)] = None
         if nextop:
             self.emit_operation(nextop)
 
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
@@ -526,5 +526,5 @@
         self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
 
 dispatch_opt = make_dispatcher_method(OptRewrite, 'optimize_',
-        default=OptRewrite.emit_operation)
+        emit_op=True)
 optimize_guards = _findall(OptRewrite, 'optimize_', 'GUARD')
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py 
b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -10,6 +10,7 @@
 
     def emit_operation(self, op):
         if op.is_guard():
+            # XXX WTF is that?
             if self.optimizer.pendingfields is None:
                 self.optimizer.pendingfields = []
         Optimization.emit_operation(self, op)
@@ -45,7 +46,7 @@
                 return self.optimize_JUMP(op.copy_and_change(rop.JUMP))
             self.last_label_descr = op.getdescr()
         self.emit_operation(op)
-        
+
     def optimize_JUMP(self, op):
         if not self.unroll:
             descr = op.getdescr()
@@ -61,6 +62,5 @@
                 op.setdescr(descr.target_tokens[0])
         self.emit_operation(op)
 
-dispatch_opt = make_dispatcher_method(OptSimplify, 'optimize_',
-        default=OptSimplify.emit_operation)
+dispatch_opt = make_dispatcher_method(OptSimplify, 'optimize_', emit_op=True)
 OptSimplify.propagate_forward = dispatch_opt
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py 
b/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py
@@ -490,7 +490,7 @@
         self.make_equal_to(op.result, self.getvalue(newop.result))
 
 dispatch_opt = make_dispatcher_method(OptRenameStrlen, 'optimize_',
-                                      default=OptRenameStrlen.emit_operation)
+                                      emit_op=True)
 
 class BaseTestOptimizerRenamingBoxes(BaseTestMultiLabel):
 
diff --git a/rpython/jit/metainterp/optimizeopt/util.py 
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -26,7 +26,8 @@
             result.append((value, opclass, getattr(Class, name_prefix + name)))
     return unrolling_iterable(result)
 
-def make_dispatcher_method(Class, name_prefix, op_prefix=None, default=None):
+def make_dispatcher_method(Class, name_prefix, op_prefix=None, emit_op=False,
+                           default=None):
     ops = _findall(Class, name_prefix, op_prefix)
     def dispatch(self, op, *args):
         if we_are_translated():
@@ -37,12 +38,16 @@
                     return func(self, op, *args)
             if default:
                 return default(self, op, *args)
+            elif emit_op:
+                return self.emit_operation(op, *args)
         else:
             func = getattr(Class, name_prefix + op.getopname().upper(), None)
             if func is not None:
                 return func(self, op, *args)
             if default:
                 return default(self, op, *args)
+            elif emit_op:
+                return self.emit_operation(op, *args)
     dispatch.func_name = "dispatch_" + name_prefix
     return dispatch
 
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -826,7 +826,6 @@
         self.emit_operation(op)
 
 
-dispatch_opt = make_dispatcher_method(OptVirtualize, 'optimize_',
-        default=OptVirtualize.emit_operation)
+dispatch_opt = make_dispatcher_method(OptVirtualize, 'optimize_', emit_op=True)
 
 OptVirtualize.propagate_forward = dispatch_opt
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py 
b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -752,8 +752,7 @@
     def propagate_forward(self, op):
         dispatch_opt(self, op)
 
-dispatch_opt = make_dispatcher_method(OptString, 'optimize_',
-        default=OptString.emit_operation)
+dispatch_opt = make_dispatcher_method(OptString, 'optimize_', emit_op=True)
 
 def _findall_call_oopspec():
     prefix = 'opt_call_stroruni_'
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to