diff options
author | Richard Biener <rguenther@suse.de> | 2014-01-09 09:21:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-01-09 09:21:02 +0000 |
commit | 2aaed0f3046ddb9c1e09d52db174718528245fa4 (patch) | |
tree | 7ed1d0ab04a28dfb1e88329c38c7e188d79fdf82 /gcc | |
parent | b5ebc9914050506a8cc40fd63d8aacbeed65f600 (diff) | |
download | gcc-2aaed0f3046ddb9c1e09d52db174718528245fa4.zip gcc-2aaed0f3046ddb9c1e09d52db174718528245fa4.tar.gz gcc-2aaed0f3046ddb9c1e09d52db174718528245fa4.tar.bz2 |
re PR tree-optimization/59715 (wrong code at -Os and above on x86_64-linux-gnu)
2014-01-09 Richard Biener <rguenther@suse.de>
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.
From-SVN: r206460
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr59715.c | 21 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 3 | ||||
-rw-r--r-- | gcc/tree-cfg.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-sink.c | 2 |
6 files changed, 36 insertions, 3 deletions
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 <rguenther@suse.de> + + 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 <m.ostapenko@partner.samsung.com> * 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 <rguenther@suse.de> + + PR tree-optimization/59715 + * gcc.dg/torture/pr59715.c: New testcase. + 2014-01-09 Max Ostapenko <m.ostapenko@partner.samsung.com> * 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); |