diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-05 10:32:52 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-01-05 10:32:52 +0100 |
commit | bfeb0869d61725d9bdf577911742ff312e980ef2 (patch) | |
tree | c00ce0ab78fd6bd4312f7f6ba8b423d920ac5be6 /gcc | |
parent | 9696698a51c8c0eabf0552d12e56c9dedbdf329a (diff) | |
download | gcc-bfeb0869d61725d9bdf577911742ff312e980ef2.zip gcc-bfeb0869d61725d9bdf577911742ff312e980ef2.tar.gz gcc-bfeb0869d61725d9bdf577911742ff312e980ef2.tar.bz2 |
re PR bootstrap/51648 (Profiledbootstrap failure on x86_64-linux)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 26 |
2 files changed, 23 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a30063a..661179e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 6e1a604..66ea928 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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. */ |