diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-01-21 20:35:42 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-01-21 20:35:42 +0100 |
commit | aaa52a96feb60e1575f284e2fe87a851ec312b61 (patch) | |
tree | 2f06c97b51a57f4c825b3b7477b29a1a12ddc91a /gcc/except.c | |
parent | 7360d2ac8dae5659de0adc18cd1d74b15a5971ed (diff) | |
download | gcc-aaa52a96feb60e1575f284e2fe87a851ec312b61.zip gcc-aaa52a96feb60e1575f284e2fe87a851ec312b61.tar.gz gcc-aaa52a96feb60e1575f284e2fe87a851ec312b61.tar.bz2 |
re PR middle-end/45566 (ICE: in convert_to_eh_region_ranges, at except.c:2446 with -freorder-blocks-and-partition -fnon-call-exceptions -fprofile-use)
PR middle-end/45566
* except.c (convert_to_eh_region_ranges): Emit queued no-region
notes from other section in hot/cold partitioning even if
last_action is -3. Increment call_site_base.
* g++.dg/tree-prof/partition3.C: New test.
* g++.dg/tree-prof/tree-prof.exp: Fix a comment.
From-SVN: r169101
Diffstat (limited to 'gcc/except.c')
-rw-r--r-- | gcc/except.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/gcc/except.c b/gcc/except.c index 3e2bbfb..66bf410 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -2421,30 +2421,33 @@ convert_to_eh_region_ranges (void) if (last_action != this_action || last_landing_pad != this_landing_pad) { + /* If there is a queued no-action region in the other section + with hot/cold partitioning, emit it now. */ + if (first_no_action_insn_before_switch) + { + gcc_assert (this_action != -1 + && last_action == (first_no_action_insn + ? -1 : -3)); + call_site = add_call_site (NULL_RTX, 0, 0); + note = emit_note_before (NOTE_INSN_EH_REGION_BEG, + first_no_action_insn_before_switch); + NOTE_EH_HANDLER (note) = call_site; + note = emit_note_after (NOTE_INSN_EH_REGION_END, + last_no_action_insn_before_switch); + NOTE_EH_HANDLER (note) = call_site; + gcc_assert (last_action != -3 + || (last_action_insn + == last_no_action_insn_before_switch)); + first_no_action_insn_before_switch = NULL_RTX; + last_no_action_insn_before_switch = NULL_RTX; + call_site_base++; + } /* If we'd not seen a previous action (-3) or the previous action was must-not-throw (-2), then we do not need an end note. */ if (last_action >= -1) { /* If we delayed the creation of the begin, do it now. */ - if (first_no_action_insn_before_switch) - { - call_site = add_call_site (NULL_RTX, 0, 0); - note - = emit_note_before (NOTE_INSN_EH_REGION_BEG, - first_no_action_insn_before_switch); - NOTE_EH_HANDLER (note) = call_site; - if (first_no_action_insn) - { - note - = emit_note_after (NOTE_INSN_EH_REGION_END, - last_no_action_insn_before_switch); - NOTE_EH_HANDLER (note) = call_site; - } - else - gcc_assert (last_action_insn - == last_no_action_insn_before_switch); - } if (first_no_action_insn) { call_site = add_call_site (NULL_RTX, 0, cur_sec); |