diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a32bf02b6dc..f54a4764c445 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-11-19 Richard Biener + + PR tree-optimization/59164 + * tree-vect-loop-manip.c (vect_update_ivs_after_vectorizer): + Uncomment assert. + * tree-vect-loop.c (vect_analyze_loop_operations): Adjust + check whether we can create an epilogue loop to reflect the + cases where we create one. + 2013-11-19 Andrew MacLeod * graphite-sese-to-poly.c: Include expr.h. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89776eaab1a0..c9605bc0973e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-19 Richard Biener + + PR tree-optimization/59164 + * gcc.dg/torture/pr59164.c: New testcase. + 2013-11-19 Richard Biener PR middle-end/58956 diff --git a/gcc/testsuite/gcc.dg/torture/pr59164.c b/gcc/testsuite/gcc.dg/torture/pr59164.c new file mode 100644 index 000000000000..1ec69610c21d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59164.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +int a, d, e; +long b[10]; +int c[10][8]; + +int fn1(p1) +{ + return 1 >> p1; +} + +void fn2(void) +{ + int f; + for (a=1; a <= 4; a++) + { + f = fn1(0 < c[a][0]); + if (f || d) + e = b[a] = 1; + } +} diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 5c149951b846..3193f20e5a9e 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1673,7 +1673,7 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, tree niters, gimple_stmt_iterator gsi, gsi1; basic_block update_bb = update_e->dest; - /* gcc_assert (vect_can_advance_ivs_p (loop_vinfo)); */ + gcc_checking_assert (vect_can_advance_ivs_p (loop_vinfo)); /* Make sure there exists a single-predecessor exit bb: */ gcc_assert (single_pred_p (exit_bb)); diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 4a277ae419ae..a97d413f5cda 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -1588,24 +1588,19 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo, bool slp) return false; } - if (LOOP_PEELING_FOR_ALIGNMENT (loop_vinfo) + if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) || ((int) tree_ctz (LOOP_VINFO_NITERS (loop_vinfo)) < exact_log2 (vectorization_factor))) { if (dump_enabled_p ()) - dump_printf_loc (MSG_NOTE, vect_location, "epilog loop required.\n"); - if (!vect_can_advance_ivs_p (loop_vinfo)) + dump_printf_loc (MSG_NOTE, vect_location, "epilog loop required\n"); + if (!vect_can_advance_ivs_p (loop_vinfo) + || !slpeel_can_duplicate_loop_p (loop, single_exit (loop))) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: can't create epilog loop 1.\n"); - return false; - } - if (!slpeel_can_duplicate_loop_p (loop, single_exit (loop))) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: can't create epilog loop 2.\n"); + "not vectorized: can't create required " + "epilog loop\n"); return false; } }