aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven Bosscher <stevenb@suse.de>2005-10-24 19:20:38 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2005-10-24 19:20:38 +0000
commit7ffc0411cc7a2dce0d2c667dd1e252c5f0eecc2f (patch)
tree78d749862fc5fc748bcc0b95c662c0ae14a9f3ed /gcc
parent77c4f044f6ed9067a72d516bc6b40728fb9756eb (diff)
downloadgcc-7ffc0411cc7a2dce0d2c667dd1e252c5f0eecc2f.zip
gcc-7ffc0411cc7a2dce0d2c667dd1e252c5f0eecc2f.tar.gz
gcc-7ffc0411cc7a2dce0d2c667dd1e252c5f0eecc2f.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/profile.c21
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr24225.c15
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 14e264c..b22e317 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/profile.c b/gcc/profile.c
index 1fc8aa5..d260d66 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e8f9703..f952b56 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/pr24225.c b/gcc/testsuite/gcc.dg/pr24225.c
new file mode 100644
index 0000000..b364f82
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr24225.c
@@ -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;
+ }
+}