diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2019-01-08 17:40:18 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2019-01-08 09:40:18 -0800 |
commit | 53ef4e3a942fc5848690dbf36e67c8c68f7fbae4 (patch) | |
tree | b75eaa394782bb9221e5084e081b6ccc59507845 /gcc | |
parent | e01ffb47c6fec6d52f254390bf863b4ca0fa32e2 (diff) | |
download | gcc-53ef4e3a942fc5848690dbf36e67c8c68f7fbae4.zip gcc-53ef4e3a942fc5848690dbf36e67c8c68f7fbae4.tar.gz gcc-53ef4e3a942fc5848690dbf36e67c8c68f7fbae4.tar.bz2 |
x86: Don't generate vzeroupper if caller passes AVX/AVX512 registers
There is no need to generate vzeroupper if caller passes arguments in
AVX/AVX512 registers.
Tested on i686 and x86-64 with and without --with-arch=native.
gcc/
PR target/88717
* config/i386/i386.c (ix86_avx_u128_mode_exit): Call
ix86_avx_u128_mode_entry.
gcc/testsuite/
PR target/88717
* gcc.target/i386/pr88717.c: New test.
From-SVN: r267732
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88717.c | 24 |
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c512ff4..7b4f6e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-08 H.J. Lu <hongjiu.lu@intel.com> + + PR target/88717 + * config/i386/i386.c (ix86_avx_u128_mode_exit): Call + ix86_avx_u128_mode_entry. + 2019-01-08 Martin Liska <mliska@suse.cz> PR tree-optimization/88753 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d01278d..bd48e08 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -19137,7 +19137,10 @@ ix86_avx_u128_mode_exit (void) if (reg && ix86_check_avx_upper_register (reg)) return AVX_U128_DIRTY; - return AVX_U128_CLEAN; + /* Exit mode is set to AVX_U128_DIRTY if there are 256bit or 512bit + modes used in function arguments, otherwise return AVX_U128_CLEAN. + */ + return ix86_avx_u128_mode_entry (); } /* Return a mode that ENTITY is assumed to be diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4a70997..2843929 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-08 H.J. Lu <hongjiu.lu@intel.com> + + PR target/88717 + * gcc.target/i386/pr88717.c: New test. + 2019-01-08 Marek Polacek <polacek@redhat.com> PR c++/88548 - this accepted in static member functions. diff --git a/gcc/testsuite/gcc.target/i386/pr88717.c b/gcc/testsuite/gcc.target/i386/pr88717.c new file mode 100644 index 0000000..0168099 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88717.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mavx512f -mvzeroupper" } */ + +#include <immintrin.h> + +__m128 +foo1 (__m256 x) +{ + return _mm256_castps256_ps128 (x); +} + +void +foo2 (float *p, __m256 x) +{ + *p = ((__v8sf)x)[0]; +} + +void +foo3 (float *p, __m512 x) +{ + *p = ((__v16sf)x)[0]; +} + +/* { dg-final { scan-assembler-not "vzeroupper" } } */ |