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

Richard.

2019-11-05  Richard Biener  <rguent...@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.

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c        (revision 277849)
+++ gcc/tree-vect-loop.c        (working copy)
@@ -5836,21 +5836,22 @@ vectorizable_reduction (stmt_vec_info st
   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_in
   /* 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;

Reply via email to