Commit 336ead04 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/51089 (internal compiler error: verify_flow_info failed)

	PR middle-end/51089
	* tree-eh.c (cleanup_empty_eh_merge_phis): Add check to
	avoid creating duplicate edges here.
	(cleanup_empty_eh_unsplit): And remove it in the caller.

	* gfortran.dg/gomp/pr51089.f90: New test.

From-SVN: r181859
parent 9abfe986
2011-11-30 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51089
* tree-eh.c (cleanup_empty_eh_merge_phis): Add check to
avoid creating duplicate edges here.
(cleanup_empty_eh_unsplit): And remove it in the caller.
2011-11-30 Andrew Pinski <apinski@cavium.com> 2011-11-30 Andrew Pinski <apinski@cavium.com>
PR c/51321 PR c/51321
2011-11-30 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51089
* gfortran.dg/gomp/pr51089.f90: New test.
2011-11-30 Andrew Pinski <apinski@cavium.com> 2011-11-30 Andrew Pinski <apinski@cavium.com>
* gcc.dg/pr51321.c: New testcase. * gcc.dg/pr51321.c: New testcase.
......
! PR middle-end/51089
! { dg-do compile }
! { dg-options "-O -fexceptions -fopenmp" }
subroutine foo
real, allocatable, dimension(:) :: s
real, dimension(:, :, :), pointer :: t
call fn1 (t, s)
call fn2 ()
end subroutine foo
subroutine bar
integer :: i
!$omp parallel do
do i = 1, 10
end do
end subroutine bar
...@@ -3653,6 +3653,22 @@ cleanup_empty_eh_merge_phis (basic_block new_bb, basic_block old_bb, ...@@ -3653,6 +3653,22 @@ cleanup_empty_eh_merge_phis (basic_block new_bb, basic_block old_bb,
bitmap rename_virts; bitmap rename_virts;
bitmap ophi_handled; bitmap ophi_handled;
/* The destination block must not be a regular successor for any
of the preds of the landing pad. Thus, avoid turning
<..>
| \ EH
| <..>
| /
<..>
into
<..>
| | EH
<..>
which CFG verification would choke on. See PR45172 and PR51089. */
FOR_EACH_EDGE (e, ei, old_bb->preds)
if (find_edge (e->src, new_bb))
return false;
FOR_EACH_EDGE (e, ei, old_bb->preds) FOR_EACH_EDGE (e, ei, old_bb->preds)
redirect_edge_var_map_clear (e); redirect_edge_var_map_clear (e);
...@@ -3815,8 +3831,6 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp) ...@@ -3815,8 +3831,6 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp)
{ {
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
tree lab; tree lab;
edge_iterator ei;
edge e;
/* We really ought not have totally lost everything following /* We really ought not have totally lost everything following
a landing pad label. Given that BB is empty, there had better a landing pad label. Given that BB is empty, there had better
...@@ -3839,22 +3853,6 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp) ...@@ -3839,22 +3853,6 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp)
return false; return false;
} }
/* The destination block must not be a regular successor for any
of the preds of the landing pad. Thus, avoid turning
<..>
| \ EH
| <..>
| /
<..>
into
<..>
| | EH
<..>
which CFG verification would choke on. See PR45172. */
FOR_EACH_EDGE (e, ei, bb->preds)
if (find_edge (e->src, e_out->dest))
return false;
/* Attempt to move the PHIs into the successor block. */ /* Attempt to move the PHIs into the successor block. */
if (cleanup_empty_eh_merge_phis (e_out->dest, bb, e_out, false)) if (cleanup_empty_eh_merge_phis (e_out->dest, bb, e_out, false))
{ {
......
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