From: Richard Biener <rguenther@suse.de>
To: Tamar Christina <tamar.christina@arm.com>
Cc: gcc-patches@gcc.gnu.org, nd@arm.com, jlaw@ventanamicro.com
Subject: Re: [PATCH]middle-end: Handle hybrid SLP induction vectorization with early breaks.
Date: Tue, 19 Dec 2023 13:36:48 +0100 (CET) [thread overview]
Message-ID: <r2oop889-5087-4q13-s76n-1805n029sso9@fhfr.qr> (raw)
In-Reply-To: <patch-18097-tamar@arm.com>
On Tue, 19 Dec 2023, Tamar Christina wrote:
> Hi All,
>
> While we don't support SLP for early break vectorization, we
> can land in the situation where the induction was vectorized
> through hybrid SLP. This means when vectorizing the early
> break live operation we need to get the results of the SLP
> operation.
>
>
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> x86_64-pc-linux-gnu and no issues.
>
> Ok for master?
OK.
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> * tree-vect-loop.cc (vectorizable_live_operation): Handle SLP.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/vect/vect-early-break_82.c: New test.
>
> --- inline copy of patch --
> diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..f2a6d640f9c0c381cc2af09bd824e272bcfee0b8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target vect_early_break } */
> +/* { dg-require-effective-target vect_int } */
> +
> +/* { dg-additional-options "-Ofast" } */
> +
> +/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
> +
> +#include <complex.h>
> +
> +#define N 1024
> +complex double vect_a[N];
> +complex double vect_b[N];
> +
> +complex double test4(complex double x, complex double t)
> +{
> + complex double ret = 0;
> + for (int i = 0; i < N; i++)
> + {
> + vect_a[i] = t + i;
> + if (vect_a[i] == x)
> + return i;
> + vect_a[i] += x * vect_a[i];
> +
> + }
> + return ret;
> +}
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 85b81d30c5ab869cb1f7323caabd9fe4648bdc50..0993d184afe068784474ac225768d9f38d76c040 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -10856,8 +10856,8 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info,
> bitsize = vector_element_bits_tree (vectype);
>
> /* Get the vectorized lhs of STMT and the lane to use (counted in bits). */
> - tree vec_lhs, bitstart;
> - gimple *vec_stmt;
> + tree vec_lhs, vec_lhs0, bitstart;
> + gimple *vec_stmt, *vec_stmt0;
> if (slp_node)
> {
> gcc_assert (!loop_vinfo
> @@ -10868,6 +10868,10 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info,
> vec_lhs = SLP_TREE_VEC_DEFS (slp_node)[vec_entry];
> vec_stmt = SSA_NAME_DEF_STMT (vec_lhs);
>
> + /* In case we need to early break vectorize also get the first stmt. */
> + vec_lhs0 = SLP_TREE_VEC_DEFS (slp_node)[0];
> + vec_stmt0 = SSA_NAME_DEF_STMT (vec_lhs0);
> +
> /* Get entry to use. */
> bitstart = bitsize_int (vec_index);
> bitstart = int_const_binop (MULT_EXPR, bitsize, bitstart);
> @@ -10878,6 +10882,10 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info,
> vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info).last ();
> vec_lhs = gimple_get_lhs (vec_stmt);
>
> + /* In case we need to early break vectorize also get the first stmt. */
> + vec_stmt0 = STMT_VINFO_VEC_STMTS (stmt_info)[0];
> + vec_lhs0 = gimple_get_lhs (vec_stmt0);
> +
> /* Get the last lane in the vector. */
> bitstart = int_const_binop (MULT_EXPR, bitsize, bitsize_int (nunits - 1));
> }
> @@ -10917,7 +10925,6 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info,
> so use ->src. For main exit the merge block is the
> destination. */
> basic_block dest = main_exit_edge ? main_e->dest : e->src;
> - gimple *tmp_vec_stmt = vec_stmt;
> tree tmp_vec_lhs = vec_lhs;
> tree tmp_bitstart = bitstart;
>
> @@ -10928,8 +10935,7 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info,
> if (restart_loop
> && STMT_VINFO_DEF_TYPE (stmt_info) == vect_induction_def)
> {
> - tmp_vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
> - tmp_vec_lhs = gimple_get_lhs (tmp_vec_stmt);
> + tmp_vec_lhs = vec_lhs0;
> tmp_bitstart = build_zero_cst (TREE_TYPE (bitstart));
> }
>
>
>
>
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)
prev parent reply other threads:[~2023-12-19 12:38 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-19 10:12 Tamar Christina
2023-12-19 12:36 ` Richard Biener [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=r2oop889-5087-4q13-s76n-1805n029sso9@fhfr.qr \
--to=rguenther@suse.de \
--cc=gcc-patches@gcc.gnu.org \
--cc=jlaw@ventanamicro.com \
--cc=nd@arm.com \
--cc=tamar.christina@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).