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