aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-simd-clone.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-11-20 21:44:38 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-11-20 21:44:38 +0100
commit260a993319bdf4ebc01298b7e802afbd3b35574a (patch)
tree4b9e2eecda347c32bfd5e0a1066da9ed4d289a5f /gcc/omp-simd-clone.c
parent59730cc567ecdd3a550d9c005dbaa63620cc0f19 (diff)
downloadgcc-260a993319bdf4ebc01298b7e802afbd3b35574a.zip
gcc-260a993319bdf4ebc01298b7e802afbd3b35574a.tar.gz
gcc-260a993319bdf4ebc01298b7e802afbd3b35574a.tar.bz2
re PR tree-optimization/87895 (ICE in purge_dead_edges, at cfgrtl.c:3246)
PR tree-optimization/87895 * omp-simd-clone.c (ipa_simd_modify_function_body): When removing or replacing GIMPLE_RETURN, set EDGE_FALLTHRU on the edge to EXIT. (simd_clone_adjust): Don't set EDGE_FALLTHRU here. In a loop that redirects edges to EXIT to edges to incr_bb, iterate while EXIT has any preds and always use EDGE_PRED (, 0). * gcc.dg/gomp/pr87895-1.c: New test. * gcc.dg/gomp/pr87895-2.c: New test. * gcc.dg/gomp/pr87895-3.c: New test. From-SVN: r266328
Diffstat (limited to 'gcc/omp-simd-clone.c')
-rw-r--r--gcc/omp-simd-clone.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c
index 7aa362a..ba03bd5 100644
--- a/gcc/omp-simd-clone.c
+++ b/gcc/omp-simd-clone.c
@@ -994,6 +994,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node,
if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
{
tree retval = gimple_return_retval (return_stmt);
+ edge e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
+ e->flags |= EDGE_FALLTHRU;
if (!retval)
{
gsi_remove (&gsi, true);
@@ -1150,14 +1152,9 @@ simd_clone_adjust (struct cgraph_node *node)
incr_bb = create_empty_bb (orig_exit);
incr_bb->count = profile_count::zero ();
add_bb_to_loop (incr_bb, body_bb->loop_father);
- /* The succ of orig_exit was EXIT_BLOCK_PTR_FOR_FN (cfun), with an empty
- flag. Set it now to be a FALLTHRU_EDGE. */
- gcc_assert (EDGE_COUNT (orig_exit->succs) == 1);
- EDGE_SUCC (orig_exit, 0)->flags |= EDGE_FALLTHRU;
- for (unsigned i = 0;
- i < EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds); ++i)
+ while (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
{
- edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), i);
+ edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
redirect_edge_succ (e, incr_bb);
incr_bb->count += e->count ();
}