On Tue, Jun 27, 2023 at 7:55 AM liuhongt <hongtao....@intel.com> wrote: > > pass_insert_vzeroupper is under condition > > TARGET_AVX && TARGET_VZEROUPPER > && flag_expensive_optimizations && !optimize_size > > But the document of mvzeroupper doesn't mention the insertion > required -O2 and above, it may confuse users when they explicitly > use -Os -mvzeroupper. > > ------------ > mvzeroupper > Target Mask(VZEROUPPER) Save > Generate vzeroupper instruction before a transfer of control flow out of > the function. > ------------ > > The patch moves flag_expensive_optimizations && !optimize_size to > ix86_option_override_internal. It makes -mvzeroupper independent of > optimization level, but still keeps the behavior of architecture > tuning(emit_vzeroupper) unchanged. > > Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}. > Ok for trunk? > > gcc/ChangeLog: > > * config/i386/i386-features.cc (pass_insert_vzeroupper:gate): > Move flag_expensive_optimizations && !optimize_size to .. > * config/i386/i386-options.cc (ix86_option_override_internal): > .. this, it makes -mvzeroupper independent of optimization > level, but still keeps the behavior of architecture > tuning(emit_vzeroupper) unchanged. > > gcc/testsuite/ChangeLog: > > * gcc.target/i386/avx-vzeroupper-29.c: New testcase.
OK. Thanks, Uros. > --- > gcc/config/i386/i386-features.cc | 3 +-- > gcc/config/i386/i386-options.cc | 4 +++- > gcc/testsuite/gcc.target/i386/avx-vzeroupper-29.c | 14 ++++++++++++++ > 3 files changed, 18 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/i386/avx-vzeroupper-29.c > > diff --git a/gcc/config/i386/i386-features.cc > b/gcc/config/i386/i386-features.cc > index 4a3b07ae045..92ae08d442e 100644 > --- a/gcc/config/i386/i386-features.cc > +++ b/gcc/config/i386/i386-features.cc > @@ -2489,8 +2489,7 @@ public: > /* opt_pass methods: */ > bool gate (function *) final override > { > - return TARGET_AVX && TARGET_VZEROUPPER > - && flag_expensive_optimizations && !optimize_size; > + return TARGET_AVX && TARGET_VZEROUPPER; > } > > unsigned int execute (function *) final override > diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc > index 2cb0bddcd35..f76e7c5947b 100644 > --- a/gcc/config/i386/i386-options.cc > +++ b/gcc/config/i386/i386-options.cc > @@ -2727,7 +2727,9 @@ ix86_option_override_internal (bool main_args_p, > sorry ("%<-mcall-ms2sysv-xlogues%> isn%'t currently supported with SEH"); > > if (!(opts_set->x_target_flags & MASK_VZEROUPPER) > - && TARGET_EMIT_VZEROUPPER) > + && TARGET_EMIT_VZEROUPPER > + && flag_expensive_optimizations > + && !optimize_size) > opts->x_target_flags |= MASK_VZEROUPPER; > if (!(opts_set->x_target_flags & MASK_STV)) > opts->x_target_flags |= MASK_STV; > diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-29.c > b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-29.c > new file mode 100644 > index 00000000000..4af637757f7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-29.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0 -mavx -mtune=generic -mvzeroupper -dp" } */ > + > +#include <immintrin.h> > + > +extern __m256 x, y; > + > +void > +foo () > +{ > + x = y; > +} > + > +/* { dg-final { scan-assembler-times "avx_vzeroupper" 1 } } */ > -- > 2.39.1.388.g2fc9e9ca3c >