re PR bootstrap/92301 (Wrong vectorizer code since r277566)
authorRichard Biener <rguenther@suse.de>
Mon, 4 Nov 2019 10:08:22 +0000 (10:08 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 4 Nov 2019 10:08:22 +0000 (10:08 +0000)
2019-11-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92301
* tree-vect-stmts.c (process_use): Force reduction PHI defs live
as required by epilogue generation

* gcc.dg/pr92301.c: New testcase.

From-SVN: r277771

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr92301.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 418c3799f52b809b5c58af62ca0938cbc75c6433..5807a69b9adc42f356226636d192dbd6f3789ea4 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92301
+       * tree-vect-stmts.c (process_use): Force reduction PHI defs live
+       as required by epilogue generation
+
 2019-11-04  Martin Liska  <mliska@suse.cz>
 
        PR ipa/92304
index 13acfbb1cf864a2ffbb824a02b46836935db2487..7140f1d7e80e8a740c11945cfc9110bde1ee5435 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92301
+       * gcc.dg/pr92301.c: New testcase.
+
 2019-11-03  Martin Sebor  <msebor@redhat.com>
 
        PR c++/88565
diff --git a/gcc/testsuite/gcc.dg/pr92301.c b/gcc/testsuite/gcc.dg/pr92301.c
new file mode 100644 (file)
index 0000000..9a47e12
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+unsigned int m;
+
+#define N 128
+unsigned int a[N];
+
+unsigned int
+__attribute__((noipa))
+df_count_refs (_Bool include_defs)
+{
+  int size = 0;
+
+  for (unsigned int regno = 0; regno < m; regno++)
+    if (include_defs)
+      size += a[regno];
+  return size;
+}
+
+int main(int argc, char **argv)
+{
+  for (unsigned i = 0; i < N; i++)
+    a[i] = i;
+
+  if (argc == 1)
+    m = 17;
+
+  unsigned int r = df_count_refs(1);
+  __builtin_printf ("r: %d\n", r);
+  if (r != 136)
+    __builtin_abort ();
+
+  return 0;
+}
index 7f5228208a038c3eb7f8d1606c75bfa36e88dc4d..3cda8888521722015058beff70638009405dc107 100644 (file)
@@ -475,6 +475,22 @@ process_use (stmt_vec_info stmt_vinfo, tree use, loop_vec_info loop_vinfo,
   basic_block def_bb = gimple_bb (dstmt_vinfo->stmt);
   basic_block bb = gimple_bb (stmt_vinfo->stmt);
 
+  /* case 2: A reduction phi (STMT) defined by a reduction stmt (DSTMT_VINFO).
+     We have to force the stmt live since the epilogue loop needs it to
+     continue computing the reduction.  */
+  if (gimple_code (stmt_vinfo->stmt) == GIMPLE_PHI
+      && STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def
+      && gimple_code (dstmt_vinfo->stmt) != GIMPLE_PHI
+      && STMT_VINFO_DEF_TYPE (dstmt_vinfo) == vect_reduction_def
+      && bb->loop_father == def_bb->loop_father)
+    {
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_NOTE, vect_location,
+                        "reduc-stmt defining reduc-phi in the same nest.\n");
+      vect_mark_relevant (worklist, dstmt_vinfo, relevant, true);
+      return opt_result::success ();
+    }
+
   /* case 3a: outer-loop stmt defining an inner-loop stmt:
        outer-loop-header-bb:
                d = dstmt_vinfo