[pypy-commit] pypy unroll-if-alt: fold int_add_ovf operations if the args are constant and it really doesn't overflow.
alex_gaynor
noreply at buildbot.pypy.org
Mon Sep 19 20:22:55 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: unroll-if-alt
Changeset: r47352:9c258adb563a
Date: 2011-09-19 14:18 -0400
http://bitbucket.org/pypy/pypy/changeset/9c258adb563a/
Log: fold int_add_ovf operations if the args are constant and it really
doesn't overflow.
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -210,7 +210,8 @@
self.metainterp.clear_exception()
resbox = self.execute(rop.%s, b1, b2)
self.make_result_of_lastop(resbox) # same as execute_varargs()
- self.metainterp.handle_possible_overflow_error()
+ if not isinstance(resbox, Const):
+ self.metainterp.handle_possible_overflow_error()
return resbox
''' % (_opimpl, _opimpl.upper())).compile()
@@ -1688,6 +1689,10 @@
def _record_helper_nonpure_varargs(self, opnum, resbox, descr, argboxes):
assert resbox is None or isinstance(resbox, Box)
+ if (rop._OVF_FIRST <= opnum <= rop._OVF_LAST and
+ self.last_exc_value_box is None and
+ self._all_constants_varargs(argboxes)):
+ return resbox.constbox()
# record the operation
profiler = self.staticdata.profiler
profiler.count_ops(opnum, RECORDED_OPS)
diff --git a/pypy/jit/metainterp/test/test_tracingopts.py b/pypy/jit/metainterp/test/test_tracingopts.py
--- a/pypy/jit/metainterp/test/test_tracingopts.py
+++ b/pypy/jit/metainterp/test/test_tracingopts.py
@@ -1,7 +1,10 @@
+import sys
+
+from pypy.jit.metainterp.test.support import LLJitMixin
+from pypy.rlib import jit
+from pypy.rlib.rarithmetic import ovfcheck
+
import py
-import sys
-from pypy.rlib import jit
-from pypy.jit.metainterp.test.support import LLJitMixin
class TestLLtype(LLJitMixin):
@@ -573,3 +576,18 @@
res = self.interp_operations(fn, [3])
assert res == 24
self.check_operations_history(getarrayitem_gc=0)
+
+ def test_fold_int_add_ovf(self):
+ def fn(n):
+ jit.promote(n)
+ try:
+ n = ovfcheck(n + 1)
+ except OverflowError:
+ return 12
+ else:
+ return n
+ res = self.interp_operations(fn, [3])
+ assert res == 4
+ self.check_operations_history(int_add_ovf=0)
+ res = self.interp_operations(fn, [sys.maxint])
+ assert res == 12
\ No newline at end of file
More information about the pypy-commit
mailing list