re PR middle-end/45566 (ICE: in convert_to_eh_region_ranges, at except.c:2446 with...
authorJakub Jelinek <jakub@redhat.com>
Fri, 21 Jan 2011 19:35:42 +0000 (20:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 21 Jan 2011 19:35:42 +0000 (20:35 +0100)
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

gcc/ChangeLog
gcc/except.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-prof/partition3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tree-prof/tree-prof.exp

index ab3c70b57807bb4a398899de9eb5fe23b2e78aa3..db2be18d7a0c793ed741f946109bc1369f250dc7 100644 (file)
@@ -1,5 +1,10 @@
 2011-01-21  Jakub Jelinek  <jakub@redhat.com>
 
+       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.
+
        PR rtl-optimization/47366
        * fwprop.c (forward_propagate_into): Return bool.  If
        any changes are made, -fnon-call-exceptions is used and
index 3e2bbfb1f7505ec8f465ba692c1210307e05d255..66bf41005a6a143499099e582c0831dbdda7028f 100644 (file)
@@ -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);
index 2c1e8fb65cf8fc9ec99ac11cb419dc9a12a7ebb9..657a61d9c3248b1a615aae4bbb080c9edf05bc0a 100644 (file)
@@ -1,5 +1,10 @@
 2011-01-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/45566
+       * g++.dg/tree-prof/partition3.C: New test.
+
+       * g++.dg/tree-prof/tree-prof.exp: Fix a comment.
+
        PR rtl-optimization/47366
        * g++.dg/opt/pr47366.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/tree-prof/partition3.C b/gcc/testsuite/g++.dg/tree-prof/partition3.C
new file mode 100644 (file)
index 0000000..7846983
--- /dev/null
@@ -0,0 +1,18 @@
+// PR middle-end/45566
+// { dg-require-effective-target freorder }
+// { dg-options "-O -fnon-call-exceptions -freorder-blocks-and-partition" }
+
+int k;
+
+int
+main ()
+{
+  try
+  {
+    if (k)
+      throw 6;
+  }
+  catch (...)
+  {
+  }
+}
index b5a2f65b850de4cbe089e7d5037b9baf57718505..92de03210ffdf81195a9a990394cb7411b56001e 100644 (file)
@@ -16,7 +16,7 @@
 # <http://www.gnu.org/licenses/>.
 
 # Test the functionality of programs compiled with profile-directed block
-# ordering using -fprofile-generate followed by -fbranch-use.
+# ordering using -fprofile-generate followed by -fprofile-use.
 
 load_lib target-supports.exp