diff options
author | Jan Hubicka <jh@suse.cz> | 2013-09-09 14:09:50 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-09-09 12:09:50 +0000 |
commit | a811f7cbad669cb3398ada5fd29cea19f7dff1d3 (patch) | |
tree | 469273de9e3e40df54ce28e45a95668c9755fada /gcc/value-prof.c | |
parent | dcad1dd3a35d7df31ce81bed0f94bb5b6d5a3328 (diff) | |
download | gcc-a811f7cbad669cb3398ada5fd29cea19f7dff1d3.zip gcc-a811f7cbad669cb3398ada5fd29cea19f7dff1d3.tar.gz gcc-a811f7cbad669cb3398ada5fd29cea19f7dff1d3.tar.bz2 |
re PR tree-optimization/58294 (ice in update_ssa_across_abnormal_edges, at tree-inline.c:1892)
PR middle-end/58294
* value-prof.c (gimple_ic): Copy also abnormal edges.
* g++.dg/torture/PR58294.C: New testcase.
From-SVN: r202389
Diffstat (limited to 'gcc/value-prof.c')
-rw-r--r-- | gcc/value-prof.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 3aa5c74..498eb90 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -1299,6 +1299,9 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, edge e_cd, e_ci, e_di, e_dj = NULL, e_ij; gimple_stmt_iterator gsi; int lp_nr, dflags; + edge e_eh, e; + edge_iterator ei; + gimple_stmt_iterator psi; cond_bb = gimple_bb (icall_stmt); gsi = gsi_for_stmt (icall_stmt); @@ -1401,24 +1404,21 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, lp_nr = lookup_stmt_eh_lp (icall_stmt); if (lp_nr > 0 && stmt_could_throw_p (dcall_stmt)) { - edge e_eh, e; - edge_iterator ei; - gimple_stmt_iterator psi; - add_stmt_to_eh_lp (dcall_stmt, lp_nr); - FOR_EACH_EDGE (e_eh, ei, icall_bb->succs) - if (e_eh->flags & EDGE_EH) - break; - e = make_edge (dcall_bb, e_eh->dest, EDGE_EH); - for (psi = gsi_start_phis (e_eh->dest); - !gsi_end_p (psi); gsi_next (&psi)) - { - gimple phi = gsi_stmt (psi); - SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), - PHI_ARG_DEF_FROM_EDGE (phi, e_eh)); - } } + FOR_EACH_EDGE (e_eh, ei, icall_bb->succs) + if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL)) + { + e = make_edge (dcall_bb, e_eh->dest, e_eh->flags); + for (psi = gsi_start_phis (e_eh->dest); + !gsi_end_p (psi); gsi_next (&psi)) + { + gimple phi = gsi_stmt (psi); + SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), + PHI_ARG_DEF_FROM_EDGE (phi, e_eh)); + } + } return dcall_stmt; } |