https://gcc.gnu.org/g:747700cdb564ed1c5ef13bc73c2fe48639964c0f

commit r15-3570-g747700cdb564ed1c5ef13bc73c2fe48639964c0f
Author: Richard Biener <rguent...@suse.de>
Date:   Tue Sep 10 09:39:16 2024 +0200

    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.

Diff:
---
 gcc/testsuite/g++.dg/vect/pr116658.cc | 58 +++++++++++++++++++++++++++++++++++
 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 000000000000..c3ff23a2b604
--- /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 0fb17340bd3c..31c7e20f8c9a 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))));
 }

Reply via email to