aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-29 14:01:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-29 14:01:32 +0000
commit00738904f305a6237c2bae72b5fd7789995c4399 (patch)
tree4a70fa5489144678da3ddf6a6199b39ce9fec70a /gcc
parent248cce34f1003712c39639980d4cb549ef24834a (diff)
downloadgcc-00738904f305a6237c2bae72b5fd7789995c4399.zip
gcc-00738904f305a6237c2bae72b5fd7789995c4399.tar.gz
gcc-00738904f305a6237c2bae72b5fd7789995c4399.tar.bz2
tree-cfg.c (lower_phi_internal_fn): Do not look for further PHIs after a regular stmt.
2016-11-29 Richard Biener <rguenther@suse.de> * tree-cfg.c (lower_phi_internal_fn): Do not look for further PHIs after a regular stmt. (stmt_starts_bb_p): PHIs not preceeded by a PHI or a label start a new BB. From-SVN: r242959
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-cfg.c27
2 files changed, 24 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index feb30a8..2771bfd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-11-29 Richard Biener <rguenther@suse.de>
+
+ * tree-cfg.c (lower_phi_internal_fn): Do not look for further
+ PHIs after a regular stmt.
+ (stmt_starts_bb_p): PHIs not preceeded by a PHI or a label
+ start a new BB.
+
2016-11-29 Martin Liska <mliska@suse.cz>
PR gcov-profile/78582
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index e99e102..6cb5b6f 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -361,14 +361,11 @@ lower_phi_internal_fn ()
/* After edge creation, handle __PHI function from GIMPLE FE. */
FOR_EACH_BB_FN (bb, cfun)
{
- for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
+ for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
{
stmt = gsi_stmt (gsi);
if (! gimple_call_internal_p (stmt, IFN_PHI))
- {
- gsi_next (&gsi);
- continue;
- }
+ break;
lhs = gimple_call_lhs (stmt);
phi_node = create_phi_node (lhs, bb);
@@ -2604,11 +2601,21 @@ stmt_starts_bb_p (gimple *stmt, gimple *prev_stmt)
else
return true;
}
- else if (gimple_code (stmt) == GIMPLE_CALL
- && gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
- /* setjmp acts similar to a nonlocal GOTO target and thus should
- start a new block. */
- return true;
+ else if (gimple_code (stmt) == GIMPLE_CALL)
+ {
+ if (gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
+ /* setjmp acts similar to a nonlocal GOTO target and thus should
+ start a new block. */
+ return true;
+ if (gimple_call_internal_p (stmt, IFN_PHI)
+ && prev_stmt
+ && gimple_code (prev_stmt) != GIMPLE_LABEL
+ && (gimple_code (prev_stmt) != GIMPLE_CALL
+ || ! gimple_call_internal_p (prev_stmt, IFN_PHI)))
+ /* PHI nodes start a new block unless preceeded by a label
+ or another PHI. */
+ return true;
+ }
return false;
}