[pypy-commit] pypy optresult: a bit more of easy hacking

fijal noreply at buildbot.pypy.org
Wed Mar 11 16:37:48 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76330:ae0ec245d6ea
Date: 2015-03-11 17:37 +0200
http://bitbucket.org/pypy/pypy/changeset/ae0ec245d6ea/

Log:	a bit more of easy hacking

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
@@ -100,11 +100,11 @@
         if b2.is_constant():
             val = b2.lower
             if val >= 0:
-                r.getintbound().intersect(IntBound(0, val))
+                r.intersect(IntBound(0, val))
         elif b1.is_constant():
-            val = b1.getint()
+            val = b1.lower
             if val >= 0:
-                r.getintbound().intersect(IntBound(0, val))
+                r.intersect(IntBound(0, val))
         elif b1.known_ge(IntBound(0, 0)) and b2.known_ge(IntBound(0, 0)):
             lesser = min(b1.upper, b2.upper)
             r.intersect(IntBound(0, next_pow2_m1(lesser)))
@@ -249,17 +249,19 @@
         r.intersect(resbound)
 
     def optimize_INT_SUB_OVF(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        if v1.box is v2.box:
+        arg0 = self.get_box_replacement(op.getarg(0))
+        arg1 = self.get_box_replacement(op.getarg(1))
+        b0 = self.getintbound(arg0)
+        b1 = self.getintbound(arg1)
+        if arg0.same_box(arg1):
             self.make_constant_int(op, 0)
             return
-        resbound = v1.getintbound().sub_bound(v2.getintbound())
+        resbound = b0.sub_bound(b1)
         if resbound.bounded():
             op = self.replace_op_with(op, rop.INT_SUB)
         self.emit_operation(op) # emit the op
-        r = self.getvalue(op)
-        r.getintbound().intersect(resbound)
+        r = self.getintbound(op)
+        r.intersect(resbound)
 
     def optimize_INT_MUL_OVF(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -320,13 +322,15 @@
             self.emit_operation(op)
 
     def optimize_INT_EQ(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))
+        arg1 = self.get_box_replacement(op.getarg(1))
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        if b1.known_gt(b2):
             self.make_constant_int(op, 0)
-        elif v1.getintbound().known_lt(v2.getintbound()):
+        elif b1.known_lt(b2):
             self.make_constant_int(op, 0)
-        elif v1.box is v2.box:
+        elif arg0.same_box(arg1):
             self.make_constant_int(op, 1)
         else:
             self.emit_operation(op)
@@ -401,9 +405,9 @@
         self.emit_operation(op)
         descr = op.getdescr()
         if descr.is_integer_bounded():
-            v1 = self.getvalue(op)
-            v1.getintbound().make_ge(IntLowerBound(descr.get_integer_min()))
-            v1.getintbound().make_le(IntUpperBound(descr.get_integer_max()))
+            b1 = self.getintbound(op)
+            b1.make_ge(IntLowerBound(descr.get_integer_min()))
+            b1.make_le(IntUpperBound(descr.get_integer_max()))
 
     optimize_GETFIELD_RAW_F = optimize_GETFIELD_RAW_I
     optimize_GETFIELD_GC_I = optimize_GETFIELD_RAW_I
@@ -455,7 +459,7 @@
         self.make_int_le(box2, box1)
 
     def propagate_bounds_INT_LT(self, op):
-        r = self.get_box_replacement(op)
+        r = self.getintbound(op)
         if r.is_constant():
             if r.getint() == 1:
                 self.make_int_lt(op.getarg(0), op.getarg(1))
@@ -464,7 +468,7 @@
                 self.make_int_ge(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GT(self, op):
-        r = self.get_box_replacement(op)
+        r = self.getintbound(op)
         if r.is_constant():
             if r.getint() == 1:
                 self.make_int_gt(op.getarg(0), op.getarg(1))
@@ -473,7 +477,7 @@
                 self.make_int_le(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_LE(self, op):
-        r = self.get_box_replacement(op)
+        r = self.getintbound(op)
         if r.is_constant():
             if r.getint() == 1:
                 self.make_int_le(op.getarg(0), op.getarg(1))
@@ -482,7 +486,7 @@
                 self.make_int_gt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GE(self, op):
-        r = self.get_box_replacement(op)
+        r = self.getintbound(op)
         if r.is_constant():
             if r.getint() == 1:
                 self.make_int_ge(op.getarg(0), op.getarg(1))
@@ -491,29 +495,29 @@
                 self.make_int_lt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_EQ(self, op):
-        r = self.getvalue(op)
+        r = self.getintbound(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_1):
-                v1 = self.getvalue(op.getarg(0))
-                v2 = self.getvalue(op.getarg(1))
-                if v1.getintbound().intersect(v2.getintbound()):
-                    self.propagate_bounds_backward(op.getarg(0), v1)
-                if v2.getintbound().intersect(v1.getintbound()):
-                    self.propagate_bounds_backward(op.getarg(1), v2)
+            if r.equal(1):
+                b1 = self.getintbound(op.getarg(0))
+                b2 = self.getintbound(op.getarg(1))
+                if b1.intersect(b2):
+                    self.propagate_bounds_backward(op.getarg(0))
+                if b2.intersect(b1):
+                    self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_NE(self, op):
-        r = self.getvalue(op)
+        r = self.getintbound(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_0):
-                v1 = self.getvalue(op.getarg(0))
-                v2 = self.getvalue(op.getarg(1))
-                if v1.getintbound().intersect(v2.getintbound()):
-                    self.propagate_bounds_backward(op.getarg(0), v1)
-                if v2.getintbound().intersect(v1.getintbound()):
-                    self.propagate_bounds_backward(op.getarg(1), v2)
+            if r.equal(0):
+                b1 = self.getintbound(op.getarg(0))
+                b2 = self.getintbound(op.getarg(1))
+                if b1.intersect(b2):
+                    self.propagate_bounds_backward(op.getarg(0))
+                if b2.intersect(b1):
+                    self.propagate_bounds_backward(op.getarg(1))
 
     def _propagate_int_is_true_or_zero(self, op, valnonzero, valzero):
-        r = self.get_box_replacement(op)
+        r = self.getintbound(op)
         if r.is_constant():
             if r.getint() == valnonzero:
                 b1 = self.getintbound(op.getarg(0))
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -49,23 +49,15 @@
     def is_constant(self):
         return self.has_upper and self.has_lower and self.lower == self.upper
 
+    def getint(self):
+        assert self.is_constant()
+        return self.lower
+
     def equal(self, value):
         if not self.is_constant():
             return False
         return self.lower == value
 
-    def make_constant(self, value):
-        XXXX # don't call me
-        self.has_lower = True
-        self.has_upper = True
-        self.lower = value
-        self.upper = value
-
-    def make_unbounded(self):
-        XXX  # hum
-        self.has_lower = False
-        self.has_upper = False
-
     def bounded(self):
         return self.has_lower and self.has_upper
 
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -641,6 +641,13 @@
         if op.returns_bool_result():
             self.getintbound(op).make_bool()
         self._emit_operation(op)
+        op = self.get_box_replacement(op)
+        if op.type == 'i':
+            opinfo = op.get_forwarded()
+            if opinfo is not None:
+                assert isinstance(opinfo, IntBound)
+                if opinfo.is_constant():
+                    op.set_forwarded(ConstInt(opinfo.getint()))
 
     @specialize.argtype(0)
     def _emit_operation(self, op):


More information about the pypy-commit mailing list