diff mbox series

[SLP,VECT] Add check to fix 96837

Message ID DB6PR0802MB220073906F87365AA78018D4F5320@DB6PR0802MB2200.eurprd08.prod.outlook.com
State New
Headers show
Series [SLP,VECT] Add check to fix 96837 | expand

Commit Message

Joel Hutton Sept. 29, 2020, 4:48 p.m. UTC
Hi All,

The following patch adds a simple check to prevent slp stmts from vector constructors being rearranged. vect_attempt_slp_rearrange_stmts tries to rearrange to avoid a load permutation.

This fixes PR target/96837 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96827
gcc/ChangeLog:

2020-09-29  Joel Hutton  <joel.hutton@arm.com>

        PR target/96837
        * tree-vect-slp.c (vect_analyze_slp): Do not call vect_attempt_slp_rearrange_stmts for vector constructors.

gcc/testsuite/ChangeLog:

2020-09-29  Joel Hutton  <joel.hutton@arm.com>

        PR target/96837
        * gcc.dg/vect/bb-slp-49.c: New test.

Comments

Richard Biener Sept. 30, 2020, 6:27 a.m. UTC | #1
On Tue, 29 Sep 2020, Joel Hutton wrote:

>  Hi All,
> 
> The following patch adds a simple check to prevent slp stmts from vector constructors being rearranged. vect_attempt_slp_rearrange_stmts tries to rearrange to avoid a load permutation.
> 
> This fixes PR target/96837 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96827
> gcc/ChangeLog:

OK for trunk and branch(es)

Thanks,
Richard.

> 2020-09-29  Joel Hutton  <joel.hutton@arm.com>
> 
>         PR target/96837
>         * tree-vect-slp.c (vect_analyze_slp): Do not call vect_attempt_slp_rearrange_stmts for vector constructors.
> 
> gcc/testsuite/ChangeLog:
> 
> 2020-09-29  Joel Hutton  <joel.hutton@arm.com>
> 
>         PR target/96837
>         * gcc.dg/vect/bb-slp-49.c: New test.
diff mbox series

Patch

From 2c738e2c0eddbc4fcdbf8ff2443bb809b36c7e28 Mon Sep 17 00:00:00 2001
From: Joel Hutton <joel.hutton@arm.com>
Date: Tue, 29 Sep 2020 15:46:44 +0100
Subject: [PATCH] [SLP][VECT] Add check to fix 96827

Do not call vect_attempt_slp_rearrange_stmts if an slp instance is an
SLP_INSTANCE_ROOT_STMT, i.e. if the tree is built from a constructor
rather than a grouped store. This function is intended to rearrange
stmts in a reduction chain so they do not require load permutation.
Rearranging causes the resulting constructor to be in the wrong order.
---
 gcc/testsuite/gcc.dg/vect/bb-slp-49.c | 28 +++++++++++++++++++++++++++
 gcc/tree-vect-slp.c                   |  3 ++-
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-49.c

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-49.c b/gcc/testsuite/gcc.dg/vect/bb-slp-49.c
new file mode 100644
index 0000000000000000000000000000000000000000..e7101fcff4627bb545549bdfefd33c2ed58aee7b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-49.c
@@ -0,0 +1,28 @@ 
+/* This checks that vectorized constructors have the correct ordering. */
+/* { dg-require-effective-target vect_int } */
+
+typedef int V __attribute__((__vector_size__(16)));
+
+__attribute__((__noipa__)) void
+foo (unsigned int x, V *y)
+{
+  unsigned int a[4] = { x + 0, x + 2, x + 4, x + 6 };
+  for (unsigned int i = 0; i < 3; ++i)
+    if (a[i] == 1234)
+      a[i]--;
+  *y = (V) { a[3], a[2], a[1], a[0] };
+}
+
+int
+main ()
+{
+  V b;
+  foo (0, &b);
+  if (b[0] != 6 || b[1] != 4 || b[2] != 2 || b[3] != 0)
+    __builtin_abort ();
+  return 0;
+}
+
+/* See that we vectorize an SLP instance.  */
+/* { dg-final { scan-tree-dump "Analyzing vectorizable constructor" "slp1" } } */
+/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "slp1" } } */
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index c44fd396bf0b69a4153e46026c545bebb3797551..7ba24e241deb76c0fd884ccfff04675d1b050ef7 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2495,7 +2495,8 @@  vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
       /* Reduction (there are no data-refs in the root).
 	 In reduction chain the order of the loads is not important.  */
       if (!STMT_VINFO_DATA_REF (stmt_info)
-	  && !REDUC_GROUP_FIRST_ELEMENT (stmt_info))
+	  && !REDUC_GROUP_FIRST_ELEMENT (stmt_info)
+	  && !SLP_INSTANCE_ROOT_STMT (instance))
 	vect_attempt_slp_rearrange_stmts (instance);
     }
 
-- 
2.17.1