aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-01-05 16:17:15 +0100
committerRichard Biener <rguenther@suse.de>2021-01-05 17:40:51 +0100
commit33a63257701c8d94ee375e32ff1837c989d8ded6 (patch)
tree7bcc6ecd57ee6bbee583ae126b0892fd66ade9af /gcc/testsuite
parent606f2af1973d5c83877d327cb5adef97c4243a73 (diff)
downloadgcc-33a63257701c8d94ee375e32ff1837c989d8ded6.zip
gcc-33a63257701c8d94ee375e32ff1837c989d8ded6.tar.gz
gcc-33a63257701c8d94ee375e32ff1837c989d8ded6.tar.bz2
tree-optimization/98516 - fix SLP permute opt materialization
When materializing on a VEC_PERM node we have to permute the incoming vectors, not the outgoing one. 2021-01-05 Richard Biener <rguenther@suse.de> PR tree-optimization/98516 * tree-vect-slp.c (vect_optimize_slp): Permute the incoming lanes when materializing on a VEC_PERM node. (vectorizable_slp_permutation): Dump the permute properly. * gcc.dg/vect/bb-slp-pr98516-1.c: New testcase. * gcc.dg/vect/bb-slp-pr98516-2.c: Likewise.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-1.c26
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-2.c36
2 files changed, 62 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-1.c
new file mode 100644
index 0000000..c4c244c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-1.c
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+double a[4], b[2];
+
+void __attribute__((noipa))
+foo ()
+{
+ double a0 = a[0];
+ double a1 = a[1];
+ double a2 = a[2];
+ double a3 = a[3];
+ b[0] = a1 - a3;
+ b[1] = a0 + a2;
+}
+
+int main()
+{
+ a[0] = 1.;
+ a[1] = 2.;
+ a[2] = 3.;
+ a[3] = 4.;
+ foo ();
+ if (b[0] != -2 || b[1] != 4)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-2.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-2.c
new file mode 100644
index 0000000..f1a9341
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-2.c
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+
+float a[8], b[4];
+
+void __attribute__((noipa))
+foo ()
+{
+ float a0 = a[0];
+ float a1 = a[1];
+ float a2 = a[2];
+ float a3 = a[3];
+ float a4 = a[4];
+ float a5 = a[5];
+ float a6 = a[6];
+ float a7 = a[7];
+ b[0] = a1 - a5;
+ b[1] = a0 + a4;
+ b[2] = a3 - a7;
+ b[3] = a2 + a6;
+}
+
+int main()
+{
+ a[0] = 1.;
+ a[1] = 2.;
+ a[2] = 3.;
+ a[3] = 4.;
+ a[4] = 5.;
+ a[5] = 6.;
+ a[6] = 7.;
+ a[7] = 8.;
+ foo ();
+ if (b[0] != -4 || b[1] != 6 || b[2] != -4 || b[3] != 10)
+ __builtin_abort ();
+ return 0;
+}