[pypy-commit] pypy result-in-resops: hack enough to make the next test pass

fijal noreply at buildbot.pypy.org
Fri Oct 26 13:28:33 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r58447:2b413dc0ef40
Date: 2012-10-25 15:29 +0200
http://bitbucket.org/pypy/pypy/changeset/2b413dc0ef40/

Log:	hack enough to make the next test pass

diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -76,11 +76,10 @@
         if b.bounded():
             r.getintbound().intersect(b)
 
-    def optimize_INT_ADD(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        self.emit_operation(op)
-        r = self.getvalue(op)
+    def postprocess_INT_ADD(self, op):
+        v1 = self.getforwarded(op.getarg(0))
+        v2 = self.getforwarded(op.getarg(1))
+        r = self.getforwarded(op)
         b = v1.getintbound().add_bound(v2.getintbound())
         if b.bounded():
             r.getintbound().intersect(b)
@@ -404,19 +403,19 @@
                     self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_IS_TRUE(self, op):
-        r = self.getvalue(op)
+        r = self.getforwarded(op)
         if r.is_constant():
-            if r.op.same_constant(CONST_1):
-                v1 = self.getvalue(op.getarg(0))
+            if r.same_constant(CONST_1):
+                v1 = self.getforwarded(op.getarg(0))
                 if v1.getintbound().known_ge(IntBound(0, 0)):
                     v1.getintbound().make_gt(IntBound(0, 0))
                     self.propagate_bounds_backward(op.getarg(0))
 
     def propagate_bounds_INT_IS_ZERO(self, op):
-        r = self.getvalue(op)
+        r = self.getforwarded(op)
         if r.is_constant():
-            if r.op.same_constant(CONST_1):
-                v1 = self.getvalue(op.getarg(0))
+            if r.same_constant(CONST_1):
+                v1 = self.getforwarded(op.getarg(0))
                 # Clever hack, we can't use self.make_constant_int yet because
                 # the args aren't in the values dictionary yet so it runs into
                 # an assert, this is a clever way of expressing the same thing.
@@ -425,9 +424,9 @@
                 self.propagate_bounds_backward(op.getarg(0))
 
     def propagate_bounds_INT_ADD(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op)
+        v1 = self.getforwarded(op.getarg(0))
+        v2 = self.getforwarded(op.getarg(1))
+        r = self.getforwarded(op)
         b = r.getintbound().sub_bound(v2.getintbound())
         if v1.getintbound().intersect(b):
             self.propagate_bounds_backward(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -587,6 +587,7 @@
         descr.store_final_boxes(op, newboxes)
         #
         if op.getopnum() == rop.GUARD_VALUE:
+            xxx
             if self.getvalue(op.getarg(0)).is_bool_box:
                 # Hack: turn guard_value(bool) into guard_true/guard_false.
                 # This is done after the operation is emitted to let
@@ -620,7 +621,7 @@
         self._newoperations[value.last_guard_pos] = new_guard_op
 
     def constant_fold(self, op):
-        argboxes = [self.get_constant_box(op.getarg(i))
+        argboxes = [self.get_constant_op(op.getarg(i))
                     for i in range(op.numargs())]
         resbox = execute_nonspec(self.cpu, None,
                                  op.getopnum(), argboxes, op.getdescr())
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -48,7 +48,7 @@
 
         # otherwise, the operation remains
         if newop.returns_bool_result():
-            newop.is_bool_box = True
+            newop.setboolbox(True)
         if nextop:
             self.emit_operation(nextop)
         return newop
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -1,7 +1,8 @@
 from pypy.jit.codewriter.effectinfo import EffectInfo
 from pypy.jit.metainterp.optimize import InvalidLoop
 from pypy.jit.metainterp.optimizeopt.intutils import IntBound
-from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
+from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, CONST_1,\
+     CONST_0
 from pypy.jit.metainterp.resoperation import (opboolinvers, opboolreflex, rop,
                                               ConstInt, make_hashable_int,
                                               create_resop_2, Const)
@@ -23,12 +24,6 @@
         for op in self.loop_invariant_producer.values():
             sb.add_potential(op)
 
-    def propagate_forward(self, op):
-        if self.find_rewritable_bool(op):
-            return
-
-        dispatch_opt(self, op)
-
     def try_boolinvers(self, op, key_op):
         oldop = self.get_pure_result(key_op)
         if oldop is not None and oldop.getdescr() is op.getdescr():
@@ -101,19 +96,19 @@
     def optimize_INT_ADD(self, op):
         arg1 = op.getarg(0)
         arg2 = op.getarg(1)
-        v1 = self.getvalue(arg1)
-        v2 = self.getvalue(arg2)
+        v1 = self.getforwarded(arg1)
+        v2 = self.getforwarded(arg2)
 
         # If one side of the op is 0 the result is the other side.
-        if v1.is_constant() and v1.op.getint() == 0:
+        if v1.is_constant() and v1.getint() == 0:
             self.replace(op, arg2)
-        elif v2.is_constant() and v2.op.getint() == 0:
+        elif v2.is_constant() and v2.getint() == 0:
             self.replace(op, arg1)
         else:
-            self.emit_operation(op)
             # Synthesize the reverse op for optimize_default to reuse
             self.pure(op.getarg(0), rop.INT_SUB, op, op.getarg(1))
             self.pure(op.getarg(1), rop.INT_SUB, op, op.getarg(0))
+            return op
 
     def optimize_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -194,10 +189,7 @@
     def optimize_guard(self, op, constbox, emit_operation=True):
         value = self.getforwarded(op.getarg(0))
         if value.is_constant():
-            xxx
-            box = value.op
-            assert isinstance(box, Const)
-            if not box.same_constant(constbox):
+            if not value.same_constant(constbox):
                 raise InvalidLoop('A GUARD_{VALUE,TRUE,FALSE} was proven to' +
                                   'always fail')
             return
@@ -214,6 +206,12 @@
         assert isinstance(constbox, Const)
         self.postprocess_guard(op, constbox)
 
+    def postprocess_GUARD_TRUE(self, op):
+        self.postprocess_guard(op, CONST_1)
+
+    def postprocess_GUARD_FALSE(self, op):
+        self.postprocess_guard(op, CONST_0)        
+
     def postprocess_default(self, op):
         if op.is_guard():
             xxx
@@ -364,6 +362,7 @@
     optimize_CALL_LOOPINVARIANT_v = _new_optimize_call_loopinvariant(rop.CALL_v)
 
     def _optimize_nullness(self, op, box, expect_nonnull):
+        return op
         value = self.getvalue(box)
         if value.is_nonnull():
             self.make_constant_int(op, expect_nonnull)
@@ -373,10 +372,11 @@
             self.emit_operation(op)
 
     def optimize_INT_IS_TRUE(self, op):
-        if self.getvalue(op.getarg(0)).is_bool_box:
+        value = self.getforwarded(op.getarg(0))
+        if value.getboolbox():
             self.replace(op, op.getarg(0))
             return
-        self._optimize_nullness(op, op.getarg(0), True)
+        return self._optimize_nullness(op, op.getarg(0), True)
 
     def optimize_INT_IS_ZERO(self, op):
         self._optimize_nullness(op, op.getarg(0), False)
diff --git a/pypy/jit/metainterp/optmodel.py b/pypy/jit/metainterp/optmodel.py
--- a/pypy/jit/metainterp/optmodel.py
+++ b/pypy/jit/metainterp/optmodel.py
@@ -45,6 +45,7 @@
             if cls.type == INT:
                 # all the integers have bounds
                 addattr(Mutable, 'intbound', imm_int_unbound)
+                addattr(Mutable, 'boolbox', False)
             # for tracking last guard and merging GUARD_VALUE with
             # GUARD_NONNULL etc
             addattr(Mutable, 'lastguard', None)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -296,6 +296,9 @@
     def is_constant(self):
         return True
 
+    def getlastguard(self):
+        return None
+
 def repr_rpython(box, typechars):
     return '%s/%s%d' % (box._get_hash_(), typechars,
                         compute_unique_id(box))
@@ -365,6 +368,9 @@
     def repr_rpython(self):
         return repr_rpython(self, 'ci')
 
+    def getboolbox(self):
+        return False # for optimization
+
 CONST_FALSE = ConstInt(0)
 CONST_TRUE  = ConstInt(1)
 


More information about the pypy-commit mailing list