Commit 260a9933 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 59730cc5
2018-11-20 Jakub Jelinek <jakub@redhat.com>
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-11-20 Uros Bizjak <ubizjak@gmail.com> 2018-11-20 Uros Bizjak <ubizjak@gmail.com>
PR target/88070 PR target/88070
...@@ -994,6 +994,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node, ...@@ -994,6 +994,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node,
if (greturn *return_stmt = dyn_cast <greturn *> (stmt)) if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
{ {
tree retval = gimple_return_retval (return_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) if (!retval)
{ {
gsi_remove (&gsi, true); gsi_remove (&gsi, true);
...@@ -1150,14 +1152,9 @@ simd_clone_adjust (struct cgraph_node *node) ...@@ -1150,14 +1152,9 @@ simd_clone_adjust (struct cgraph_node *node)
incr_bb = create_empty_bb (orig_exit); incr_bb = create_empty_bb (orig_exit);
incr_bb->count = profile_count::zero (); incr_bb->count = profile_count::zero ();
add_bb_to_loop (incr_bb, body_bb->loop_father); 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 while (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
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)
{ {
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); redirect_edge_succ (e, incr_bb);
incr_bb->count += e->count (); incr_bb->count += e->count ();
} }
......
2018-11-20 Jakub Jelinek <jakub@redhat.com>
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-20 Uros Bizjak <ubizjak@gmail.com> 2018-11-20 Uros Bizjak <ubizjak@gmail.com>
PR target/88070 PR target/88070
......
/* 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;
}
/* PR tree-optimization/87895 */
/* { dg-do compile } */
/* { dg-additional-options "-O1" } */
#include "pr87895-1.c"
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment