diff options
author | Richard Biener <rguenther@suse.de> | 2024-09-09 11:51:24 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-09-09 12:59:38 +0200 |
commit | 898e3e95a6acf542baf03be95ce5bf7b3ad04276 (patch) | |
tree | 1d78ccbd81f41a6dbc3211ca5578ec0dc5f328ab /gcc | |
parent | 0171793aca4c0d4e9c8020c539bb4d3abfb91da7 (diff) | |
download | gcc-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.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-4.c | 2 | ||||
-rw-r--r-- | gcc/tree-vect-loop.cc | 3 |
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, |