re PR bootstrap/51648 (Profiledbootstrap failure on x86_64-linux)
authorJakub Jelinek <jakub@redhat.com>
Thu, 5 Jan 2012 09:32:52 +0000 (10:32 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 5 Jan 2012 09:32:52 +0000 (10:32 +0100)
PR bootstrap/51648
* tree-cfg.c (need_fake_edge_p): Return true also for noreturn
calls that have any non-fake successor edges.

From-SVN: r182902

gcc/ChangeLog
gcc/tree-cfg.c

index a30063a915aaa325280bd64507e65b7af4626be1..661179e8061b394611d28e860e24f1cc3a276917 100644 (file)
@@ -1,5 +1,9 @@
 2012-01-05  Jakub Jelinek  <jakub@redhat.com>
 
+       PR bootstrap/51648
+       * tree-cfg.c (need_fake_edge_p): Return true also for noreturn
+       calls that have any non-fake successor edges.
+
        PR debug/51746
        * var-tracking.c (add_stores): For COND_EXEC allow oval to be NULL.
 
index 6e1a60403ef9361dcc8e6c6f5791d9e59ee299d7..66ea9285e6d80299e5695891097f47aacff9ffa3 100644 (file)
@@ -1,6 +1,6 @@
 /* Control flow functions for trees.
    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-   2010, 2011  Free Software Foundation, Inc.
+   2010, 2011, 2012  Free Software Foundation, Inc.
    Contributed by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
@@ -6882,9 +6882,20 @@ need_fake_edge_p (gimple t)
           && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
     return false;
 
-  if (is_gimple_call (t)
-      && !(call_flags & ECF_NORETURN))
-    return true;
+  if (is_gimple_call (t))
+    {
+      edge_iterator ei;
+      edge e;
+      basic_block bb;
+
+      if (!(call_flags & ECF_NORETURN))
+       return true;
+
+      bb = gimple_bb (t);
+      FOR_EACH_EDGE (e, ei, bb->succs)
+       if ((e->flags & EDGE_FAKE) == 0)
+         return true;
+    }
 
   if (gimple_code (t) == GIMPLE_ASM
        && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
@@ -6895,9 +6906,10 @@ need_fake_edge_p (gimple t)
 
 
 /* Add fake edges to the function exit for any non constant and non
-   noreturn calls, volatile inline assembly in the bitmap of blocks
-   specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
-   the number of blocks that were split.
+   noreturn calls (or noreturn calls with EH/abnormal edges),
+   volatile inline assembly in the bitmap of blocks specified by BLOCKS
+   or to the whole CFG if BLOCKS is zero.  Return the number of blocks
+   that were split.
 
    The goal is to expose cases in which entering a basic block does
    not imply that all subsequent instructions must be executed.  */