diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-01-05 09:32:52 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-01-05 09:32:52 +0000 |
commit | 44e41ce06fd1b834f81f2db5ad467a2a758432c7 (patch) | |
tree | c00ce0ab78fd6bd4312f7f6ba8b423d920ac5be6 /gcc | |
parent | 4f91566ff46f927ea9aa0d7b621bebbdb9d82a31 (diff) | |
download | gcc-44e41ce06fd1b834f81f2db5ad467a2a758432c7.tar.gz |
PR bootstrap/51648
* tree-cfg.c (need_fake_edge_p): Return true also for noreturn
calls that have any non-fake successor edges.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182902 138bc75d-0d04-0410-961f-82ee72b054a4
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 a30063a915a..661179e8061 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 6e1a60403ef..66ea9285e6d 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. */ |