diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-09-01 21:46:21 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-09-01 21:46:21 +0200 |
commit | 596aa3f09d3cb553112fe78da3074075da57d1b9 (patch) | |
tree | 9e0a17e9a383ec52b3b585ae4ee302d6b1d3b78e /gcc | |
parent | cd34bbe8b9ca57dfaa40e41cef02b003d842b3f4 (diff) | |
download | gcc-596aa3f09d3cb553112fe78da3074075da57d1b9.zip gcc-596aa3f09d3cb553112fe78da3074075da57d1b9.tar.gz gcc-596aa3f09d3cb553112fe78da3074075da57d1b9.tar.bz2 |
re PR middle-end/45458 (ICE: in add_labels_and_missing_jumps, at bb-reorder.c:1306 with-fnon-call-exceptions -freorder-blocks-and-partition -fprofile-use)
PR middle-end/45458
* bb-reorder.c (add_labels_and_missing_jumps): Treat
bbs ending with throwing insns like blocks ending with a call.
(fix_up_fall_thru_edges): Likewise.
* g++.dg/tree-prof/partition2.C: New test.
From-SVN: r163743
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/bb-reorder.c | 38 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-prof/partition2.C | 15 |
4 files changed, 48 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 10ea824..077c6fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-09-01 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/45458 + * bb-reorder.c (add_labels_and_missing_jumps): Treat + bbs ending with throwing insns like blocks ending with a call. + (fix_up_fall_thru_edges): Likewise. + 2010-09-01 Nathan Froyd <froydnj@codesourcery.com> * config/m32c/m32c-protos.h (m32c_function_arg): Delete. diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index 2bf0b85..e499614 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -1299,7 +1299,9 @@ add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges) if (src && (src != ENTRY_BLOCK_PTR)) { - if (!JUMP_P (BB_END (src)) && !block_ends_with_call_p (src)) + if (!JUMP_P (BB_END (src)) + && !block_ends_with_call_p (src) + && !can_throw_internal (BB_END (src))) /* bb just falls through. */ { /* make sure there's only one successor */ @@ -1316,9 +1318,9 @@ add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges) src->il.rtl->footer = unlink_insn_chain (barrier, barrier); /* Mark edge as non-fallthru. */ crossing_edges[i]->flags &= ~EDGE_FALLTHRU; - } /* end: 'if (GET_CODE ... ' */ - } /* end: 'if (src && src->index...' */ - } /* end: 'if (dest && dest->index...' */ + } /* end: 'if (!JUMP_P ... ' */ + } /* end: 'if (src && src !=...' */ + } /* end: 'if (dest && dest !=...' */ } /* end: 'if (crossing_edges[i]...' */ } /* end for loop */ } @@ -1375,19 +1377,21 @@ fix_up_fall_thru_edges (void) fall_thru = succ2; cond_jump = succ1; } - else if (!fall_thru && succ1 && block_ends_with_call_p (cur_bb)) - { - edge e; - edge_iterator ei; - - /* Find EDGE_CAN_FALLTHRU edge. */ - FOR_EACH_EDGE (e, ei, cur_bb->succs) - if (e->flags & EDGE_CAN_FALLTHRU) - { - fall_thru = e; - break; - } - } + else if (succ1 + && (block_ends_with_call_p (cur_bb) + || can_throw_internal (BB_END (cur_bb)))) + { + edge e; + edge_iterator ei; + + /* Find EDGE_CAN_FALLTHRU edge. */ + FOR_EACH_EDGE (e, ei, cur_bb->succs) + if (e->flags & EDGE_CAN_FALLTHRU) + { + fall_thru = e; + break; + } + } if (fall_thru && (fall_thru->dest != EXIT_BLOCK_PTR)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67f5a20..fbe877c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-01 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/45458 + * g++.dg/tree-prof/partition2.C: New test. + 2010-09-01 Richard Guenther <rguenther@suse.de> * gcc.dg/vect/vect-outer-fir.c: Adjust. diff --git a/gcc/testsuite/g++.dg/tree-prof/partition2.C b/gcc/testsuite/g++.dg/tree-prof/partition2.C new file mode 100644 index 0000000..ca5671f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/partition2.C @@ -0,0 +1,15 @@ +// PR middle-end/45458 +// { dg-require-effective-target freorder } +// { dg-options "-fnon-call-exceptions -freorder-blocks-and-partition" } + +int +main () +{ + try + { + throw 6; + } + catch (...) + { + } +} |