[pypy-commit] pypy int-tag-untag-as-operations: check that operations on untagged integers get their overflow checks removed
cfbolz
noreply at buildbot.pypy.org
Mon Oct 24 11:21:33 CEST 2011
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: int-tag-untag-as-operations
Changeset: r48367:c7b823622f57
Date: 2011-10-24 08:35 +0200
http://bitbucket.org/pypy/pypy/changeset/c7b823622f57/
Log: check that operations on untagged integers get their overflow checks
removed
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
@@ -1,3 +1,4 @@
+import sys
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, CONST_1, CONST_0, \
MODE_ARRAY, MODE_STR, MODE_UNICODE
from pypy.jit.metainterp.history import ConstInt
@@ -286,14 +287,25 @@
def optimize_INT_TAG(self, op):
self.emit_operation(op) # XXX for now
- self.emit_operation(self.nextop)
+ v1 = self.getvalue(op.getarg(0))
+ r = self.getvalue(op.result)
+ resbound = v1.intbound.mul(2).add(1)
+ r.intbound.intersect(resbound)
+ no_guard = False
if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW:
+ maxbounds = IntBound((-sys.maxint-1) >> 1, sys.maxint >> 1)
+ v1.intbound.intersect(maxbounds)
self.pure(rop.INT_UNTAG, [op.result], op.getarg(0))
+ no_guard = resbound.has_lower and resbound.has_upper
+ if not no_guard:
+ self.emit_operation(self.nextop)
def optimize_INT_UNTAG(self, op):
+ v1 = self.getvalue(op.getarg(0))
+ self.pure(rop.INT_TAG, [op.result], op.getarg(0))
+ r = self.getvalue(op.result)
+ r.intbound.intersect(v1.intbound.rshift_bound(IntBound(1, 1)))
self.emit_operation(op)
- self.pure(rop.INT_TAG, [op.result], op.getarg(0))
-
def optimize_ARRAYLEN_GC(self, op):
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -5108,6 +5108,32 @@
"""
self.optimize_loop(ops, expected)
+ def test_int_tag_remove_overflow_checking(self):
+ ops = """
+ [i0]
+ i2 = int_tag(i0)
+ guard_no_overflow() []
+ i3 = int_untag(i2)
+ i4 = int_add_ovf(i3, 1)
+ guard_no_overflow() []
+ jump(i4)
+ """
+ expected = """
+ [i0]
+ i2 = int_tag(i0)
+ guard_no_overflow() []
+ i3 = int_add(i0, 1)
+ jump(i3)
+ """
+ preamble = """
+ [i0]
+ i2 = int_tag(i0)
+ guard_no_overflow() []
+ i3 = int_add(i0, 1)
+ jump(i3)
+ """
+ self.optimize_loop(ops, expected, preamble)
+
def test_mul_ovf(self):
ops = """
More information about the pypy-commit
mailing list