Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r76183:a9318d7e2e4d
Date: 2015-02-27 18:51 +0200
http://bitbucket.org/pypy/pypy/changeset/a9318d7e2e4d/

Log:    (fijal, arigo) whack whack type type

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
@@ -272,11 +272,13 @@
         r.getintbound().intersect(resbound)
 
     def optimize_INT_LT(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        if v1.getintbound().known_lt(v2.getintbound()):
+        arg1 = self.get_box_replacement(op.getarg(0))
+        arg2 = self.get_box_replacement(op.getarg(1))
+        b1 = self.getintbound(arg1)
+        b2 = self.getintbound(arg2)
+        if b1.known_lt(b2):
             self.make_constant_int(op, 1)
-        elif v1.getintbound().known_ge(v2.getintbound()) or v1.box is v2.box:
+        elif b1.known_ge(b2) or arg1 is arg2:
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
@@ -302,11 +304,13 @@
             self.emit_operation(op)
 
     def optimize_INT_GE(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        if v1.getintbound().known_ge(v2.getintbound()) or v1.box is v2.box:
+        arg1 = self.get_box_replacement(op.getarg(0))
+        arg2 = self.get_box_replacement(op.getarg(1))
+        b1 = self.getintbound(arg1)
+        b2 = self.getintbound(arg2)
+        if b1.known_ge(b2) or arg1 is arg2:
             self.make_constant_int(op, 1)
-        elif v1.getintbound().known_lt(v2.getintbound()):
+        elif b1.known_lt(b2):
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
@@ -424,12 +428,12 @@
         v1.getintbound().make_ge(IntLowerBound(0))
 
     def make_int_lt(self, box1, box2):
-        v1 = self.getvalue(box1)
-        v2 = self.getvalue(box2)
-        if v1.getintbound().make_lt(v2.getintbound()):
-            self.propagate_bounds_backward(box1, v1)
-        if v2.getintbound().make_gt(v1.getintbound()):
-            self.propagate_bounds_backward(box2, v2)
+        b1 = self.getintbound(box1)
+        b2 = self.getintbound(box2)
+        if b1.make_lt(b2):
+            self.propagate_bounds_backward(box1)
+        if b2.make_gt(b1):
+            self.propagate_bounds_backward(box2)
 
     def make_int_le(self, box1, box2):
         v1 = self.getvalue(box1)
@@ -446,11 +450,12 @@
         self.make_int_le(box2, box1)
 
     def propagate_bounds_INT_LT(self, op):
-        r = self.getvalue(op)
+        r = self.get_box_replacement(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_1):
+            if r.getint() == 1:
                 self.make_int_lt(op.getarg(0), op.getarg(1))
             else:
+                assert r.getint() == 0
                 self.make_int_ge(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GT(self, op):
@@ -470,11 +475,12 @@
                 self.make_int_gt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GE(self, op):
-        r = self.getvalue(op)
+        r = self.get_box_replacement(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_1):
+            if r.getint() == 1:
                 self.make_int_ge(op.getarg(0), op.getarg(1))
             else:
+                assert r.getint() == 0
                 self.make_int_lt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_EQ(self, op):
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
@@ -257,6 +257,9 @@
         return (self.bounded() and self.known_ge(ConstIntBound(0)) and
                 self.known_le(ConstIntBound(1)))
 
+    def make_bool(self):
+        self.intersect(IntBound(0, 1))
+
     def getnullness(self):
         from rpython.jit.metainterp.optimizeopt import optimizer
 
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
@@ -535,7 +535,10 @@
     def replace_op_with(self, op, newopnum, args=None, descr=None):
         newop = op.copy_and_change(newopnum, args, descr)
         if newop.type != 'v':
-            assert op.get_forwarded() is None  #XXX
+            op = self.get_box_replacement(op)
+            opinfo = op.get_forwarded()
+            if opinfo is not None:
+                newop.set_forwarded(opinfo)
             op.set_forwarded(newop)
         return newop
 
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py 
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -50,7 +50,7 @@
         # otherwise, the operation remains
         self.emit_operation(op)
         if op.returns_bool_result():
-            self.optimizer.bool_boxes[self.getvalue(op)] = None
+            self.getintbound(op).make_bool()
         if nextop:
             self.emit_operation(nextop)
         #if args is not None:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to