diff options
author | Richard Biener <rguenther@suse.de> | 2016-08-23 13:58:19 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-08-23 13:58:19 +0000 |
commit | 027f10047bf1aa24b2e8e441b554c457a6132686 (patch) | |
tree | 6396360f350e48e4f33a1ca55abda5edb7097000 | |
parent | 5ea387db6c1eddc8a242d261ed2df1552222663c (diff) | |
download | gcc-027f10047bf1aa24b2e8e441b554c457a6132686.zip gcc-027f10047bf1aa24b2e8e441b554c457a6132686.tar.gz gcc-027f10047bf1aa24b2e8e441b554c457a6132686.tar.bz2 |
re PR tree-optimization/77286 (ICE in fold_convert_loc, at fold-const.c:2248 building 435.gromacs)
2016-08-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/77286
* tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify
the CFG here.
(vect_transform_loop): Split exit edges of loop and scalar
loop if required and at the appropriate time.
From-SVN: r239700
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 49 |
2 files changed, 41 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23cf5bc..5cf4158 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-08-23 Richard Biener <rguenther@suse.de> + + PR tree-optimization/77286 + * tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify + the CFG here. + (vect_transform_loop): Split exit edges of loop and scalar + loop if required and at the appropriate time. + 2016-08-23 Dominik Vogt <vogt@linux.vnet.ibm.com> * explow.c (get_dynamic_stack_size): Take known alignment of stack diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index c9ba581..fa06505 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -1486,23 +1486,14 @@ vect_analyze_loop_form_1 (struct loop *loop, gcond **loop_cond, return false; } - /* Make sure there exists a single-predecessor exit bb: */ - if (!single_pred_p (single_exit (loop)->dest)) + /* Make sure the exit is not abnormal. */ + edge e = single_exit (loop); + if (e->flags & EDGE_ABNORMAL) { - edge e = single_exit (loop); - if (!(e->flags & EDGE_ABNORMAL)) - { - split_loop_exit_edge (e); - if (dump_enabled_p ()) - dump_printf (MSG_NOTE, "split exit edge.\n"); - } - else - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: abnormal loop exit edge.\n"); - return false; - } + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "not vectorized: abnormal loop exit edge.\n"); + return false; } *loop_cond = vect_get_loop_niters (loop, assumptions, number_of_iterations, @@ -6759,6 +6750,16 @@ vect_transform_loop (loop_vec_info loop_vinfo) check_profitability = true; } + /* Make sure there exists a single-predecessor exit bb. Do this before + versioning. */ + edge e = single_exit (loop); + if (! single_pred_p (e->dest)) + { + split_loop_exit_edge (e); + if (dump_enabled_p ()) + dump_printf (MSG_NOTE, "split exit edge\n"); + } + /* Version the loop first, if required, so the profitability check comes first. */ @@ -6768,6 +6769,22 @@ vect_transform_loop (loop_vec_info loop_vinfo) check_profitability = false; } + /* Make sure there exists a single-predecessor exit bb also on the + scalar loop copy. Do this after versioning but before peeling + so CFG structure is fine for both scalar and if-converted loop + to make slpeel_duplicate_current_defs_from_edges face matched + loop closed PHI nodes on the exit. */ + if (LOOP_VINFO_SCALAR_LOOP (loop_vinfo)) + { + e = single_exit (LOOP_VINFO_SCALAR_LOOP (loop_vinfo)); + if (! single_pred_p (e->dest)) + { + split_loop_exit_edge (e); + if (dump_enabled_p ()) + dump_printf (MSG_NOTE, "split exit edge of scalar loop\n"); + } + } + tree ni_name = vect_build_loop_niters (loop_vinfo); LOOP_VINFO_NITERS_UNCHANGED (loop_vinfo) = ni_name; |