[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