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
This commit is contained in:
H.J. Lu 2019-01-08 17:40:18 +00:00 committed by H.J. Lu
parent e01ffb47c6
commit 53ef4e3a94
4 changed files with 39 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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" } } */