aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-05-06 10:49:35 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-05-06 10:49:35 +0000
commit240a94da04372488fb03284d5479687c9f8fbe57 (patch)
tree0ad58236fb46b1acfdb616f36490b2bdb04fd1fe
parentedbb33c7958d9ebb202f8dbfa84901e0b6d5ef7a (diff)
downloadgcc-240a94da04372488fb03284d5479687c9f8fbe57.zip
gcc-240a94da04372488fb03284d5479687c9f8fbe57.tar.gz
gcc-240a94da04372488fb03284d5479687c9f8fbe57.tar.bz2
tree-vect-slp.c (vect_supported_load_permutation_p): Use vect_transform_slp_perm_load to check if...
2015-05-06 Richard Biener <rguenther@suse.de> * tree-vect-slp.c (vect_supported_load_permutation_p): Use vect_transform_slp_perm_load to check if we support a permutation for basic-block vectorization. * gcc.dg/vect/bb-slp-34.c: New testcase. From-SVN: r222846
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-34.c37
-rw-r--r--gcc/tree-vect-slp.c28
4 files changed, 69 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2593a3c..f201ab9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-06 Richard Biener <rguenther@suse.de>
+
+ * tree-vect-slp.c (vect_supported_load_permutation_p): Use
+ vect_transform_slp_perm_load to check if we support a permutation
+ for basic-block vectorization.
+
2015-05-06 Nick Clifton <nickc@redhat.com>
* config/rl78/rl78.c (need_to_save): Save register 22 if it is
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6f69362..c42a9d4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2015-05-06 Richard Biener <rguenther@suse.de>
+ * gcc.dg/vect/bb-slp-34.c: New testcase.
+
+2015-05-06 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/62283
* gcc.dg/vect/bb-slp-14.c: Adjust.
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-34.c b/gcc/testsuite/gcc.dg/vect/bb-slp-34.c
new file mode 100644
index 0000000..62949cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-34.c
@@ -0,0 +1,37 @@
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+extern void abort (void);
+
+int a[8], b[8];
+
+void __attribute__((noinline,noclone))
+foo(void)
+{
+ a[0] = b[3];
+ a[1] = b[2];
+ a[2] = b[1];
+ a[3] = b[0];
+ a[4] = b[2];
+ a[5] = b[3];
+ a[6] = b[4];
+ a[7] = b[5];
+}
+
+int main()
+{
+ int i;
+ check_vect ();
+ for (i = 0; i < 8; ++i)
+ b[i] = i;
+ foo ();
+ if (a[0] != 3 || a[1] != 2 || a[2] != 1 || a[3] != 0
+ || a[4] != 2 || a[5] != 3 || a[6] != 4 || a[7] != 5)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" { target vect_perm } } } */
+/* { dg-final { cleanup-tree-dump "slp1" } } */
+/* { dg-final { cleanup-tree-dump "slp2" } } */
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index d41aa10..fc96df3 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -1325,17 +1325,36 @@ vect_supported_load_permutation_p (slp_instance slp_instn)
FORNOW: not supported in loop SLP because of realignment compications. */
if (STMT_VINFO_BB_VINFO (vinfo_for_stmt (stmt)))
{
- /* Check that for every node in the instance the loads
- form a subchain. */
+ /* Check whether the loads in an instance form a subchain and thus
+ no permutation is necessary. */
FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node)
{
+ bool subchain_p = true;
next_load = NULL;
FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), j, load)
{
if (j != 0 && next_load != load)
- return false;
+ {
+ subchain_p = false;
+ break;
+ }
next_load = GROUP_NEXT_ELEMENT (vinfo_for_stmt (load));
}
+ if (subchain_p)
+ SLP_TREE_LOAD_PERMUTATION (node).release ();
+ else
+ {
+ /* Verify the permutation can be generated. */
+ vec<tree> tem;
+ if (!vect_transform_slp_perm_load (node, tem, NULL,
+ 1, slp_instn, true))
+ {
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION,
+ vect_location,
+ "unsupported load permutation\n");
+ return false;
+ }
+ }
}
/* Check that the alignment of the first load in every subchain, i.e.,
@@ -1364,9 +1383,6 @@ vect_supported_load_permutation_p (slp_instance slp_instn)
}
}
- /* We are done, no actual permutations need to be generated. */
- FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node)
- SLP_TREE_LOAD_PERMUTATION (node).release ();
return true;
}