[gcc r15-3960] tree-optimization/116879 - failure to recognize non-empty latch

Richard Biener rguenth@gcc.gnu.org
Mon Sep 30 14:20:03 GMT 2024


https://gcc.gnu.org/g:18e905b461a7138185cf4f0efde4a4e1214fb798

commit r15-3960-g18e905b461a7138185cf4f0efde4a4e1214fb798
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Sep 30 13:38:28 2024 +0200

    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.

Diff:
---
 gcc/testsuite/gcc.dg/pr116879.c | 15 +++++++++++++++
 gcc/tree-vect-loop.cc           | 15 +++++++++++----
 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 000000000000..73ddb2b658c9
--- /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 5cd4bdb32e04..0ce1bf8ebbac 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);


More information about the Gcc-cvs mailing list