aboutsummaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-01-21 20:35:42 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-01-21 20:35:42 +0100
commitaaa52a96feb60e1575f284e2fe87a851ec312b61 (patch)
tree2f06c97b51a57f4c825b3b7477b29a1a12ddc91a /gcc/except.c
parent7360d2ac8dae5659de0adc18cd1d74b15a5971ed (diff)
downloadgcc-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.c39
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);