re PR tree-optimization/92345 (ICE in vec<_stmt_vec_info*, va_heap, vl_embed>::space...
authorRichard Biener <rguenther@suse.de>
Mon, 4 Nov 2019 14:50:11 +0000 (14:50 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 4 Nov 2019 14:50:11 +0000 (14:50 +0000)
2019-11-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92345
* tree-vect-loop.c (vect_is_simple_reduction): Return whether
we produced a reduction chain.
(vect_analyze_scalar_cycles_1): Do not add reduction chains to
LOOP_VINFO_REDUCTIONS.

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

From-SVN: r277782

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

index a9222a8deafeebf77326c3428882e29327e5e5d8..ae177e25f1f345ef1774ea4fd558b62be0f3e028 100644 (file)
@@ -1,3 +1,11 @@
+2019-11-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92345
+       * tree-vect-loop.c (vect_is_simple_reduction): Return whether
+       we produced a reduction chain.
+       (vect_analyze_scalar_cycles_1): Do not add reduction chains to
+       LOOP_VINFO_REDUCTIONS.
+
 2019-11-04  Jan Hubicka  <jh@suse.cz>
 
        * cgraphclones.c (cgraph_node::create_version_clone): Do not
index 7f7acb3f887a8f7b805e69ae618fc98f99a29924..a44eca595dc10282ab123ac0caa7eeca57838193 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92345
+       * gcc.dg/torture/pr92345.c: New testcase.
+
 2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * gcc.target/msp430/tiny-printf.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr92345.c b/gcc/testsuite/gcc.dg/torture/pr92345.c
new file mode 100644 (file)
index 0000000..331615b
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ftree-vectorize" } */
+
+long int x1;
+int fr;
+
+int
+us (int sk, int jx)
+{
+  while (sk < 1)
+    {
+      jx *= 2;
+      fr += x1 + 1;
+      ++sk;
+    }
+
+  return jx;
+}
index fa873e9b435037e5a81dda6615cab809d2d4de48..9d31381fac13dd8f65673512e8206d170c9050be 100644 (file)
@@ -155,7 +155,7 @@ along with GCC; see the file COPYING3.  If not see
 
 static void vect_estimate_min_profitable_iters (loop_vec_info, int *, int *);
 static stmt_vec_info vect_is_simple_reduction (loop_vec_info, stmt_vec_info,
-                                              bool *);
+                                              bool *, bool *);
 
 /* Subroutine of vect_determine_vf_for_stmt that handles only one
    statement.  VECTYPE_MAYBE_SET_P is true if STMT_VINFO_VECTYPE
@@ -489,7 +489,7 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, class loop *loop)
   tree init, step;
   auto_vec<stmt_vec_info, 64> worklist;
   gphi_iterator gsi;
-  bool double_reduc;
+  bool double_reduc, reduc_chain;
 
   DUMP_VECT_SCOPE ("vect_analyze_scalar_cycles");
 
@@ -561,7 +561,8 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, class loop *loop)
                  && STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_unknown_def_type);
 
       stmt_vec_info reduc_stmt_info
-       = vect_is_simple_reduction (loop_vinfo, stmt_vinfo, &double_reduc);
+       = vect_is_simple_reduction (loop_vinfo, stmt_vinfo, &double_reduc,
+                                   &reduc_chain);
       if (reduc_stmt_info)
         {
          STMT_VINFO_REDUC_DEF (stmt_vinfo) = reduc_stmt_info;
@@ -596,7 +597,7 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, class loop *loop)
                   /* Store the reduction cycles for possible vectorization in
                      loop-aware SLP if it was not detected as reduction
                     chain.  */
-                 if (! REDUC_GROUP_FIRST_ELEMENT (reduc_stmt_info))
+                 if (! reduc_chain)
                    LOOP_VINFO_REDUCTIONS (loop_vinfo).safe_push
                      (reduc_stmt_info);
                 }
@@ -2854,7 +2855,7 @@ check_reduction_path (dump_user_location_t loc, loop_p loop, gphi *phi,
 
 static stmt_vec_info
 vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
-                         bool *double_reduc)
+                         bool *double_reduc, bool *reduc_chain_p)
 {
   gphi *phi = as_a <gphi *> (phi_info->stmt);
   gimple *phi_use_stmt = NULL;
@@ -2862,6 +2863,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
   use_operand_p use_p;
 
   *double_reduc = false;
+  *reduc_chain_p = false;
   STMT_VINFO_REDUC_TYPE (phi_info) = TREE_CODE_REDUCTION;
 
   tree phi_name = PHI_RESULT (phi);
@@ -3036,6 +3038,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
          LOOP_VINFO_REDUCTION_CHAINS (loop_info).safe_push (reduc_chain[0]);
          REDUC_GROUP_SIZE (reduc_chain[0]) = reduc_chain.length ();
 
+         *reduc_chain_p = true;
          if (dump_enabled_p ())
            dump_printf_loc (MSG_NOTE, vect_location,
                            "reduction: detected reduction chain\n");