[pypy-commit] pypy default: Test and fix: the _nowrapper C functions couldn't be elided before.
arigo
noreply at buildbot.pypy.org
Tue Feb 25 14:17:17 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r69417:3c477e9543db
Date: 2014-02-25 13:16 +0100
http://bitbucket.org/pypy/pypy/changeset/3c477e9543db/
Log: Test and fix: the _nowrapper C functions couldn't be elided before.
diff --git a/rpython/jit/codewriter/test/test_call.py b/rpython/jit/codewriter/test/test_call.py
--- a/rpython/jit/codewriter/test/test_call.py
+++ b/rpython/jit/codewriter/test/test_call.py
@@ -248,3 +248,26 @@
op = block.operations[-1]
call_descr = cc.getcalldescr(op)
assert call_descr.extrainfo.has_random_effects()
+
+def test_no_random_effects_for_rotateLeft():
+ from rpython.jit.backend.llgraph.runner import LLGraphCPU
+ from rpython.rlib.rarithmetic import r_uint
+
+ if r_uint.BITS == 32:
+ py.test.skip("64-bit only")
+
+ from rpython.rlib.rmd5 import _rotateLeft
+ def f(n, m):
+ return _rotateLeft(r_uint(n), m)
+
+ rtyper = support.annotate(f, [7, 9])
+ jitdriver_sd = FakeJitDriverSD(rtyper.annotator.translator.graphs[0])
+ cc = CallControl(LLGraphCPU(rtyper), jitdrivers_sd=[jitdriver_sd])
+ res = cc.find_all_graphs(FakePolicy())
+
+ [f_graph] = [x for x in res if x.func is f]
+ [block, _] = list(f_graph.iterblocks())
+ op = block.operations[-1]
+ call_descr = cc.getcalldescr(op)
+ assert not call_descr.extrainfo.has_random_effects()
+ assert call_descr.extrainfo.check_is_elidable()
diff --git a/rpython/rtyper/lltypesystem/rffi.py b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -116,12 +116,14 @@
# default case:
# invoke the around-handlers only for "not too small" external calls;
# sandboxsafe is a hint for "too-small-ness" (e.g. math functions).
- invoke_around_handlers = not sandboxsafe
+ # Also, _nowrapper functions cannot release the GIL, by default.
+ invoke_around_handlers = not sandboxsafe and not _nowrapper
if random_effects_on_gcobjs not in (False, True):
random_effects_on_gcobjs = (
invoke_around_handlers or # because it can release the GIL
has_callback) # because the callback can do it
+ assert not (elidable_function and random_effects_on_gcobjs)
funcptr = lltype.functionptr(ext_type, name, external='C',
compilation_info=compilation_info,
More information about the pypy-commit
mailing list