aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-09-30 13:38:28 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-09-30 16:19:43 +0200
commit18e905b461a7138185cf4f0efde4a4e1214fb798 (patch)
tree69fb83ff417389abe4ebe2c1a18c8adb61bc001e /gcc
parent87905f63a6521eef1f38082e2368e18c637ef092 (diff)
downloadgcc-18e905b461a7138185cf4f0efde4a4e1214fb798.zip
gcc-18e905b461a7138185cf4f0efde4a4e1214fb798.tar.gz
gcc-18e905b461a7138185cf4f0efde4a4e1214fb798.tar.bz2
tree-optimization/116879 - failure to recognize non-empty latch
When we relaxed the vectorizers constraint on loop structure verifying the emptiness of the latch became too lose as can be seen in the case for PR116879 where the latch effectively contains two basic-blocks which one being an unmerged forwarder that's not empty. PR tree-optimization/116879 * tree-vect-loop.cc (vect_analyze_loop_form): Scan all blocks that form the latch. * gcc.dg/pr116879.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/pr116879.c15
-rw-r--r--gcc/tree-vect-loop.cc15
2 files changed, 26 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.dg/pr116879.c b/gcc/testsuite/gcc.dg/pr116879.c
new file mode 100644
index 0000000..73ddb2b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr116879.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -fallow-store-data-races -fno-tree-ch -ftree-loop-distribution" } */
+
+static int b;
+int *a, c, *d = &c;
+int main() {
+ int e = 0;
+ for (; e < 8; e = (char)(e + 1)) {
+ int *f = &b, g[8], h = 0;
+ for (; h < 8; h++)
+ g[h] = 0;
+ --*f != (*d = g[0] || a);
+ }
+ return 0;
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 5cd4bdb..0ce1bf8 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -1851,10 +1851,17 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info)
" too many incoming edges.\n");
/* We assume that the latch is empty. */
- if (!empty_block_p (loop->latch)
- || !gimple_seq_empty_p (phi_nodes (loop->latch)))
- return opt_result::failure_at (vect_location,
- "not vectorized: latch block not empty.\n");
+ basic_block latch = loop->latch;
+ do
+ {
+ if (!empty_block_p (latch)
+ || !gimple_seq_empty_p (phi_nodes (latch)))
+ return opt_result::failure_at (vect_location,
+ "not vectorized: latch block not "
+ "empty.\n");
+ latch = single_pred (latch);
+ }
+ while (single_succ_p (latch));
/* Make sure there is no abnormal exit. */
auto_vec<edge> exits = get_loop_exit_edges (loop);