diff options
author | Richard Biener <rguenther@suse.de> | 2024-09-10 09:39:16 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-09-10 11:47:30 +0200 |
commit | 747700cdb564ed1c5ef13bc73c2fe48639964c0f (patch) | |
tree | 5d763a6cce8a02f0c4a3998233eb4d0633b8007e /gcc | |
parent | a7eaf7d5edb194bae0d7d9bc3d20bb5730be57d8 (diff) | |
download | gcc-747700cdb564ed1c5ef13bc73c2fe48639964c0f.zip gcc-747700cdb564ed1c5ef13bc73c2fe48639964c0f.tar.gz gcc-747700cdb564ed1c5ef13bc73c2fe48639964c0f.tar.bz2 |
tree-optimization/116658 - latent issue in vect_is_slp_load_node
Permute nodes do not have a representative so we have to guard
vect_is_slp_load_node against those.
PR tree-optimization/116658
* tree-vect-slp.cc (vect_is_slp_load_node): Make sure
node isn't a permute.
* g++.dg/vect/pr116658.cc: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr116658.cc | 58 | ||||
-rw-r--r-- | gcc/tree-vect-slp.cc | 7 |
2 files changed, 62 insertions, 3 deletions
diff --git a/gcc/testsuite/g++.dg/vect/pr116658.cc b/gcc/testsuite/g++.dg/vect/pr116658.cc new file mode 100644 index 0000000..c3ff23a --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr116658.cc @@ -0,0 +1,58 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-O3" } +// { dg-additional-options "-mavx512f" { target avx512f } } + +struct bb { + bb operator+=(bb bc) { + bd[0] += bc.bd[0]; + return *this; + } + bb operator-=(bb bc) { + bd[0] -= bc.bd[0]; + return *this; + } + bb operator*=(double be) { + bd[0] *= be; + return *this; + } + double bd[1]; +}; + +bb operator+(bb n, bb v) { + bb bf = n; + return bf += v; +} + +bb operator-(bb n, bb v) { + bb bf = n; + return bf -= v; +} +bb operator*(double n, bb v) { + bb bf = v; + return bf *= n; +} + +using az = bb; +struct cc { + void apply(bb *ci) { + bb xm[1]; + for (int cm = 0; cm < 2; ++cm) { + az cn, co = cv[cm] * xm[0]; + ci[cm] = cn + co; + ci[-1] = cn - co; + } + } + double *cu; + double *cv; +}; +void dc(unsigned de, int di, az *dk, az *dl, cc dh) { + for (int c; c < 1024; ++c) { + if (de & 1) + dh.apply(dk); + if (de & 2) + dh.apply(dl); + dk += di; + dl += di; + } +} diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 0fb1734..31c7e20 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -3265,9 +3265,10 @@ calculate_unrolling_factor (poly_uint64 nunits, unsigned int group_size) static inline bool vect_is_slp_load_node (slp_tree root) { - return SLP_TREE_DEF_TYPE (root) == vect_internal_def - && STMT_VINFO_GROUPED_ACCESS (SLP_TREE_REPRESENTATIVE (root)) - && DR_IS_READ (STMT_VINFO_DATA_REF (SLP_TREE_REPRESENTATIVE (root))); + return (SLP_TREE_CODE (root) != VEC_PERM_EXPR + && SLP_TREE_DEF_TYPE (root) == vect_internal_def + && STMT_VINFO_GROUPED_ACCESS (SLP_TREE_REPRESENTATIVE (root)) + && DR_IS_READ (STMT_VINFO_DATA_REF (SLP_TREE_REPRESENTATIVE (root)))); } |