OSDN Git Service

PR middle-end/45458
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Sep 2010 19:46:21 +0000 (19:46 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Sep 2010 19:46:21 +0000 (19:46 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163743 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/bb-reorder.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-prof/partition2.C [new file with mode: 0644]

index 10ea824..077c6fb 100644 (file)
@@ -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.
index 2bf0b85..e499614 100644 (file)
@@ -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))
        {
index 67f5a20..fbe877c 100644 (file)
@@ -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 (file)
index 0000000..ca5671f
--- /dev/null
@@ -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 (...)
+  {
+  }
+}