Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77534:70ed6b31b685
Date: 2015-05-25 13:43 +0200
http://bitbucket.org/pypy/pypy/changeset/70ed6b31b685/

Log:    improve the situation for some arithmetic operations

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
@@ -127,13 +127,13 @@
             r.intersect(b)
 
     def optimize_INT_MUL(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op)
-        b = v1.getintbound().mul_bound(v2.getintbound())
+        r = self.getintbound(op)
+        b = b1.mul_bound(b2)
         if b.bounded():
-            r.getintbound().intersect(b)
+            r.intersect(b)
 
     def optimize_INT_FLOORDIV(self, op):
         v1 = self.getvalue(op.getarg(0))
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
@@ -107,15 +107,16 @@
 
     def optimize_INT_SUB(self, op):
         arg1 = self.get_box_replacement(op.getarg(0))
+        b1 = self.getintbound(arg1)
         arg2 = self.get_box_replacement(op.getarg(1))
-        if arg2.is_constant() and arg2.getint() == 0:
-            xxx
-            self.make_equal_to(op, v1)
-        elif arg1.is_constant() and arg1.getint() == 0:
+        b2 = self.getintbound(arg2)
+        if b2.equal(0):
+            self.make_equal_to(op, arg1)
+        elif b1.equal(0):
             xxx
             op = self.replace_op_with(op, rop.INT_NEG, args=[v2.box])
             self.emit_operation(op)
-        elif arg1 is arg2:
+        elif arg1.same_box(arg2):
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
@@ -123,33 +124,36 @@
 
     def optimize_INT_ADD(self, op):
         arg1 = self.get_box_replacement(op.getarg(0))
+        b1 = self.getintbound(arg1)
         arg2 = self.get_box_replacement(op.getarg(1))
+        b2 = self.getintbound(arg2)
 
         # If one side of the op is 0 the result is the other side.
-        if arg1.is_constant() and arg1.getint() == 0:
+        if b1.equal(0):
             self.make_equal_to(op, arg2)
-        elif arg2.is_constant() and arg2.getint() == 0:
+        elif b2.equal(0):
             self.make_equal_to(op, arg1)
         else:
             self.emit_operation(op)
             self.optimizer.pure_reverse(op)
 
     def optimize_INT_MUL(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
+        arg1 = self.get_box_replacement(op.getarg(0))
+        b1 = self.getintbound(arg1)
+        arg2 = self.get_box_replacement(op.getarg(1))
+        b2 = self.getintbound(arg2)
 
         # If one side of the op is 1 the result is the other side.
-        if v1.is_constant() and v1.box.getint() == 1:
-            self.make_equal_to(op, v2)
-        elif v2.is_constant() and v2.box.getint() == 1:
-            self.make_equal_to(op, v1)
-        elif (v1.is_constant() and v1.box.getint() == 0) or \
-             (v2.is_constant() and v2.box.getint() == 0):
+        if b1.equal(1):
+            self.make_equal_to(op, arg2)
+        elif b2.equal(1):
+            self.make_equal_to(op, arg1)
+        elif b1.equal(0) or b2.equal(0):
             self.make_constant_int(op, 0)
         else:
-            for lhs, rhs in [(v1, v2), (v2, v1)]:
+            for lhs, rhs in [(b1, b2), (b2, b1)]:
                 if lhs.is_constant():
-                    x = lhs.box.getint()
+                    x = lhs.getint()
                     # x & (x - 1) == 0 is a quick test for power of 2
                     if x & (x - 1) == 0:
                         new_rhs = ConstInt(highest_bit(lhs.box.getint()))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to