On Tue, Aug 19, 2025 at 6:33 AM Tamar Christina <tamar.christ...@arm.com> wrote:
>
> commit g:1786be14e94bf1a7806b9dc09186f021737f0227 stops storing in
> STMT_VINFO_VECTYPE the vectype of the current stmt being vectorized and 
> instead
> requires the use of SLP_TREE_VECTYPE for everything but data-refs.
>
> This means that STMT_VINFO_VECTYPE (stmt_info) will always be NULL and so
> aarch64_bool_compound_p will never properly cost predicate AND operations
> anymore resulting in less vectorization.
>
> This patch changes it to use SLP_TREE_VECTYPE and pass the slp_node to
> aarch64_bool_compound_p.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and no issues and fixes a couple more sve tests.
>
> Ok for master?

OK (looks obvious to me).

Thanks,
Richard.

> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
>         PR target/121536
>         * config/aarch64/aarch64.cc (aarch64_bool_compound_p): Use
>         SLP_TREE_VECTYPE instead of STMT_VINFO_VECTYPE.
>         (aarch64_adjust_stmt_cost, aarch64_vector_costs::count_ops): Pass SLP
>         node to aarch64_bool_compound_p.
>
> gcc/testsuite/ChangeLog:
>
>         PR target/121536
>         * g++.target/aarch64/sve/pr121536.cc: New test.
>
> ---
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index 
> 2971224566f14da4a163a7d0aed72bdbb3ac40f9..489bffce4d0b733b2d003c1f156a36ea26de456f
>  100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -17378,13 +17378,14 @@ aarch64_multiply_add_p (vec_info *vinfo, 
> stmt_vec_info stmt_info,
>
>  static bool
>  aarch64_bool_compound_p (vec_info *vinfo, stmt_vec_info stmt_info,
> -                        unsigned int vec_flags)
> +                        slp_tree node, unsigned int vec_flags)
>  {
>    gassign *assign = dyn_cast<gassign *> (stmt_info->stmt);
>    if (!assign
> +      || !node
>        || gimple_assign_rhs_code (assign) != BIT_AND_EXPR
> -      || !STMT_VINFO_VECTYPE (stmt_info)
> -      || !VECTOR_BOOLEAN_TYPE_P (STMT_VINFO_VECTYPE (stmt_info)))
> +      || !SLP_TREE_VECTYPE (node)
> +      || !VECTOR_BOOLEAN_TYPE_P (SLP_TREE_VECTYPE (node)))
>      return false;
>
>    for (int i = 1; i < 3; ++i)
> @@ -17723,7 +17724,7 @@ aarch64_adjust_stmt_cost (vec_info *vinfo, 
> vect_cost_for_stmt kind,
>
>           /* For vector boolean ANDs with a compare operand we just need
>              one insn.  */
> -         if (aarch64_bool_compound_p (vinfo, stmt_info, vec_flags))
> +         if (aarch64_bool_compound_p (vinfo, stmt_info, node, vec_flags))
>             return 0;
>         }
>
> @@ -17804,7 +17805,7 @@ aarch64_vector_costs::count_ops (unsigned int count, 
> vect_cost_for_stmt kind,
>
>        /* Assume that bool AND with compare operands will become a single
>          operation.  */
> -      if (aarch64_bool_compound_p (m_vinfo, stmt_info, m_vec_flags))
> +      if (aarch64_bool_compound_p (m_vinfo, stmt_info, node, m_vec_flags))
>         return;
>      }
>
> diff --git a/gcc/testsuite/g++.target/aarch64/sve/pr121536.cc 
> b/gcc/testsuite/g++.target/aarch64/sve/pr121536.cc
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..bd3c69b3801b2e7829ca55c8ed6e76ff288cf2a2
> --- /dev/null
> +++ b/gcc/testsuite/g++.target/aarch64/sve/pr121536.cc
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-fdump-tree-vect-all -std=c++14 -O3 
> -mcpu=neoverse-v2  -msve-vector-bits=128" } */
> +
> +using a = long;
> +using b = a;
> +using c = double;
> +b d;
> +c e;
> +void f() {
> +  for (b g; g < d; ++g)
> +    e += g;
> +}
> +
> +/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
>
>
> --

Reply via email to