summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-05 09:32:52 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-05 09:32:52 +0000
commit44e41ce06fd1b834f81f2db5ad467a2a758432c7 (patch)
treec00ce0ab78fd6bd4312f7f6ba8b423d920ac5be6 /gcc
parent4f91566ff46f927ea9aa0d7b621bebbdb9d82a31 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/tree-cfg.c26
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. */