public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] vect: Check gather/scatter offset types [PR108316]
@ 2023-02-08  8:58 Richard Sandiford
  2023-02-08 10:54 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Richard Sandiford @ 2023-02-08  8:58 UTC (permalink / raw)
  To: gcc-patches; +Cc: rguenther

The gather/scatter support can over-widen an offset if the target
requires it, but this relies on using a pattern sequence to add
the widening conversion.  That failed in the testcase because an
earlier pattern (bool) took priority.

I think we should allow patterns to be applied to other patterns,
but that's quite an invasive change and isn't suitable for stage 4.
This patch instead punts if the offset type doesn't match the
expected one.

If we switched to using the SLP representation for everything,
we would probably handle both patterns by rewriting the graph,
which should be much easier.

Tested on aarch64-linux-gnu & x86_64-linux-gnu.  OK to install?

Richard


gcc/
	PR tree-optimization/108316
	* tree-vect-stmts.cc (get_load_store_type): When using
	internal functions for gather/scatter, make sure that the type
	of the offset argument is consistent with the offset vector type.

gcc/testsuite/
	PR tree-optimization/108316
	* gcc.dg/vect/pr108316.c: New test.
---
 gcc/testsuite/gcc.dg/vect/pr108316.c | 11 +++++++++++
 gcc/tree-vect-stmts.cc               | 17 +++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/vect/pr108316.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr108316.c b/gcc/testsuite/gcc.dg/vect/pr108316.c
new file mode 100644
index 00000000000..540b7f2aed4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr108316.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+extern _Bool a[];
+
+void
+foo (short i, int b[][64][1])
+{
+  for (; i < 64; i += 4)
+    a[i] = b[0][i] != 0;
+}
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index eb4ca1f184e..c86249adcc3 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -2474,6 +2474,23 @@ get_load_store_type (vec_info  *vinfo, stmt_vec_info stmt_info,
       *memory_access_type = VMAT_GATHER_SCATTER;
       if (!vect_check_gather_scatter (stmt_info, loop_vinfo, gs_info))
 	gcc_unreachable ();
+      /* When using internal functions, we rely on pattern recognition
+	 to convert the type of the offset to the type that the target
+	 requires, with the result being a call to an internal function.
+	 If that failed for some reason (e.g. because another pattern
+	 took priority), just handle cases in which the offset already
+	 has the right type.  */
+      else if (gs_info->ifn != IFN_LAST
+	       && !is_gimple_call (stmt_info->stmt)
+	       && !tree_nop_conversion_p (TREE_TYPE (gs_info->offset),
+					  TREE_TYPE (gs_info->offset_vectype)))
+	{
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+			     "%s offset requires a conversion\n",
+			     vls_type == VLS_LOAD ? "gather" : "scatter");
+	  return false;
+	}
       else if (!vect_is_simple_use (gs_info->offset, vinfo,
 				    &gs_info->offset_dt,
 				    &gs_info->offset_vectype))
-- 
2.25.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] vect: Check gather/scatter offset types [PR108316]
  2023-02-08  8:58 [PATCH] vect: Check gather/scatter offset types [PR108316] Richard Sandiford
@ 2023-02-08 10:54 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2023-02-08 10:54 UTC (permalink / raw)
  To: Richard Sandiford via Gcc-patches



> Am 08.02.2023 um 10:00 schrieb Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org>:
> 
> The gather/scatter support can over-widen an offset if the target
> requires it, but this relies on using a pattern sequence to add
> the widening conversion.  That failed in the testcase because an
> earlier pattern (bool) took priority.
> 
> I think we should allow patterns to be applied to other patterns,
> but that's quite an invasive change and isn't suitable for stage 4.
> This patch instead punts if the offset type doesn't match the
> expected one.
> 
> If we switched to using the SLP representation for everything,
> we would probably handle both patterns by rewriting the graph,
> which should be much easier.
> 
> Tested on aarch64-linux-gnu & x86_64-linux-gnu.  OK to install?

Ok.

Richard 

> Richard
> 
> 
> gcc/
>    PR tree-optimization/108316
>    * tree-vect-stmts.cc (get_load_store_type): When using
>    internal functions for gather/scatter, make sure that the type
>    of the offset argument is consistent with the offset vector type.
> 
> gcc/testsuite/
>    PR tree-optimization/108316
>    * gcc.dg/vect/pr108316.c: New test.
> ---
> gcc/testsuite/gcc.dg/vect/pr108316.c | 11 +++++++++++
> gcc/tree-vect-stmts.cc               | 17 +++++++++++++++++
> 2 files changed, 28 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/vect/pr108316.c
> 
> diff --git a/gcc/testsuite/gcc.dg/vect/pr108316.c b/gcc/testsuite/gcc.dg/vect/pr108316.c
> new file mode 100644
> index 00000000000..540b7f2aed4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr108316.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3" } */
> +
> +extern _Bool a[];
> +
> +void
> +foo (short i, int b[][64][1])
> +{
> +  for (; i < 64; i += 4)
> +    a[i] = b[0][i] != 0;
> +}
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index eb4ca1f184e..c86249adcc3 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -2474,6 +2474,23 @@ get_load_store_type (vec_info  *vinfo, stmt_vec_info stmt_info,
>       *memory_access_type = VMAT_GATHER_SCATTER;
>       if (!vect_check_gather_scatter (stmt_info, loop_vinfo, gs_info))
>    gcc_unreachable ();
> +      /* When using internal functions, we rely on pattern recognition
> +     to convert the type of the offset to the type that the target
> +     requires, with the result being a call to an internal function.
> +     If that failed for some reason (e.g. because another pattern
> +     took priority), just handle cases in which the offset already
> +     has the right type.  */
> +      else if (gs_info->ifn != IFN_LAST
> +           && !is_gimple_call (stmt_info->stmt)
> +           && !tree_nop_conversion_p (TREE_TYPE (gs_info->offset),
> +                      TREE_TYPE (gs_info->offset_vectype)))
> +    {
> +      if (dump_enabled_p ())
> +        dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> +                 "%s offset requires a conversion\n",
> +                 vls_type == VLS_LOAD ? "gather" : "scatter");
> +      return false;
> +    }
>       else if (!vect_is_simple_use (gs_info->offset, vinfo,
>                    &gs_info->offset_dt,
>                    &gs_info->offset_vectype))
> -- 
> 2.25.1
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-02-08 10:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-08  8:58 [PATCH] vect: Check gather/scatter offset types [PR108316] Richard Sandiford
2023-02-08 10:54 ` Richard Biener

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).