The checking code didn't take into account debug uses.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/118653
        * tree-vect-loop.cc (vectorizable_live_operation): Also allow
        out-of-loop debug uses.

        * gcc.dg/vect/pr118653.c: New testcase.
---
 gcc/testsuite/gcc.dg/vect/pr118653.c | 15 +++++++++++++++
 gcc/tree-vect-loop.cc                |  3 ++-
 2 files changed, 17 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/pr118653.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr118653.c 
b/gcc/testsuite/gcc.dg/vect/pr118653.c
new file mode 100644
index 00000000000..9322b23a17d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr118653.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3 -g" } */
+
+static short func1 (short si1, short si2) {
+  return (si1 - si2);
+}
+unsigned short g_72;
+extern int g_100[];
+short g_173;
+void func_42(void)
+{
+  for (g_173 = 10; g_173 > 0; g_173 = func1 (g_173, 1))
+    for (g_72 = 1; g_72 < 5; g_72++)
+      g_100[g_72] &= 1;
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index edd7d4d8763..ce674a71e8a 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -11574,7 +11574,8 @@ vectorizable_live_operation (vec_info *vinfo, 
stmt_vec_info stmt_info,
 
       /* There a no further out-of-loop uses of lhs by LC-SSA construction.  */
       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs)
-       gcc_assert (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)));
+       gcc_assert (is_gimple_debug (use_stmt)
+                   || flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)));
     }
   else
     {
-- 
2.43.0

Reply via email to