aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-09-09 11:51:24 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-09-09 12:59:38 +0200
commit898e3e95a6acf542baf03be95ce5bf7b3ad04276 (patch)
tree1d78ccbd81f41a6dbc3211ca5578ec0dc5f328ab /gcc
parent0171793aca4c0d4e9c8020c539bb4d3abfb91da7 (diff)
downloadgcc-898e3e95a6acf542baf03be95ce5bf7b3ad04276.zip
gcc-898e3e95a6acf542baf03be95ce5bf7b3ad04276.tar.gz
gcc-898e3e95a6acf542baf03be95ce5bf7b3ad04276.tar.bz2
tree-optimization/116647 - wrong classified double reduction
The following avoids classifying a double reduction that's not actually a reduction in the outer loop (because its value isn't used outside of the outer loop). This avoids us ICEing on the unexpected stmt/SLP node arrangement. PR tree-optimization/116647 * tree-vect-loop.cc (vect_is_simple_reduction): Add missing check to double reduction detection. * gcc.dg/torture/pr116647.c: New testcase. * gcc.dg/vect/no-scevccp-pr86725-2.c: Adjust expected pattern. * gcc.dg/vect/no-scevccp-pr86725-4.c: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr116647.c22
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c2
-rw-r--r--gcc/tree-vect-loop.cc3
4 files changed, 26 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr116647.c b/gcc/testsuite/gcc.dg/torture/pr116647.c
new file mode 100644
index 0000000..2b5cc34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr116647.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+int a;
+char b;
+long c, d, e;
+unsigned long f;
+long g() {
+ if (a <= 0)
+ return 1;
+ for (; d; d++) {
+ e = 0;
+ for (; e < a; e++) {
+ unsigned long h = 0;
+ switch (b)
+ case 2:
+ if (e)
+ h = 5;
+ c += h;
+ }
+ }
+ c /= f;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c
index b208c1a..66185a9 100644
--- a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c
+++ b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c
@@ -19,5 +19,5 @@ nr (int xe)
return xe;
}
-/* { dg-final { scan-tree-dump "reduction used in loop" "vect" { target vect_int } } } */
+/* { dg-final { scan-tree-dump "Unknown def-use cycle pattern" "vect" { target vect_int } } } */
/* { dg-final { scan-tree-dump-not "OUTER LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c
index d995c9b..6ada0a1 100644
--- a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c
+++ b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c
@@ -19,5 +19,5 @@ nr (unsigned int xe, unsigned int qqn)
return xe;
}
-/* { dg-final { scan-tree-dump "reduction used in loop" "vect" { target vect_int } } } */
+/* { dg-final { scan-tree-dump "Unknown def-use cycle pattern" "vect" { target vect_int } } } */
/* { dg-final { scan-tree-dump-not "OUTER LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index a879a13..65d7ed5 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -4325,7 +4325,8 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
&& is_a <gphi *> (phi_use_stmt)
&& flow_bb_inside_loop_p (loop->inner, gimple_bb (phi_use_stmt))
&& (op1 == PHI_ARG_DEF_FROM_EDGE (phi_use_stmt,
- loop_latch_edge (loop->inner))))
+ loop_latch_edge (loop->inner)))
+ && lcphis.length () == 1)
{
if (dump_enabled_p ())
report_vect_op (MSG_NOTE, def_stmt,