This backport contains 1 patch from gcc main stream tree. The commit id of these patchs list as following in the order of time. 0001-re-PR-tree-optimization-92345-ICE-in-vec-_stmt_vec_i.patch a6ba623777513e31721030092e4d786f461a0f06 diff -Nurp a/gcc/testsuite/gcc.dg/torture/pr92345.c b/gcc/testsuite/gcc.dg/torture/pr92345.c --- a/gcc/testsuite/gcc.dg/torture/pr92345.c 1970-01-01 08:00:00.000000000 +0800 +++ b/gcc/testsuite/gcc.dg/torture/pr92345.c 2020-08-10 15:08:19.992000000 +0800 @@ -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; +} diff -Nurp a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c --- a/gcc/tree-vect-loop.c 2020-08-10 15:07:44.456000000 +0800 +++ b/gcc/tree-vect-loop.c 2020-08-10 15:08:19.992000000 +0800 @@ -155,7 +155,7 @@ along with GCC; see the file COPYING3. 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_i tree init, step; auto_vec 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_i && 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_i /* 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); } @@ -3032,7 +3033,7 @@ check_reduction_path (dump_user_location 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 (phi_info->stmt); gimple *phi_use_stmt = NULL; @@ -3040,6 +3041,7 @@ vect_is_simple_reduction (loop_vec_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); @@ -3214,6 +3216,7 @@ vect_is_simple_reduction (loop_vec_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");