]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
vect: Fix missed gather load opportunity
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 20 Sep 2022 14:27:46 +0000 (15:27 +0100)
committerAndrew Stubbs <ams@codesourcery.com>
Fri, 17 Mar 2023 13:03:02 +0000 (13:03 +0000)
While writing a testcase for PR106794, I noticed that we failed
to vectorise the testcase in the patch for SVE.  The code that
recognises gather loads tries to optimise the point at which
the offset is calculated, to avoid unnecessary extensions or
truncations:

  /* Don't include the conversion if the target is happy with
     the current offset type.  */

But breaking only makes sense if we're at an SSA_NAME (which could
then be vectorised).  We shouldn't break on a conversion embedded
in a generic expression.

gcc/
* tree-vect-data-refs.cc (vect_check_gather_scatter): Restrict
early-out optimisation to SSA_NAMEs.

gcc/testsuite/
* gcc.dg/vect/vect-gather-5.c: New test.

(cherry picked from commit 4a773bf2f08656a39ac75cf6b4871c8cec8b5007)

gcc/ChangeLog.omp
gcc/testsuite/ChangeLog.omp
gcc/testsuite/gcc.dg/vect/vect-gather-5.c [new file with mode: 0644]
gcc/tree-vect-data-refs.cc

index 3a3e54bdeb230dc6b4e91340cb3dcceff9957851..fdccdabf72b1bf0a715a543face2720f6a086885 100644 (file)
@@ -1,3 +1,10 @@
+2023-03-17  Andrew Stubbs  <ams@codesourcery.com>
+
+       Backport from mainline:
+       Richard Sandiford <richard.sandiford@arm.com>
+       * tree-vect-data-refs.cc (vect_check_gather_scatter): Restrict
+       early-out optimisation to SSA_NAMEs.
+
 2023-03-17  Andrew Stubbs  <ams@codesourcery.com>
 
        * config/gcn/gcn-valu.md (gather_load<mode><vndi>): New.
index 860ecdc780b583d4e0087a457e22e7341f700c7d..19357b0b5c2730b385d5c8df956ee7c2f9081ab0 100644 (file)
@@ -1,3 +1,9 @@
+2023-03-17  Andrew Stubbs  <ams@codesourcery.com>
+
+       Backport from mainline:
+       Richard Sandiford <richard.sandiford@arm.com>
+       * gcc.dg/vect/vect-gather-5.c: New test.
+
 2023-03-06  Paul-Antoine Arras <pa@codesourcery.com>
 
        Backported from master:
diff --git a/gcc/testsuite/gcc.dg/vect/vect-gather-5.c b/gcc/testsuite/gcc.dg/vect/vect-gather-5.c
new file mode 100644 (file)
index 0000000..8b5074b
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+#ifdef __aarch64__
+#pragma GCC target "+sve"
+#endif
+
+long a[100], b[100], c[100];
+
+void g1 ()
+{
+  for (int i = 0; i < 100; i += 2)
+    {
+      c[i] += a[b[i]] + 1;
+      c[i + 1] += a[b[i + 1]] + 2;
+    }
+}
+
+long g2 ()
+{
+  long res = 0;
+  for (int i = 0; i < 100; i += 2)
+    {
+      res += a[b[i + 1]];
+      res += a[b[i]];
+    }
+  return res;
+}
+
+long g3 ()
+{
+  long res = 0;
+  for (int i = 0; i < 100; i += 2)
+    {
+      res += a[b[i]];
+      res += a[b[i + 1]];
+    }
+  return res;
+}
+
+/* { dg-final { scan-tree-dump-times {add new stmt[^\n]*GATHER_LOAD} 3 "vect" { target aarch64*-*-* } } } */
+/* { dg-final { scan-tree-dump-not {add new stmt[^\n]*VEC_PERM_EXPR} "vect" { target aarch64*-*-* } } } */
index 70b671ed94aad9e7bbf9b949dd6de190a7b76354..21a7192bf24a1eac958f45409493660e7a0045a8 100644 (file)
@@ -4151,6 +4151,7 @@ vect_check_gather_scatter (stmt_vec_info stmt_info, loop_vec_info loop_vinfo,
          /* Don't include the conversion if the target is happy with
             the current offset type.  */
          if (use_ifn_p
+             && TREE_CODE (off) == SSA_NAME
              && !POINTER_TYPE_P (TREE_TYPE (off))
              && vect_gather_scatter_fn_p (loop_vinfo, DR_IS_READ (dr),
                                           masked_p, vectype, memory_type,