Author: Armin Rigo <ar...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit