x86: Don't generate vzeroupper if caller passes AVX/AVX512 registers
authorH.J. Lu <hongjiu.lu@intel.com>
Tue, 8 Jan 2019 17:40:18 +0000 (17:40 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 8 Jan 2019 17:40:18 +0000 (09:40 -0800)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr88717.c [new file with mode: 0644]

index c512ff496a8dee06da4be92b88b49d3696b79ef1..7b4f6e5270b2603eae870d303bb6a2c56eb1edcd 100644 (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
index d01278d866f66b263f1ba76bd59e2e5f32686af7..bd48e080f465f6b0a97cab2d20110dd3f3c01b5a 100644 (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
index 4a70997cbedd6a602aa7c861bcf816d5b2aa30bc..28439297735b9221fa94b9885ffd0f7b7dfb4f1d 100644 (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.
diff --git a/gcc/testsuite/gcc.target/i386/pr88717.c b/gcc/testsuite/gcc.target/i386/pr88717.c
new file mode 100644 (file)
index 0000000..0168099
--- /dev/null
@@ -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" } } */