From 470c168f79fc03d295edb43e9bc8f2d568baf24d Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 9 Jan 2014 09:21:02 +0000 Subject: [PATCH] 2014-01-09 Richard Biener PR tree-optimization/59715 * tree-cfg.h (split_critical_edges): Declare. * tree-cfg.c (split_critical_edges): Export. * tree-ssa-sink.c (execute_sink_code): Split critical edges. * gcc.dg/torture/pr59715.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206460 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr59715.c | 21 +++++++++++++++++++++ gcc/tree-cfg.c | 3 +-- gcc/tree-cfg.h | 1 + gcc/tree-ssa-sink.c | 2 +- 6 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr59715.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3cdf385..6f2f19d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-01-09 Richard Biener + + PR tree-optimization/59715 + * tree-cfg.h (split_critical_edges): Declare. + * tree-cfg.c (split_critical_edges): Export. + * tree-ssa-sink.c (execute_sink_code): Split critical edges. + 2014-01-09 Max Ostapenko * cfgexpand.c (expand_stack_vars): Optionally disable diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d4dc8cf..de7990b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-09 Richard Biener + + PR tree-optimization/59715 + * gcc.dg/torture/pr59715.c: New testcase. + 2014-01-09 Max Ostapenko * c-c++-common/asan/no-asan-globals.c: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr59715.c b/gcc/testsuite/gcc.dg/torture/pr59715.c new file mode 100644 index 0000000..19c09de --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59715.c @@ -0,0 +1,21 @@ +/* { dg-do run } */ + +extern void abort (void); + +int a = 2, b; + +int +main () +{ + int c; + if (!b) + { + b = a; + c = a == 0 ? 1 : 1 % a; + if (c) + b = 0; + } + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 7daf15b..32110a7 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -159,7 +159,6 @@ static void make_goto_expr_edges (basic_block); static void make_gimple_asm_edges (basic_block); static edge gimple_redirect_edge_and_branch (edge, basic_block); static edge gimple_try_redirect_by_replacing_jump (edge, basic_block); -static unsigned int split_critical_edges (void); /* Various helpers. */ static inline bool stmt_starts_bb_p (gimple, gimple); @@ -7929,7 +7928,7 @@ struct cfg_hooks gimple_cfg_hooks = { /* Split all critical edges. */ -static unsigned int +unsigned int split_critical_edges (void) { basic_block bb; diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h index 8d045a4..babbd2d 100644 --- a/gcc/tree-cfg.h +++ b/gcc/tree-cfg.h @@ -93,5 +93,6 @@ extern tree gimplify_build1 (gimple_stmt_iterator *, enum tree_code, tree, tree); extern void extract_true_false_edges_from_block (basic_block, edge *, edge *); extern unsigned int execute_fixup_cfg (void); +extern unsigned int split_critical_edges (void); #endif /* _TREE_CFG_H */ diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index d2de147..a72a9e8 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -567,7 +567,7 @@ static void execute_sink_code (void) { loop_optimizer_init (LOOPS_NORMAL); - + split_critical_edges (); connect_infinite_loops_to_exit (); memset (&sink_stats, 0, sizeof (sink_stats)); calculate_dominance_info (CDI_DOMINATORS); -- 2.7.4