diff options
author | Eric Wieser <wieser.eric@gmail.com> | 2019-06-12 01:13:07 -0700 |
---|---|---|
committer | Eric Wieser <wieser.eric@gmail.com> | 2019-09-13 00:57:17 -0700 |
commit | 6cf6ece43589670a28b765fd03402cc08ada61f0 (patch) | |
tree | c13c958f36552649312852402bb1598b0d20b0a4 /numpy | |
parent | 79d7bc276afbe89c746e462d28d4bfbb4fc56148 (diff) | |
download | numpy-6cf6ece43589670a28b765fd03402cc08ada61f0.tar.gz |
BUG: Disable -O3 on right_shift on compilers which emit an internal error
Needed to make CI pass
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/setup.py | 6 | ||||
-rw-r--r-- | numpy/core/setup_common.py | 39 | ||||
-rw-r--r-- | numpy/core/src/umath/loops.c.src | 6 |
3 files changed, 50 insertions, 1 deletions
diff --git a/numpy/core/setup.py b/numpy/core/setup.py index 338502791..e6088a48a 100644 --- a/numpy/core/setup.py +++ b/numpy/core/setup.py @@ -463,6 +463,12 @@ def configuration(parent_package='',top_path=None): rep = check_long_double_representation(config_cmd) moredefs.append(('HAVE_LDOUBLE_%s' % rep, 1)) + if check_for_right_shift_internal_compiler_error(config_cmd): + moredefs.append('NPY_DO_NOT_OPTIMIZE_LONG_right_shift') + moredefs.append('NPY_DO_NOT_OPTIMIZE_ULONG_right_shift') + moredefs.append('NPY_DO_NOT_OPTIMIZE_LONGLONG_right_shift') + moredefs.append('NPY_DO_NOT_OPTIMIZE_ULONGLONG_right_shift') + # Py3K check if sys.version_info[0] == 3: moredefs.append(('NPY_PY3K', 1)) diff --git a/numpy/core/setup_common.py b/numpy/core/setup_common.py index 6e3109ab5..6168e3f8d 100644 --- a/numpy/core/setup_common.py +++ b/numpy/core/setup_common.py @@ -5,6 +5,7 @@ import sys import warnings import copy import binascii +import textwrap from numpy.distutils.misc_util import mingw32 @@ -414,3 +415,41 @@ def long_double_representation(lines): else: # We never detected the after_sequence raise ValueError("Could not lock sequences (%s)" % saw) + + +def check_for_right_shift_internal_compiler_error(cmd): + """ + On our arm CI, this fails with an internal compilation error + + The failure looks like the following, and can be reproduced on ARM64 GCC 5.4: + + <source>: In function 'right_shift': + <source>:4:20: internal compiler error: in expand_shift_1, at expmed.c:2349 + ip1[i] = ip1[i] >> in2; + ^ + Please submit a full bug report, + with preprocessed source if appropriate. + See <http://gcc.gnu.org/bugs.html> for instructions. + Compiler returned: 1 + + This function returns True if this compiler bug is present, and we need to + turn off optimization for the function + """ + cmd._check_compiler() + has_optimize = cmd.try_compile(textwrap.dedent("""\ + __attribute__((optimize("O3"))) void right_shift() {} + """), None, None) + if not has_optimize: + return False + + no_err = cmd.try_compile(textwrap.dedent("""\ + typedef long the_type; /* fails also for unsigned and long long */ + __attribute__((optimize("O3"))) void right_shift(the_type in2, the_type *ip1, int n) { + for (int i = 0; i < n; i++) { + if (in2 < (the_type)sizeof(the_type) * 8) { + ip1[i] = ip1[i] >> in2; + } + } + } + """), None, None) + return not no_err diff --git a/numpy/core/src/umath/loops.c.src b/numpy/core/src/umath/loops.c.src index 3d0b41318..0c5465761 100644 --- a/numpy/core/src/umath/loops.c.src +++ b/numpy/core/src/umath/loops.c.src @@ -828,7 +828,11 @@ NPY_NO_EXPORT NPY_GCC_OPT_3 void #undef INT_left_shift_needs_clear_floatstatus #undef UINT_left_shift_needs_clear_floatstatus -NPY_NO_EXPORT NPY_GCC_OPT_3 void +NPY_NO_EXPORT +#ifndef NPY_DO_NOT_OPTIMIZE_@TYPE@_right_shift +NPY_GCC_OPT_3 +#endif +void @TYPE@_right_shift@isa@(char **args, npy_intp *dimensions, npy_intp *steps, void *NPY_UNUSED(func)) { |