http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59409
--- Comment #5 from H.J. Lu <hjl.tools at gmail dot com> --- (In reply to H.J. Lu from comment #4) > Should it consider both *first_niters and scalar_loop_iters? Something like this diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 380fd22..3f85cc1 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1265,6 +1265,7 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop, loop_vec_info loop_vinfo = loop_vec_info_for_loop (loop); tree scalar_loop_iters = LOOP_VINFO_NITERSM1 (loop_vinfo); unsigned limit = LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1; + tree cmp_condition; if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)) limit = limit + 1; if (check_profitability @@ -1273,6 +1274,17 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop, pre_condition = fold_build2 (LT_EXPR, boolean_type_node, scalar_loop_iters, build_int_cst (TREE_TYPE (scalar_loop_iters), limit)); + cmp_condition = + fold_build2 (LT_EXPR, boolean_type_node, scalar_loop_iters, + *first_niters); + cmp_condition = + fold_build2 (TRUTH_AND_EXPR, boolean_type_node, + cmp_condition, + fold_build2 (LE_EXPR, boolean_type_node, *first_niters, + build_int_cst (TREE_TYPE (*first_niters), 0))); + pre_condition = + fold_build2 (TRUTH_OR_EXPR, boolean_type_node, + pre_condition, cmp_condition); if (cond_expr) { pre_condition =