[pypy-svn] pypy fold_intadd: Moved optimization.
ademan
commits-noreply at bitbucket.org
Thu Mar 17 02:22:21 CET 2011
Author: Daniel Roberts <Ademan555 at gmail.com>
Branch: fold_intadd
Changeset: r42731:026b2680bc47
Date: 2011-03-16 18:22 -0700
http://bitbucket.org/pypy/pypy/changeset/026b2680bc47/
Log: Moved optimization.
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -7,13 +7,13 @@
from pypy.jit.metainterp.optimizeopt.unroll import optimize_unroll, OptInlineShortPreamble
from pypy.jit.metainterp.optimizeopt.fficall import OptFfiCall
from pypy.jit.metainterp.optimizeopt.simplify import OptSimplify
-from pypy.jit.metainterp.optimizeopt.fold_intadd import OptAddition
+from pypy.jit.metainterp.optimizeopt.addition import OptAddition
from pypy.rlib.jit import PARAMETERS
from pypy.rlib.unroll import unrolling_iterable
ALL_OPTS = [
('intbounds', OptIntBounds),
- ('fold_intadd', OptAddition),
+ ('addition', OptAddition),
('rewrite', OptRewrite),
('virtualize', OptVirtualize),
('string', OptString),
diff --git a/pypy/jit/metainterp/optimizeopt/addition.py b/pypy/jit/metainterp/optimizeopt/addition.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/optimizeopt/addition.py
@@ -0,0 +1,76 @@
+from pypy.jit.metainterp.optimizeopt.optimizer import *
+from pypy.jit.metainterp.resoperation import opboolinvers, opboolreflex
+from pypy.jit.metainterp.history import ConstInt
+from pypy.jit.metainterp.optimizeutil import _findall
+from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.jit.codewriter.effectinfo import EffectInfo
+from pypy.jit.metainterp.optimizeopt.intutils import IntBound
+from pypy.rlib.rarithmetic import highest_bit
+
+class OptAddition(Optimization):
+ def __init__(self):
+ self.args = {}
+
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ return OptAddition()
+
+ def propagate_forward(self, op):
+ opnum = op.getopnum()
+ for value, func in optimize_ops:
+ if opnum == value:
+ func(self, op)
+ break
+ else:
+ self.emit_operation(op)
+
+ def _int_operation(self, variable, constant, result):
+ if constant < 0:
+ constant = ConstInt(-constant)
+ return ResOperation(rop.INT_SUB, [variable, constant], result)
+ else:
+ constant = ConstInt(constant)
+ return ResOperation(rop.INT_ADD, [variable, constant], result)
+
+ def _process_add(self, variable, constant, result):
+ try:
+ root, stored_constant = self.args[variable]
+ constant = constant + stored_constant
+ except KeyError:
+ root = variable
+
+ self.args[result] = root, constant
+
+ new_op = self._int_operation(root, constant, result)
+ self.emit_operation(new_op)
+
+ def optimize_INT_ADD(self, op):
+ lv = self.getvalue(op.getarg(0))
+ rv = self.getvalue(op.getarg(1))
+ result = op.result
+ if lv.is_constant() and rv.is_constant():
+ self.emit_operation(op) # XXX: there's support for optimizing this elsewhere, right?
+ elif lv.is_constant():
+ constant = lv.box.getint()
+ self._process_add(op.getarg(1), constant, result)
+ elif rv.is_constant():
+ constant = rv.box.getint()
+ self._process_add(op.getarg(0), constant, result)
+ else:
+ self.emit_operation(op)
+
+ def optimize_INT_SUB(self, op):
+ lv = self.getvalue(op.getarg(0))
+ rv = self.getvalue(op.getarg(1))
+ result = op.result
+ if lv.is_constant() and rv.is_constant():
+ self.emit_operation(op) # XXX: there's support for optimizing this elsewhere, right?
+ elif lv.is_constant():
+ # TODO: implement?
+ self.emit_operation(op)
+ elif rv.is_constant():
+ constant = rv.box.getint()
+ self._process_add(op.getarg(0), -constant, result)
+ else:
+ self.emit_operation(op)
+
+optimize_ops = _findall(OptAddition, 'optimize_')
diff --git a/pypy/jit/metainterp/optimizeopt/fold_intadd.py b/pypy/jit/metainterp/optimizeopt/fold_intadd.py
deleted file mode 100644
--- a/pypy/jit/metainterp/optimizeopt/fold_intadd.py
+++ /dev/null
@@ -1,76 +0,0 @@
-from pypy.jit.metainterp.optimizeopt.optimizer import *
-from pypy.jit.metainterp.resoperation import opboolinvers, opboolreflex
-from pypy.jit.metainterp.history import ConstInt
-from pypy.jit.metainterp.optimizeutil import _findall
-from pypy.jit.metainterp.resoperation import rop, ResOperation
-from pypy.jit.codewriter.effectinfo import EffectInfo
-from pypy.jit.metainterp.optimizeopt.intutils import IntBound
-from pypy.rlib.rarithmetic import highest_bit
-
-class OptAddition(Optimization):
- def __init__(self):
- self.args = {}
-
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
- return OptAddition()
-
- def propagate_forward(self, op):
- opnum = op.getopnum()
- for value, func in optimize_ops:
- if opnum == value:
- func(self, op)
- break
- else:
- self.emit_operation(op)
-
- def _int_operation(self, variable, constant, result):
- if constant < 0:
- constant = ConstInt(-constant)
- return ResOperation(rop.INT_SUB, [variable, constant], result)
- else:
- constant = ConstInt(constant)
- return ResOperation(rop.INT_ADD, [variable, constant], result)
-
- def _process_add(self, variable, constant, result):
- try:
- root, stored_constant = self.args[variable]
- constant = constant + stored_constant
- except KeyError:
- root = variable
-
- self.args[result] = root, constant
-
- new_op = self._int_operation(root, constant, result)
- self.emit_operation(new_op)
-
- def optimize_INT_ADD(self, op):
- lv = self.getvalue(op.getarg(0))
- rv = self.getvalue(op.getarg(1))
- result = op.result
- if lv.is_constant() and rv.is_constant():
- self.emit_operation(op) # XXX: there's support for optimizing this elsewhere, right?
- elif lv.is_constant():
- constant = lv.box.getint()
- self._process_add(op.getarg(1), constant, result)
- elif rv.is_constant():
- constant = rv.box.getint()
- self._process_add(op.getarg(0), constant, result)
- else:
- self.emit_operation(op)
-
- def optimize_INT_SUB(self, op):
- lv = self.getvalue(op.getarg(0))
- rv = self.getvalue(op.getarg(1))
- result = op.result
- if lv.is_constant() and rv.is_constant():
- self.emit_operation(op) # XXX: there's support for optimizing this elsewhere, right?
- elif lv.is_constant():
- # TODO: implement?
- self.emit_operation(op)
- elif rv.is_constant():
- constant = rv.box.getint()
- self._process_add(op.getarg(0), -constant, result)
- else:
- self.emit_operation(op)
-
-optimize_ops = _findall(OptAddition, 'optimize_')
More information about the Pypy-commit
mailing list