[pypy-commit] pypy default: Remove 'int_signext' on an argument that is already known to be

arigo noreply at buildbot.pypy.org
Fri Nov 28 15:14:59 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r74755:f6c90881b77f
Date: 2014-11-28 15:14 +0100
http://bitbucket.org/pypy/pypy/changeset/f6c90881b77f/

Log:	Remove 'int_signext' on an argument that is already known to be
	within bounds. This would be a no-op. Shows up in:

	 getarrayitem_raw(non-full-word)

	 int_signext

	 setarrayitem_raw(non-full-word)

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
@@ -343,11 +343,17 @@
             self.emit_operation(op)
 
     def optimize_INT_SIGNEXT(self, op):
-        self.emit_operation(op)
-        v1 = self.getvalue(op.result)
+        value = self.getvalue(op.getarg(0))
         numbits = op.getarg(1).getint() * 8
-        v1.intbound.make_ge(IntLowerBound(-(1 << (numbits - 1))))
-        v1.intbound.make_lt(IntUpperBound(1 << (numbits - 1)))
+        start = -(1 << (numbits - 1))
+        stop = 1 << (numbits - 1)
+        bounds = IntBound(start, stop - 1)
+        if bounds.contains_bound(value.intbound):
+            self.make_equal_to(op.result, value)
+        else:
+            self.emit_operation(op)
+            vres = self.getvalue(op.result)
+            vres.intbound.intersect(bounds)
 
     def optimize_ARRAYLEN_GC(self, op):
         self.emit_operation(op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5494,6 +5494,41 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_int_signext_already_in_bounds(self):
+        ops = """
+        [i0]
+        i1 = int_signext(i0, 1)
+        i2 = int_signext(i1, 2)
+        jump(i2)
+        """
+        expected = """
+        [i0]
+        i1 = int_signext(i0, 1)
+        jump(i1)
+        """
+        self.optimize_loop(ops, expected)
+        #
+        ops = """
+        [i0]
+        i1 = int_signext(i0, 1)
+        i2 = int_signext(i1, 1)
+        jump(i2)
+        """
+        expected = """
+        [i0]
+        i1 = int_signext(i0, 1)
+        jump(i1)
+        """
+        self.optimize_loop(ops, expected)
+        #
+        ops = """
+        [i0]
+        i1 = int_signext(i0, 2)
+        i2 = int_signext(i1, 1)
+        jump(i2)
+        """
+        self.optimize_loop(ops, ops)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list