re PR tree-optimization/92371 (ICE in info_for_reduction, at tree-vect-loop.c:4106)
authorRichard Biener <rguenther@suse.de>
Tue, 5 Nov 2019 16:12:07 +0000 (16:12 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Nov 2019 16:12:07 +0000 (16:12 +0000)
2019-11-05  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92371
* tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF
on the original stmt of live stmts in the chain.
(vectorizable_live_operation): Look at the original stmt when
checking STMT_VINFO_REDUC_DEF.

* gcc.dg/torture/pr92371.c: New testcase.

From-SVN: r277850

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr92371.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index d5e0f61..21304fd 100644 (file)
@@ -1,3 +1,11 @@
+2019-11-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92371
+       * tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF
+       on the original stmt of live stmts in the chain.
+       (vectorizable_live_operation): Look at the original stmt when
+       checking STMT_VINFO_REDUC_DEF.
+
 2019-11-05  Aldy Hernandez  <aldyh@redhat.com>
 
        * gimple-fold.c, gimple-loop-versioning.cc,
index a148816..725cfa5 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92371
+       * gcc.dg/torture/pr92371.c: New testcase.
+
 2019-11-05  Martin Liska  <mliska@suse.cz>
 
        * c-c++-common/ubsan/ptr-overflow-2.c: Update based on changed
diff --git a/gcc/testsuite/gcc.dg/torture/pr92371.c b/gcc/testsuite/gcc.dg/torture/pr92371.c
new file mode 100644 (file)
index 0000000..0c78d32
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ftree-vectorize" } */
+
+int a, b;
+void d()
+{
+  int c = sizeof(int);
+  for (; a; a++)
+    c *= sizeof(int);
+  c *= sizeof(int);
+  b = c;
+}
index 3448b55..a63f8d5 100644 (file)
@@ -5836,21 +5836,22 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
   while (reduc_def != PHI_RESULT (reduc_def_phi))
     {
       stmt_vec_info def = loop_vinfo->lookup_def (reduc_def);
-      def = vect_stmt_to_vectorize (def);
-      if (STMT_VINFO_REDUC_IDX (def) == -1)
+      stmt_vec_info vdef = vect_stmt_to_vectorize (def);
+      if (STMT_VINFO_REDUC_IDX (vdef) == -1)
        {
          if (dump_enabled_p ())
            dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
                             "reduction chain broken by patterns.\n");
          return false;
        }
-      if (!REDUC_GROUP_FIRST_ELEMENT (def))
+      if (!REDUC_GROUP_FIRST_ELEMENT (vdef))
        only_slp_reduc_chain = false;
       /* ???  For epilogue generation live members of the chain need
-         to point back to the PHI for info_for_reduction to work.  */
-      if (STMT_VINFO_LIVE_P (def))
+         to point back to the PHI via their original stmt for
+        info_for_reduction to work.  */
+      if (STMT_VINFO_LIVE_P (vdef))
        STMT_VINFO_REDUC_DEF (def) = phi_info;
-      reduc_def = gimple_op (def->stmt, 1 + STMT_VINFO_REDUC_IDX (def));
+      reduc_def = gimple_op (vdef->stmt, 1 + STMT_VINFO_REDUC_IDX (vdef));
       reduc_chain_length++;
     }
 
@@ -7554,7 +7555,7 @@ vectorizable_live_operation (stmt_vec_info stmt_info,
   /* If a stmt of a reduction is live, vectorize it via
      vect_create_epilog_for_reduction.  vectorizable_reduction assessed
      validity so just trigger the transform here.  */
-  if (STMT_VINFO_REDUC_DEF (stmt_info))
+  if (STMT_VINFO_REDUC_DEF (vect_orig_stmt (stmt_info)))
     {
       if (!vec_stmt_p)
        return true;