Message ID | 20230627055312.2881827-2-hongtao.liu@intel.com |
---|---|
State | New |
Headers | show |
Series | [1/2] Don't issue vzeroupper for vzeroupper call_insn. | expand |
On Tue, Jun 27, 2023 at 7:55 AM liuhongt <hongtao.liu@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 >
On Tue, Jun 27, 2023 at 2:05 PM Uros Bizjak <ubizjak@gmail.com> wrote: > > On Tue, Jun 27, 2023 at 7:55 AM liuhongt <hongtao.liu@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. I'd like to backport this patch to GCC10/GCC11/GCC12/GCC13. > > 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 > >
On Tue, Jun 27, 2023 at 8:09 AM Hongtao Liu <crazylht@gmail.com> wrote: > > On Tue, Jun 27, 2023 at 2:05 PM Uros Bizjak <ubizjak@gmail.com> wrote: > > > > On Tue, Jun 27, 2023 at 7:55 AM liuhongt <hongtao.liu@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. > I'd like to backport this patch to GCC10/GCC11/GCC12/GCC13. Also OK. Thanks, Uros. > > > > 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 > > > > > > > -- > BR, > Hongtao
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 } } */