Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r46259:1ff61f9d4428 Date: 2011-08-03 16:49 -0700 http://bitbucket.org/pypy/pypy/changeset/1ff61f9d4428/
Log: Put bounds on the result of an int_mod. 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 @@ -125,6 +125,21 @@ r = self.getvalue(op.result) r.intbound.intersect(v1.intbound.div_bound(v2.intbound)) + def optimize_INT_MOD(self, op): + self.emit_operation(op) + v2 = self.getvalue(op.getarg(1)) + if v2.is_constant(): + val = v2.box.getint() + r = self.getvalue(op.result) + if val > 0: + r.intbound.make_ge(IntBound(0, 0)) + r.intbound.make_lt(IntBound(val, val)) + elif val < 0: + r.intbound.make_gt(IntBound(val, val)) + r.intbound.make_le(IntBound(0, 0)) + # No optimizations if val == 0, that should probably even be an + # error, that should never happen. + def optimize_INT_LSHIFT(self, op): v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -4621,6 +4621,29 @@ """ self.optimize_strunicode_loop(ops, expected) + def test_intmod_bounds(self): + ops = """ + [i0, i1] + i2 = int_mod(i0, 12) + i3 = int_gt(i2, 12) + guard_false(i3) [] + i4 = int_lt(i2, 0) + guard_false(i4) [] + i5 = int_mod(i1, -12) + i6 = int_lt(i5, -12) + guard_false(i6) [] + i7 = int_gt(i5, 0) + guard_false(i7) [] + jump(i2, i5) + """ + expected = """ + [i0, i1] + i2 = int_mod(i0, 12) + i5 = int_mod(i1, -12) + jump(i2, i5) + """ + self.optimize_loop(ops, expected) + class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): pass diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py --- a/pypy/jit/tool/oparser.py +++ b/pypy/jit/tool/oparser.py @@ -53,7 +53,7 @@ class OpParser(object): use_mock_model = False - + def __init__(self, input, cpu, namespace, type_system, boxkinds, invent_fail_descr=default_fail_descr, nonstrict=False): @@ -187,7 +187,7 @@ poss_descr = allargs[-1].strip() if poss_descr.startswith('descr='): descr = self.get_descr(poss_descr[len('descr='):]) - allargs = allargs[:-1] + allargs = allargs[:-1] for arg in allargs: arg = arg.strip() try: _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit