Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77582:c46440015cbe
Date: 2015-05-26 15:19 +0200
http://bitbucket.org/pypy/pypy/changeset/c46440015cbe/

Log:    a few cheap wins

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
@@ -2,7 +2,7 @@
 from rpython.jit.metainterp.history import ConstInt
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.intutils import (IntBound,
-    IntLowerBound, IntUpperBound)
+    IntLowerBound, IntUpperBound, ConstIntBound)
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, 
CONST_1,
     CONST_0)
 from rpython.jit.metainterp.optimizeopt.info import MODE_ARRAY, MODE_STR,\
@@ -143,12 +143,12 @@
         r.intersect(b1.div_bound(b2))
 
     def optimize_INT_MOD(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        known_nonneg = (v1.getintbound().known_ge(IntBound(0, 0)) and
-                        v2.getintbound().known_ge(IntBound(0, 0)))
-        if known_nonneg and v2.is_constant():
-            val = v2.box.getint()
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        known_nonneg = (b1.known_ge(IntBound(0, 0)) and
+                        b2.known_ge(IntBound(0, 0)))
+        if known_nonneg and b2.is_constant():
+            val = b2.getint()
             if (val & (val-1)) == 0:
                 # nonneg % power-of-two ==> nonneg & (power-of-two - 1)
                 arg1 = op.getarg(0)
@@ -156,45 +156,47 @@
                 op = self.replace_op_with(op, rop.INT_AND,
                                           args=[arg1, arg2])
         self.emit_operation(op)
-        if v2.is_constant():
-            val = v2.box.getint()
-            r = self.getvalue(op)
+        if b2.is_constant():
+            val = b2.getint()
+            r = self.getintbound(op)
             if val < 0:
                 if val == -sys.maxint-1:
                     return     # give up
                 val = -val
             if known_nonneg:
-                r.getintbound().make_ge(IntBound(0, 0))
+                r.make_ge(IntBound(0, 0))
             else:
-                r.getintbound().make_gt(IntBound(-val, -val))
-            r.getintbound().make_lt(IntBound(val, val))
+                r.make_gt(IntBound(-val, -val))
+            r.make_lt(IntBound(val, val))
 
     def optimize_INT_LSHIFT(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
+        arg0 = self.get_box_replacement(op.getarg(0))
+        b1 = self.getintbound(arg0)
+        arg1 = self.get_box_replacement(op.getarg(1))
+        b2 = self.getintbound(arg1)
         self.emit_operation(op)
-        r = self.getvalue(op)
-        b = v1.getintbound().lshift_bound(v2.getintbound())
-        r.getintbound().intersect(b)
+        r = self.getintbound(op)
+        b = b1.lshift_bound(b2)
+        r.intersect(b)
         # intbound.lshift_bound checks for an overflow and if the
         # lshift can be proven not to overflow sets b.has_upper and
         # b.has_lower
         if b.has_lower and b.has_upper:
             # Synthesize the reverse op for optimize_default to reuse
             self.pure_from_args(rop.INT_RSHIFT,
-                                [op, op.getarg(1)], op.getarg(0))
+                                [op, arg1], arg0)
 
     def optimize_INT_RSHIFT(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        b = v1.getintbound().rshift_bound(v2.getintbound())
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        b = b1.rshift_bound(b2)
         if b.has_lower and b.has_upper and b.lower == b.upper:
             # constant result (likely 0, for rshifts that kill all bits)
             self.make_constant_int(op, b.lower)
         else:
             self.emit_operation(op)
-            r = self.getvalue(op)
-            r.getintbound().intersect(b)
+            r = self.getintbound(op)
+            r.intersect(b)
 
     def optimize_GUARD_NO_OVERFLOW(self, op):
         lastop = self.last_emitted_operation
@@ -265,14 +267,14 @@
         r.intersect(resbound)
 
     def optimize_INT_MUL_OVF(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        resbound = v1.getintbound().mul_bound(v2.getintbound())
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        resbound = b1.mul_bound(b2)
         if resbound.bounded():
             op = self.replace_op_with(op, rop.INT_MUL)
         self.emit_operation(op)
-        r = self.getvalue(op)
-        r.getintbound().intersect(resbound)
+        r = self.getintbound(op)
+        r.intersect(resbound)
 
     def optimize_INT_LT(self, op):
         arg1 = self.get_box_replacement(op.getarg(0))
@@ -337,13 +339,15 @@
             self.emit_operation(op)
 
     def optimize_INT_NE(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        if v1.getintbound().known_gt(v2.getintbound()):
+        arg0 = self.get_box_replacement(op.getarg(0))
+        b1 = self.getintbound(arg0)
+        arg1 = self.get_box_replacement(op.getarg(1))
+        b2 = self.getintbound(arg1)
+        if b1.known_gt(b2):
             self.make_constant_int(op, 1)
-        elif v1.getintbound().known_lt(v2.getintbound()):
+        elif b1.known_lt(b2):
             self.make_constant_int(op, 1)
-        elif v1.box is v2.box:
+        elif arg0 is arg1:
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
@@ -369,14 +373,12 @@
             bres.intersect(bounds)
 
     def optimize_ARRAYLEN_GC(self, op):
+        array = self.getptrinfo(op.getarg(0))
+        result = self.getintbound(op)
+        result.make_ge(IntLowerBound(0))
         self.emit_operation(op)
-        # XXX
-        #array = self.getvalue(op.getarg(0))
-        #result = self.getvalue(op)
         #array.make_len_gt(MODE_ARRAY, op.getdescr(), -1)
         #array.getlenbound().bound.intersect(result.getintbound())
-        #assert isinstance(result, IntOptValue)
-        #result.intbound = array.getlenbound().bound
 
     def optimize_STRLEN(self, op):
         self.emit_operation(op)
@@ -564,15 +566,15 @@
             self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_MUL(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op)
-        b = r.getintbound().div_bound(v2.getintbound())
-        if v1.getintbound().intersect(b):
-            self.propagate_bounds_backward(op.getarg(0), v1)
-        b = r.getintbound().div_bound(v1.getintbound())
-        if v2.getintbound().intersect(b):
-            self.propagate_bounds_backward(op.getarg(1), v2)
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        r = self.getintbound(op)
+        b = r.div_bound(b2)
+        if b1.intersect(b):
+            self.propagate_bounds_backward(op.getarg(0))
+        b = r.div_bound(b1)
+        if b2.intersect(b):
+            self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_LSHIFT(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
@@ -112,8 +112,7 @@
         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])
+            op = self.replace_op_with(op, rop.INT_NEG, args=[arg2])
             self.emit_operation(op)
         elif arg1.same_box(arg2):
             self.make_constant_int(op, 0)
@@ -170,23 +169,23 @@
             self.emit_operation(op)
 
     def optimize_INT_LSHIFT(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))
 
-        if v2.is_constant() and v2.box.getint() == 0:
-            self.make_equal_to(op, v1)
-        elif v1.is_constant() and v1.box.getint() == 0:
+        if b2.is_constant() and b2.getint() == 0:
+            self.make_equal_to(op, op.getarg(0))
+        elif b1.is_constant() and b1.getint() == 0:
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
 
     def optimize_INT_RSHIFT(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))
 
-        if v2.is_constant() and v2.box.getint() == 0:
-            self.make_equal_to(op, v1)
-        elif v1.is_constant() and v1.box.getint() == 0:
+        if b2.is_constant() and b2.getint() == 0:
+            self.make_equal_to(op, op.getarg(0))
+        elif b1.is_constant() and b1.getint() == 0:
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to