On Fri, Apr 9, 2021 at 10:28 AM Richard Biener <rguent...@suse.de> wrote:
>
> We can use TBAA even when we have a DR, do so.  For the testcase
> that means fully vectorizing it instead of only vectorizing
> the first store group resulting in suboptimal code.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, queued for stage1.

g:700e542971251b11623cce877075567815f72965

> 2021-04-09  Richard Biener  <rguent...@suse.de>
>
>         PR tree-optimization/99971
>         * tree-vect-data-refs.c (vect_slp_analyze_node_dependences):
>         Always use TBAA for loads.
>
>         * g++.dg/vect/slp-pr99971.cc: New testcase.
> ---
>  gcc/testsuite/g++.dg/vect/slp-pr99971.cc | 36 ++++++++++++++++++++++++
>  gcc/tree-vect-data-refs.c                | 18 +++++++-----
>  2 files changed, 47 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/vect/slp-pr99971.cc
>
> diff --git a/gcc/testsuite/g++.dg/vect/slp-pr99971.cc 
> b/gcc/testsuite/g++.dg/vect/slp-pr99971.cc
> new file mode 100644
> index 00000000000..bec6418d4e8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/vect/slp-pr99971.cc
> @@ -0,0 +1,36 @@
> +// { dg-do compile }
> +// { dg-require-effective-target vect_int }
> +
> +struct A
> +{
> +  unsigned int a, b, c, d;
> +
> +  A& operator+= (A const& that)
> +    {
> +      a += that.a;
> +      b += that.b;
> +      c += that.c;
> +      d += that.d;
> +      return *this;
> +    }
> +
> +  A& operator-= (A const& that)
> +    {
> +      a -= that.a;
> +      b -= that.b;
> +      c -= that.c;
> +      d -= that.d;
> +      return *this;
> +    }
> +};
> +
> +void test(A& x, A const& y1, A const& y2)
> +{
> +  x += y1;
> +  x -= y2;
> +}
> +
> +// We want to SLP vectorize a single connected SLP subgraph with two 
> instances
> +// { dg-final { scan-tree-dump-not "removing SLP instance" "slp2" } }
> +// { dg-final { scan-tree-dump-times "SLPing BB part" 1 "slp2" } }
> +// { dg-final { scan-tree-dump-times "Vectorizing SLP" 2 "slp2" } }
> diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
> index ee266ba62a8..6ea5e3a3eda 100644
> --- a/gcc/tree-vect-data-refs.c
> +++ b/gcc/tree-vect-data-refs.c
> @@ -780,16 +780,20 @@ vect_slp_analyze_node_dependences (vec_info *vinfo, 
> slp_tree node,
>                  stmt we have to resort to the alias oracle.  */
>               stmt_vec_info stmt_info = vinfo->lookup_stmt (stmt);
>               data_reference *dr_b = STMT_VINFO_DATA_REF (stmt_info);
> -             if (!dr_b)
> +
> +             /* We are hoisting a load - this means we can use
> +                TBAA for disambiguation.  */
> +             if (!ref_initialized_p)
> +               ao_ref_init (&ref, DR_REF (dr_a));
> +             if (stmt_may_clobber_ref_p_1 (stmt, &ref, true))
>                 {
> -                 /* We are hoisting a load - this means we can use
> -                    TBAA for disambiguation.  */
> -                 if (!ref_initialized_p)
> -                   ao_ref_init (&ref, DR_REF (dr_a));
> -                 if (stmt_may_clobber_ref_p_1 (stmt, &ref, true))
> +                 if (!dr_b)
>                     return false;
> -                 continue;
> +                 /* Resort to dependence checking below.  */
>                 }
> +             else
> +               /* No dependence.  */
> +               continue;
>
>               bool dependent = false;
>               /* If we run into a store of this same instance (we've just
> --
> 2.26.2

Reply via email to