Author: Berkin Ilbeyi <[email protected]>
Branch: fold-arith-ops
Changeset: r77438:9eaddf08db80
Date: 2015-05-20 16:06 -0400
http://bitbucket.org/pypy/pypy/changeset/9eaddf08db80/

Log:    remove multiple adds on add chains ("1 + 1 + 1 + ...")

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
@@ -125,6 +125,40 @@
     def optimize_INT_ADD(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
+
+        if v2.is_constant():
+            try:
+                prod_op = self.optimizer.producer[op.getarg(0)]
+                if prod_op.getopnum() == rop.INT_ADD:
+                    prod_v1 = self.getvalue(prod_op.getarg(0))
+                    prod_v2 = self.getvalue(prod_op.getarg(1))
+                    if prod_v2.is_constant():
+                        arg1 = prod_op.getarg(0)
+                        arg2 = ConstInt(v2.box.getint() + prod_v2.box.getint())
+                        op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2])
+                    elif prod_v1.is_constant():
+                        arg1 = prod_op.getarg(1)
+                        arg2 = ConstInt(v2.box.getint() + prod_v1.box.getint())
+                        op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2])
+            except KeyError:
+                pass
+        if v1.is_constant():
+            try:
+                prod_op = self.optimizer.producer[op.getarg(1)]
+                if prod_op.getopnum() == rop.INT_ADD:
+                    prod_v1 = self.getvalue(prod_op.getarg(0))
+                    prod_v2 = self.getvalue(prod_op.getarg(1))
+                    if prod_v2.is_constant():
+                        arg1 = prod_op.getarg(0)
+                        arg2 = ConstInt(v1.box.getint() + prod_v2.box.getint())
+                        op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2])
+                    elif prod_v1.is_constant():
+                        arg1 = prod_op.getarg(1)
+                        arg2 = ConstInt(v1.box.getint() + prod_v1.box.getint())
+                        op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2])
+            except KeyError:
+                pass
+
         self.emit_operation(op)
         r = self.getvalue(op.result)
         b = v1.getintbound().add_bound(v2.getintbound())
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to