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