aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-01-09 09:21:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-01-09 09:21:02 +0000
commit2aaed0f3046ddb9c1e09d52db174718528245fa4 (patch)
tree7ed1d0ab04a28dfb1e88329c38c7e188d79fdf82 /gcc
parentb5ebc9914050506a8cc40fd63d8aacbeed65f600 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59715.c21
-rw-r--r--gcc/tree-cfg.c3
-rw-r--r--gcc/tree-cfg.h1
-rw-r--r--gcc/tree-ssa-sink.c2
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);