diff options
author | Richard Biener <rguenther@suse.de> | 2021-01-05 16:17:15 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-01-05 17:40:51 +0100 |
commit | 33a63257701c8d94ee375e32ff1837c989d8ded6 (patch) | |
tree | 7bcc6ecd57ee6bbee583ae126b0892fd66ade9af /gcc/testsuite | |
parent | 606f2af1973d5c83877d327cb5adef97c4243a73 (diff) | |
download | gcc-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.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/bb-slp-pr98516-2.c | 36 |
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; +} |