[pypy-commit] pypy optresult: (arigo, fijal) hack until we pass test_constant_propagate

fijal noreply at buildbot.pypy.org
Tue Feb 24 17:37:07 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76108:67f401e16660
Date: 2015-02-24 18:33 +0200
http://bitbucket.org/pypy/pypy/changeset/67f401e16660/

Log:	(arigo, fijal) hack until we pass test_constant_propagate

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
@@ -110,20 +110,20 @@
 
     def optimize_INT_SUB(self, op):
         self.emit_operation(op)
-        v1 = self.getintbound(op.getarg(0))
-        v2 = self.getintbound(op.getarg(1))
-        b = v1.sub_bound(v2)
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        b = b1.sub_bound(b2)
         if b.bounded():
             self.getintbound(op).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)
-        b = v1.getintbound().add_bound(v2.getintbound())
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        r = self.getintbound(op)
+        b = b1.add_bound(b2)
         if b.bounded():
-            r.getintbound().intersect(b)
+            r.intersect(b)
 
     def optimize_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -499,18 +499,19 @@
                     self.propagate_bounds_backward(op.getarg(1), v2)
 
     def propagate_bounds_INT_IS_TRUE(self, op):
-        r = self.getvalue(op)
+        r = self.get_box_replacement(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_1):
-                v1 = self.getvalue(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), v1)
+            if r.getint() == 1:
+                b1 = self.getintbound(op.getarg(0))
+                if b1.known_ge(IntBound(0, 0)):
+                    b1.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.get_box_replacement(op)
         if r.is_constant():
-            if r.box.same_constant(CONST_1):
+            if r.getint() == 1:
+                xxx
                 v1 = self.getvalue(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
@@ -520,15 +521,15 @@
                 self.propagate_bounds_backward(op.getarg(0), v1)
 
     def propagate_bounds_INT_ADD(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op)
-        b = r.getintbound().sub_bound(v2.getintbound())
-        if v1.getintbound().intersect(b):
-            self.propagate_bounds_backward(op.getarg(0), v1)
-        b = r.getintbound().sub_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.sub_bound(b2)
+        if b1.intersect(b):
+            self.propagate_bounds_backward(op.getarg(0))
+        b = r.sub_bound(b1)
+        if b2.intersect(b):
+            self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_SUB(self, op):
         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
@@ -252,6 +252,20 @@
             op = ResOperation(rop.GUARD_TRUE, [op])
             guards.append(op)
 
+    def is_bool(self):
+        return (self.bounded() and self.known_ge(ConstIntBound(0)) and
+                self.known_le(ConstIntBound(1)))
+
+    def getnullness(self):
+        from rpython.jit.metainterp.optimizeopt import optimizer
+
+        if self.known_gt(IntBound(0, 0)) or \
+           self.known_lt(IntBound(0, 0)):
+            return optimizer.INFO_NONNULL
+        if self.known_ge(IntBound(0, 0)) and \
+           self.known_le(IntBound(0, 0)):
+            return optimizer.INFO_NULL
+        return optimizer.INFO_UNKNOWN
 
 def IntUpperBound(upper):
     b = IntBound(lower=0, upper=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
@@ -393,6 +393,9 @@
 llhelper.CONST_NULLREF = llhelper.CONST_NULL
 REMOVED = AbstractResOp()
 
+INFO_NULL = 0
+INFO_NONNULL = 1
+INFO_UNKNOWN = 2
 
 class Optimization(object):
     next_optimization = None
@@ -420,6 +423,11 @@
         op.set_forwarded(intbound)
         return intbound
 
+    def getnullness(self, op):
+        if op.type == 'i':
+            return self.getintbound(op).getnullness()
+        xxxx
+
     def get_box_replacement(self, op):
         return self.optimizer.get_box_replacement(op)
 
@@ -512,7 +520,6 @@
         self.interned_refs = self.cpu.ts.new_ref_dict()
         self.interned_ints = {}
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
-        self.bool_boxes = {}
         self.pendingfields = None # set temporarily to a list, normally by
                                   # heap.py, as we're about to generate a guard
         self.quasi_immutable_deps = None
@@ -721,7 +728,7 @@
 
     def emit_operation(self, op):
         if op.returns_bool_result():
-            self.bool_boxes[self.getvalue(op)] = None
+            self.getintbound(op).make_bool()
         self._emit_operation(op)
 
     @specialize.argtype(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
@@ -6,7 +6,7 @@
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
-    CONST_0, CONST_1, PtrOptInfo)
+    CONST_0, CONST_1, PtrOptInfo, INFO_NONNULL, INFO_NULL)
 from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
      OpHelpers
@@ -124,13 +124,13 @@
             self.optimizer.pure_reverse(op)
 
     def optimize_INT_ADD(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
+        arg1 = self.get_box_replacement(op.getarg(0))
+        arg2 = self.get_box_replacement(op.getarg(1))
 
         # If one side of the op is 0 the result is the other side.
-        if v1.is_constant() and v1.box.getint() == 0:
+        if arg1.is_constant() and arg1.getint() == 0:
             self.make_equal_to(op, v2)
-        elif v2.is_constant() and v2.box.getint() == 0:
+        elif arg2.is_constant() and arg2.getint() == 0:
             self.make_equal_to(op, v1)
         else:
             self.emit_operation(op)
@@ -427,16 +427,17 @@
         self.emit_operation(op)
 
     def _optimize_nullness(self, op, box, expect_nonnull):
-        value = self.getvalue(box)
-        if value.is_nonnull():
+        info = self.getnullness(box)
+        if info == INFO_NONNULL:
             self.make_constant_int(op, expect_nonnull)
-        elif value.is_null():
+        elif info == INFO_NULL:
             self.make_constant_int(op, not expect_nonnull)
         else:
             self.emit_operation(op)
 
     def optimize_INT_IS_TRUE(self, op):
-        if self.getvalue(op.getarg(0)) in self.optimizer.bool_boxes:
+        if self.getintbound(op.getarg(0)).is_bool():
+            xxx
             self.make_equal_to(op, self.getvalue(op.getarg(0)))
             return
         self._optimize_nullness(op, op.getarg(0), True)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -759,21 +759,23 @@
         self.emit_operation(op)
 
     def optimize_INT_ADD(self, op):
-        value = self.getvalue(op.getarg(0))
-        offsetbox = self.get_constant_box(op.getarg(1))
-        if value.is_virtual() and offsetbox is not None:
-            offset = offsetbox.getint()
-            # the following check is constant-folded to False if the
-            # translation occurs without any VRawXxxValue instance around
-            if value.is_about_raw:
-                if isinstance(value, VRawBufferValue):
-                    self.make_virtual_raw_slice(value, offset, op)
-                    return
-                elif isinstance(value, VRawSliceValue):
-                    offset = offset + value.offset
-                    self.make_virtual_raw_slice(value.rawbuffer_value, offset,
-                                                op)
-                    return
+        if 0:
+            XXX
+            value = self.getvalue(op.getarg(0))
+            offsetbox = self.get_constant_box(op.getarg(1))
+            if value.is_virtual() and offsetbox is not None:
+                offset = offsetbox.getint()
+                # the following check is constant-folded to False if the
+                # translation occurs without any VRawXxxValue instance around
+                if value.is_about_raw:
+                    if isinstance(value, VRawBufferValue):
+                        self.make_virtual_raw_slice(value, offset, op)
+                        return
+                    elif isinstance(value, VRawSliceValue):
+                        offset = offset + value.offset
+                        self.make_virtual_raw_slice(value.rawbuffer_value, offset,
+                                                    op)
+                        return
         self.emit_operation(op)
 
     def optimize_ARRAYLEN_GC(self, op):


More information about the pypy-commit mailing list