diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2019-07-24 14:48:33 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2019-07-24 14:48:43 -0700 |
commit | 7e681561a3aea7aa8f21fb031a7c778147dfdf5b (patch) | |
tree | 9d70b934aeae381ec82fa7b21481728bbf0ad59a /sysdeps/x86_64/configure | |
parent | 82c664ed751f52a3074a9d6d366e87086f10b2f4 (diff) | |
download | glibc-7e681561a3aea7aa8f21fb031a7c778147dfdf5b.tar glibc-7e681561a3aea7aa8f21fb031a7c778147dfdf5b.tar.gz glibc-7e681561a3aea7aa8f21fb031a7c778147dfdf5b.tar.bz2 glibc-7e681561a3aea7aa8f21fb031a7c778147dfdf5b.zip |
x86-64: Compile branred.c with -mprefer-vector-width=128 [BZ #24603]
When compiled with -O3 and AVX, GCC 8 and 9 optimize some loops in
sysdeps/ieee754/dbl-64/branred.c with 256-bit vector instructions,
which leads to store forward stall:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90579
There is no easy fix in compiler. This patch limits vector width to
128 bits to work around this issue. It improves performance of sin
and cos by more than 40% on Skylake compiled with -O3 -march=skylake.
Tested with GCC 7/8/9 on x86-64.
[BZ #24603]
* sysdeps/x86_64/configure.ac: Check if -mprefer-vector-width=128
works.
* sysdeps/x86_64/configure: Regenerated.
* sysdeps/x86_64/fpu/Makefile (CFLAGS-branred.c): New. Set
to -mprefer-vector-width=128 if supported.
Diffstat (limited to 'sysdeps/x86_64/configure')
-rw-r--r-- | sysdeps/x86_64/configure | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure index 8674d14569..84f82c2406 100644 --- a/sysdeps/x86_64/configure +++ b/sysdeps/x86_64/configure @@ -54,6 +54,28 @@ fi config_vars="$config_vars config-cflags-avx512 = $libc_cv_cc_avx512" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking -mprefer-vector-width=128" >&5 +$as_echo_n "checking -mprefer-vector-width=128... " >&6; } +if ${libc_cv_cc_mprefer_vector_width+:} false; then : + $as_echo_n "(cached) " >&6 +else + if { ac_try='${CC-cc} -mprefer-vector-width=128 -xc /dev/null -S -o /dev/null' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + libc_cv_cc_mprefer_vector_width=yes +else + libc_cv_cc_mprefer_vector_width=no +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_mprefer_vector_width" >&5 +$as_echo "$libc_cv_cc_mprefer_vector_width" >&6; } +config_vars="$config_vars +config-cflags-mprefer-vector-width = $libc_cv_cc_mprefer_vector_width" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Intel MPX support" >&5 $as_echo_n "checking for Intel MPX support... " >&6; } if ${libc_cv_asm_mpx+:} false; then : |