Author: Alex Gaynor <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit