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
+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
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
+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.
--- /dev/null
+/* { 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" } } */