re PR tree-optimization/24225 (ICE: segmentation fault in profile.c:branch_prob)

PR tree-optimization/24225

gcc/
	* profile.c (branch_prob): Look from end to start through a
	basic block when looking for a locus.

testsuite/
	* gcc.dg/pr24225.c: New test.

From-SVN: r105857
This commit is contained in:
Steven Bosscher 2005-10-24 19:20:38 +00:00 committed by Steven Bosscher
parent 77c4f044f6
commit 7ffc0411cc
4 changed files with 43 additions and 5 deletions

View File

@ -1,3 +1,9 @@
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
@ -83,7 +89,7 @@
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>

View File

@ -806,13 +806,27 @@ branch_prob (void)
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))
@ -820,8 +834,7 @@ branch_prob (void)
!= 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);

View File

@ -1,3 +1,7 @@
2005-10-24 Steven Bosscher <stevenb@suse.de>
* gcc.dg/pr24225.c: New test.
2005-10-24 Asher Langton <langton2@llnl.gov>
* gfortran.dg/dup_save_1.f90: New test.

View File

@ -0,0 +1,15 @@
/* This was an ICE caused by the compiler-generated stack save/restore
statements around s[b]. */
/* { dg-do compile} */
/* { dg-options "-O1 -fprofile-arcs" } */
int
foo (int a, int b)
{
if (a)
return 1;
{
int s [b];
return 0;
}
}