From 5ba94a17e7b5934e179dca7b408a5cd92f0bc0cd Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 30 Aug 2019 13:12:23 +0200 Subject: [PATCH] backport: re PR tree-optimization/87895 (ICE in purge_dead_edges, at cfgrtl.c:3246) Backported from mainline 2018-11-20 Jakub Jelinek 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: r275070 --- gcc/ChangeLog | 9 +++++++++ gcc/omp-simd-clone.c | 11 ++++------- gcc/testsuite/ChangeLog | 9 ++++++++- gcc/testsuite/gcc.dg/gomp/pr87895-1.c | 19 +++++++++++++++++++ gcc/testsuite/gcc.dg/gomp/pr87895-2.c | 5 +++++ gcc/testsuite/gcc.dg/gomp/pr87895-3.c | 18 ++++++++++++++++++ 6 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gomp/pr87895-1.c create mode 100644 gcc/testsuite/gcc.dg/gomp/pr87895-2.c create mode 100644 gcc/testsuite/gcc.dg/gomp/pr87895-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fab10b03da02..131276bcf50b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,15 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2018-11-20 Jakub Jelinek + + 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). + 2018-10-20 Jakub Jelinek PR middle-end/87647 diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c index 99589d446646..9af80a45eb8f 100644 --- a/gcc/omp-simd-clone.c +++ b/gcc/omp-simd-clone.c @@ -993,6 +993,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node, if (greturn *return_stmt = dyn_cast (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); @@ -1133,14 +1135,9 @@ simd_clone_adjust (struct cgraph_node *node) basic_block orig_exit = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), 0)->src; incr_bb = create_empty_bb (orig_exit); 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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d31fbb97117..30c2257164f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,13 @@ 2019-08-30 Jakub Jelinek - + Backported from mainline + 2018-11-20 Jakub Jelinek + + PR tree-optimization/87895 + * gcc.dg/gomp/pr87895-1.c: New test. + * gcc.dg/gomp/pr87895-2.c: New test. + * gcc.dg/gomp/pr87895-3.c: New test. + 2018-11-19 Jakub Jelinek PR c++/60994 diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-1.c b/gcc/testsuite/gcc.dg/gomp/pr87895-1.c new file mode 100644 index 000000000000..22f5c6914164 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr87895-1.c @@ -0,0 +1,19 @@ +/* PR tree-optimization/87895 */ +/* { dg-do compile } */ +/* { dg-additional-options "-O0" } */ + +#pragma omp declare simd +int +foo (int x) +{ + if (x == 0) + return 0; +} + +#pragma omp declare simd +int +bar (int *x, int y) +{ + if ((y == 0) ? (*x = 0) : *x) + return 0; +} diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-2.c b/gcc/testsuite/gcc.dg/gomp/pr87895-2.c new file mode 100644 index 000000000000..3d27715428ea --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr87895-2.c @@ -0,0 +1,5 @@ +/* PR tree-optimization/87895 */ +/* { dg-do compile } */ +/* { dg-additional-options "-O1" } */ + +#include "pr87895-1.c" diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-3.c b/gcc/testsuite/gcc.dg/gomp/pr87895-3.c new file mode 100644 index 000000000000..382ad6d84cd3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr87895-3.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/87895 */ +/* { dg-do compile } */ +/* { dg-additional-options "-O2" } */ + +#pragma omp declare simd +int foo (int x) __attribute__((noreturn)); + +#pragma omp declare simd +int +bar (int x, int y) +{ + if (y == 1) + foo (x + 2); + if (y == 10) + foo (x + 6); + if (y != 25) + return 4; +} -- 2.47.2