Richard Biener <rguent...@suse.de> writes:
> This adds a --param to allow disabling of vectorization of
> floating point inductions.  Ontop of -Ofast this should allow
> 549.fotonik3d_r to not miscompare.
>
> While I thought of a more elaborate way of disabling certain
> vectorization kinds (reductions also came to my mind) this
> for now simply uses a --param than some sophisticated -fvectorize-*
> scheme.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu.  I've
> verified that 549.fotonik3d_r miscompares with -Ofast -march=znver2
> and passes when adding --param vect-induction-float=0 which
> should be valid at least for peak (but I guess also base for
> FOPTIMIZE for example).  I did not benchmark against other
> workarounds (it has been said -fno-unsafe-math-optimizations
> or other similar things work as well).
>
> OK for trunk?
>
> Thanks,
> Richard.
>
> 2022-03-08  Richard Biener  <rguent...@suse.de>
>
>       PR tree-optimization/84201
>       * params.opt (-param=vect-induction-float): Add.
>       * doc/invoke.texi (vect-induction-float): Document.
>       * tree-vect-loop.cc (vectorizable_induction): Honor
>       param_vect_induction_float.
>
>       * gcc.dg/vect/pr84201.c: New testcase.

LGTM FWIW.

Thanks,
Richard

> ---
>  gcc/doc/invoke.texi                 |  3 +++
>  gcc/params.opt                      |  4 ++++
>  gcc/testsuite/gcc.dg/vect/pr84201.c | 22 ++++++++++++++++++++++
>  gcc/tree-vect-loop.cc               |  8 ++++++++
>  4 files changed, 37 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/vect/pr84201.c
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index b01ffab566a..a0fa5e1cf43 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -14989,6 +14989,9 @@ in an inner loop relative to the loop being 
> vectorized.  The factor applied
>  is the maximum of the estimated number of iterations of the inner loop and
>  this parameter.  The default value of this parameter is 50.
>  
> +@item vect-induction-float
> +Enable loop vectorization of floating point inductions.
> +
>  @item avoid-fma-max-bits
>  Maximum number of bits for which we avoid creating FMAs.
>  
> diff --git a/gcc/params.opt b/gcc/params.opt
> index f76f7839916..9561aa61a50 100644
> --- a/gcc/params.opt
> +++ b/gcc/params.opt
> @@ -1176,6 +1176,10 @@ Controls how loop vectorizer uses partial vectors.  0 
> means never, 1 means only
>  Common Joined UInteger Var(param_vect_inner_loop_cost_factor) Init(50) 
> IntegerRange(1, 10000) Param Optimization
>  The maximum factor which the loop vectorizer applies to the cost of 
> statements in an inner loop relative to the loop being vectorized.
>  
> +-param=vect-induction-float=
> +Common Joined UInteger Var(param_vect_induction_float) Init(1) 
> IntegerRage(0, 1) Param Optimization
> +Enable loop vectorization of floating point inductions.
> +
>  -param=vrp1-mode=
>  Common Joined Var(param_vrp1_mode) Enum(vrp_mode) Init(VRP_MODE_VRP) Param 
> Optimization
>  --param=vrp1-mode=[vrp|ranger] Specifies the mode VRP1 should operate in.
> diff --git a/gcc/testsuite/gcc.dg/vect/pr84201.c 
> b/gcc/testsuite/gcc.dg/vect/pr84201.c
> new file mode 100644
> index 00000000000..1cc6d1ff13c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr84201.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-Ofast --param vect-induction-float=0" } */
> +
> +void foo (float *a, float f, float s, int n)
> +{
> +  for (int i = 0; i < n; ++i)
> +    {
> +      a[i] = f;
> +      f += s;
> +    }
> +}
> +
> +void bar (double *a, double f, double s, int n)
> +{
> +  for (int i = 0; i < n; ++i)
> +    {
> +      a[i] = f;
> +      f += s;
> +    }
> +}
> +
> +/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" } } */
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 1f30fc82ca1..7fcec12a3e9 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -8175,6 +8175,14 @@ vectorizable_induction (loop_vec_info loop_vinfo,
>        return false;
>      }
>  
> +  if (FLOAT_TYPE_P (vectype) && !param_vect_induction_float)
> +    {
> +      if (dump_enabled_p ())
> +     dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> +                      "floating point induction vectorization disabled\n");
> +      return false;
> +    }
> +
>    step_expr = STMT_VINFO_LOOP_PHI_EVOLUTION_PART (stmt_info);
>    gcc_assert (step_expr != NULL_TREE);
>    tree step_vectype = get_same_sized_vectype (TREE_TYPE (step_expr), 
> vectype);

Reply via email to