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 =

Reply via email to