public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-5739] vect: Check gather/scatter offset types [PR108316]
@ 2023-02-08 13:40 Richard Sandiford
  0 siblings, 0 replies; only message in thread
From: Richard Sandiford @ 2023-02-08 13:40 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:740a3be7df29b280f39a04c441fd4917af4eef5e

commit r13-5739-g740a3be7df29b280f39a04c441fd4917af4eef5e
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Wed Feb 8 13:40:29 2023 +0000

    vect: Check gather/scatter offset types [PR108316]
    
    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.
    
    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.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr108316.c | 11 +++++++++++
 gcc/tree-vect-stmts.cc               | 17 +++++++++++++++++
 2 files changed, 28 insertions(+)

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-08 13:40 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-08 13:40 [gcc r13-5739] vect: Check gather/scatter offset types [PR108316] Richard Sandiford

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