return NULL_TREE;
}
+/* Add a new EH edge from SRC to EH_EDGE->dest, where EH_EDGE
+ is an older EH edge, and except for virtual PHIs duplicate the
+ PHI argument from the EH_EDGE to the new EH edge. */
+
+static void
+add_eh_edge (basic_block src, edge eh_edge)
+{
+ edge e = make_edge (src, eh_edge->dest, EDGE_EH);
+ e->probability = profile_probability::very_unlikely ();
+ for (gphi_iterator gsi = gsi_start_phis (eh_edge->dest);
+ !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gphi *phi = gsi.phi ();
+ tree lhs = gimple_phi_result (phi);
+ if (virtual_operand_p (lhs))
+ continue;
+ const phi_arg_d *arg = gimple_phi_arg (phi, eh_edge->dest_idx);
+ add_phi_arg (phi, arg->def, e, arg->locus);
+ }
+}
+
/* Helper function for handle_stmt method, handle a load from memory. */
tree
if (eh_edge)
{
edge e = split_block (gsi_bb (m_gsi), g);
- make_edge (e->src, eh_edge->dest, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src, eh_edge);
m_gsi = gsi_after_labels (e->dest);
if (gsi_bb (save_gsi) == e->src)
{
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_edge->dest, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src, eh_edge);
}
}
if (conditional)
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_edge->dest, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src, eh_edge);
}
if (tree_fits_uhwi_p (idx))
{
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_pad, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src,
+ find_edge (gimple_bb (stmt), eh_pad));
}
}
if (kind == bitint_prec_large)
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_pad, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src,
+ find_edge (gimple_bb (stmt), eh_pad));
}
}
if (new_bb)
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_pad, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src, find_edge (gimple_bb (stmt), eh_pad));
}
}
if (kind == bitint_prec_huge && i == (bo_bit != 0))
{
edge e = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e->dest);
- make_edge (e->src, eh_pad, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e->src, find_edge (gimple_bb (stmt), eh_pad));
}
}
}
{
edge e2 = split_block (gsi_bb (m_gsi), g);
m_gsi = gsi_after_labels (e2->dest);
- make_edge (e2->src, e1->dest, EDGE_EH)->probability
- = profile_probability::very_unlikely ();
+ add_eh_edge (e2->src, e1);
}
}
}