[i386] Add option -mvect-compare-costs
Commit Message
Also with corresponding target attribute, option default disabled.
Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
Ok for trunk?
gcc/ChangeLog:
* config/i386/i386-options.c (ix86_target_string): Handle
-mvect-compare-costs.
(ix86_valid_target_attribute_inner_p): Support target attribute
vect-compare-costs.
* config/i386/i386.c (ix86_autovectorize_vector_modes): Return
1 when TARGET_X86_VECT_COMPARE_COSTS.
* config/i386/i386.opt: Add option -mvect-compare-costs.
* doc/invoke.texi: Document -mvect-compare-costs.
---
gcc/config/i386/i386-options.c | 7 ++++++-
gcc/config/i386/i386.c | 2 +-
gcc/config/i386/i386.opt | 5 +++++
gcc/doc/invoke.texi | 7 ++++++-
4 files changed, 18 insertions(+), 3 deletions(-)
Comments
Obviously I'm not in a position to comment on the target bits, but:
liuhongt via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> Also with corresponding target attribute, option default disabled.
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
> Ok for trunk?
>
> gcc/ChangeLog:
>
> * config/i386/i386-options.c (ix86_target_string): Handle
> -mvect-compare-costs.
> (ix86_valid_target_attribute_inner_p): Support target attribute
> vect-compare-costs.
> * config/i386/i386.c (ix86_autovectorize_vector_modes): Return
> 1 when TARGET_X86_VECT_COMPARE_COSTS.
> * config/i386/i386.opt: Add option -mvect-compare-costs.
> * doc/invoke.texi: Document -mvect-compare-costs.
> ---
> gcc/config/i386/i386-options.c | 7 ++++++-
> gcc/config/i386/i386.c | 2 +-
> gcc/config/i386/i386.opt | 5 +++++
> gcc/doc/invoke.texi | 7 ++++++-
> 4 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
> index 53bd55a12e3..53794b13fc5 100644
> --- a/gcc/config/i386/i386-options.c
> +++ b/gcc/config/i386/i386-options.c
> @@ -406,7 +406,8 @@ ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT isa2,
> /* Additional flag options. */
> static struct ix86_target_opts flag2_opts[] =
> {
> - { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY }
> + { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY },
> + { "-mvect-compare-costs", OPTION_MASK_X86_VECT_COMPARE_COSTS }
> };
>
> const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (isa2_opts)
> @@ -1111,6 +1112,10 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
> OPT_mgeneral_regs_only,
> OPTION_MASK_GENERAL_REGS_ONLY),
>
> + IX86_ATTR_IX86_YES ("vect-compare-costs",
> + OPT_mvect_compare_costs,
> + OPTION_MASK_X86_VECT_COMPARE_COSTS),
> +
> IX86_ATTR_YES ("relax-cmpxchg-loop",
> OPT_mrelax_cmpxchg_loop,
> MASK_RELAX_CMPXCHG_LOOP),
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 9f4ed34ffd5..8d3fc3be1b9 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -22836,7 +22836,7 @@ ix86_autovectorize_vector_modes (vector_modes *modes, bool all)
> if (TARGET_SSE2)
> modes->safe_push (V4QImode);
>
> - return 0;
> + return TARGET_X86_VECT_COMPARE_COSTS ? 1 : 0;
as far as the interface goes, it'd be better to use VECT_COMPARE_COSTS
instead of 1 here.
Thanks,
Richard
> }
>
> /* Implemenation of targetm.vectorize.get_mask_mode. */
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index e1af3e417b0..80c7a073d07 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -1206,3 +1206,8 @@ Support MWAIT and MONITOR built-in functions and code generation.
> mavx512fp16
> Target Mask(ISA2_AVX512FP16) Var(ix86_isa_flags2) Save
> Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512FP16 built-in functions and code generation.
> +
> +mvect-compare-costs
> +Target Mask(X86_VECT_COMPARE_COSTS) Var(ix86_target_flags) Save
> +Tells the loop vectorizer to try all the provided vector lengths and pick the
> +one with the lowest cost.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 80c36b9abe0..fa2f63af65f 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1428,7 +1428,7 @@ See RS/6000 and PowerPC Options.
> -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
> -mstack-protector-guard-reg=@var{reg} @gol
> -mstack-protector-guard-offset=@var{offset} @gol
> --mstack-protector-guard-symbol=@var{symbol} @gol
> +-mstack-protector-guard-symbol=@var{symbol} -mvect-compare-costs@gol
> -mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop @gol
> -mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol
> -mindirect-branch-register -mharden-sls=@var{choice} @gol
> @@ -32440,6 +32440,11 @@ Generate code that uses only the general-purpose registers. This
> prevents the compiler from using floating-point, vector, mask and bound
> registers.
>
> +@item -mvect-compare-costs
> +@opindex mcompare-vect-costs
> +Tells the loop vectorizer to try all the vector lengths and pick the one
> +with the lowest cost.
> +
> @item -mrelax-cmpxchg-loop
> @opindex mrelax-cmpxchg-loop
> Relax cmpxchg loop by emitting an early load and compare before cmpxchg,
On Thu, Dec 16, 2021 at 5:00 PM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Obviously I'm not in a position to comment on the target bits, but:
>
> liuhongt via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> > Also with corresponding target attribute, option default disabled.
> >
> > Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
> > Ok for trunk?
> >
> > gcc/ChangeLog:
> >
> > * config/i386/i386-options.c (ix86_target_string): Handle
> > -mvect-compare-costs.
> > (ix86_valid_target_attribute_inner_p): Support target attribute
> > vect-compare-costs.
> > * config/i386/i386.c (ix86_autovectorize_vector_modes): Return
> > 1 when TARGET_X86_VECT_COMPARE_COSTS.
> > * config/i386/i386.opt: Add option -mvect-compare-costs.
> > * doc/invoke.texi: Document -mvect-compare-costs.
> > ---
> > gcc/config/i386/i386-options.c | 7 ++++++-
> > gcc/config/i386/i386.c | 2 +-
> > gcc/config/i386/i386.opt | 5 +++++
> > gcc/doc/invoke.texi | 7 ++++++-
> > 4 files changed, 18 insertions(+), 3 deletions(-)
> >
> > diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c
> > index 53bd55a12e3..53794b13fc5 100644
> > --- a/gcc/config/i386/i386-options.c
> > +++ b/gcc/config/i386/i386-options.c
> > @@ -406,7 +406,8 @@ ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT isa2,
> > /* Additional flag options. */
> > static struct ix86_target_opts flag2_opts[] =
> > {
> > - { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY }
> > + { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY },
> > + { "-mvect-compare-costs", OPTION_MASK_X86_VECT_COMPARE_COSTS }
> > };
> >
> > const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (isa2_opts)
> > @@ -1111,6 +1112,10 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
> > OPT_mgeneral_regs_only,
> > OPTION_MASK_GENERAL_REGS_ONLY),
> >
> > + IX86_ATTR_IX86_YES ("vect-compare-costs",
> > + OPT_mvect_compare_costs,
> > + OPTION_MASK_X86_VECT_COMPARE_COSTS),
> > +
> > IX86_ATTR_YES ("relax-cmpxchg-loop",
> > OPT_mrelax_cmpxchg_loop,
> > MASK_RELAX_CMPXCHG_LOOP),
> > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> > index 9f4ed34ffd5..8d3fc3be1b9 100644
> > --- a/gcc/config/i386/i386.c
> > +++ b/gcc/config/i386/i386.c
> > @@ -22836,7 +22836,7 @@ ix86_autovectorize_vector_modes (vector_modes *modes, bool all)
> > if (TARGET_SSE2)
> > modes->safe_push (V4QImode);
> >
> > - return 0;
> > + return TARGET_X86_VECT_COMPARE_COSTS ? 1 : 0;
>
> as far as the interface goes, it'd be better to use VECT_COMPARE_COSTS
> instead of 1 here.
>
Thanks, will change.
> Thanks,
> Richard
>
> > }
> >
> > /* Implemenation of targetm.vectorize.get_mask_mode. */
> > diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> > index e1af3e417b0..80c7a073d07 100644
> > --- a/gcc/config/i386/i386.opt
> > +++ b/gcc/config/i386/i386.opt
> > @@ -1206,3 +1206,8 @@ Support MWAIT and MONITOR built-in functions and code generation.
> > mavx512fp16
> > Target Mask(ISA2_AVX512FP16) Var(ix86_isa_flags2) Save
> > Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512FP16 built-in functions and code generation.
> > +
> > +mvect-compare-costs
> > +Target Mask(X86_VECT_COMPARE_COSTS) Var(ix86_target_flags) Save
> > +Tells the loop vectorizer to try all the provided vector lengths and pick the
> > +one with the lowest cost.
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index 80c36b9abe0..fa2f63af65f 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -1428,7 +1428,7 @@ See RS/6000 and PowerPC Options.
> > -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
> > -mstack-protector-guard-reg=@var{reg} @gol
> > -mstack-protector-guard-offset=@var{offset} @gol
> > --mstack-protector-guard-symbol=@var{symbol} @gol
> > +-mstack-protector-guard-symbol=@var{symbol} -mvect-compare-costs@gol
> > -mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop @gol
> > -mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol
> > -mindirect-branch-register -mharden-sls=@var{choice} @gol
> > @@ -32440,6 +32440,11 @@ Generate code that uses only the general-purpose registers. This
> > prevents the compiler from using floating-point, vector, mask and bound
> > registers.
> >
> > +@item -mvect-compare-costs
> > +@opindex mcompare-vect-costs
> > +Tells the loop vectorizer to try all the vector lengths and pick the one
> > +with the lowest cost.
> > +
> > @item -mrelax-cmpxchg-loop
> > @opindex mrelax-cmpxchg-loop
> > Relax cmpxchg loop by emitting an early load and compare before cmpxchg,
@@ -406,7 +406,8 @@ ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT isa2,
/* Additional flag options. */
static struct ix86_target_opts flag2_opts[] =
{
- { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY }
+ { "-mgeneral-regs-only", OPTION_MASK_GENERAL_REGS_ONLY },
+ { "-mvect-compare-costs", OPTION_MASK_X86_VECT_COMPARE_COSTS }
};
const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (isa2_opts)
@@ -1111,6 +1112,10 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
OPT_mgeneral_regs_only,
OPTION_MASK_GENERAL_REGS_ONLY),
+ IX86_ATTR_IX86_YES ("vect-compare-costs",
+ OPT_mvect_compare_costs,
+ OPTION_MASK_X86_VECT_COMPARE_COSTS),
+
IX86_ATTR_YES ("relax-cmpxchg-loop",
OPT_mrelax_cmpxchg_loop,
MASK_RELAX_CMPXCHG_LOOP),
@@ -22836,7 +22836,7 @@ ix86_autovectorize_vector_modes (vector_modes *modes, bool all)
if (TARGET_SSE2)
modes->safe_push (V4QImode);
- return 0;
+ return TARGET_X86_VECT_COMPARE_COSTS ? 1 : 0;
}
/* Implemenation of targetm.vectorize.get_mask_mode. */
@@ -1206,3 +1206,8 @@ Support MWAIT and MONITOR built-in functions and code generation.
mavx512fp16
Target Mask(ISA2_AVX512FP16) Var(ix86_isa_flags2) Save
Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512FP16 built-in functions and code generation.
+
+mvect-compare-costs
+Target Mask(X86_VECT_COMPARE_COSTS) Var(ix86_target_flags) Save
+Tells the loop vectorizer to try all the provided vector lengths and pick the
+one with the lowest cost.
@@ -1428,7 +1428,7 @@ See RS/6000 and PowerPC Options.
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
-mstack-protector-guard-reg=@var{reg} @gol
-mstack-protector-guard-offset=@var{offset} @gol
--mstack-protector-guard-symbol=@var{symbol} @gol
+-mstack-protector-guard-symbol=@var{symbol} -mvect-compare-costs@gol
-mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop @gol
-mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol
-mindirect-branch-register -mharden-sls=@var{choice} @gol
@@ -32440,6 +32440,11 @@ Generate code that uses only the general-purpose registers. This
prevents the compiler from using floating-point, vector, mask and bound
registers.
+@item -mvect-compare-costs
+@opindex mcompare-vect-costs
+Tells the loop vectorizer to try all the vector lengths and pick the one
+with the lowest cost.
+
@item -mrelax-cmpxchg-loop
@opindex mrelax-cmpxchg-loop
Relax cmpxchg loop by emitting an early load and compare before cmpxchg,