+2005-10-24 Steven Bosscher <stevenb@suse.de>
+
+ PR tree-optimization/24255
+ * profile.c (branch_prob): Look from end to start through a
+ basic block when looking for a locus.
+
2005-10-24 Richard Henderson <rth@redhat.com>
* pa.c (store_reg_modify): Set RTX_FRAME_RELATED_P on each set in
2005-10-20 Steven Bosscher <stevenb@suse.de>
- PR tree-optimization/24225
+ PR tree-optimization/24307
* tree-cfg.c (tree_find_edge_insert_loc): Handle naked RETURN_EXPR.
2005-10-20 Alexandre Oliva <aoliva@redhat.com>
FOR_EACH_EDGE (e, ei, bb->succs)
{
- tree last = last_stmt (bb);
+ block_stmt_iterator bsi;
+ tree last = NULL;
+
+ /* It may happen that there are compiler generated statements
+ without a locus at all. Go through the basic block from the
+ last to the first statement looking for a locus. */
+ for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
+ {
+ last = bsi_stmt (bsi);
+ if (EXPR_LOCUS (last))
+ break;
+ }
+
/* Edge with goto locus might get wrong coverage info unless
it is the only edge out of BB.
Don't do that when the locuses match, so
if (blah) goto something;
is not computed twice. */
- if (e->goto_locus && !single_succ_p (bb)
+ if (last && EXPR_LOCUS (last)
+ && e->goto_locus
+ && !single_succ_p (bb)
#ifdef USE_MAPPED_LOCATION
&& (LOCATION_FILE (e->goto_locus)
!= LOCATION_FILE (EXPR_LOCATION (last))
!= LOCATION_LINE (EXPR_LOCATION (last)))))
#else
&& (e->goto_locus->file != EXPR_LOCUS (last)->file
- || (e->goto_locus->line
- != EXPR_LOCUS (last)->line)))
+ || (e->goto_locus->line != EXPR_LOCUS (last)->line)))
#endif
{
basic_block new = split_edge (e);