]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/59715 (wrong code at -Os and above on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Thu, 9 Jan 2014 09:21:02 +0000 (09:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 9 Jan 2014 09:21:02 +0000 (09:21 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr59715.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-cfg.h
gcc/tree-ssa-sink.c

index 3cdf385e3936b499e6918680b258882713cd5cd0..6f2f19d1a6fe1b8f5f40a352758b33e9316a7fed 100644 (file)
@@ -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 
index d4dc8cf65d5109183d5f3d22097b53c34b4bb2ca..de7990bdfb5e575a78731b6c2afc461dd96e00a5 100644 (file)
@@ -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 (file)
index 0000000..19c09de
--- /dev/null
@@ -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;
+}
index 7daf15b28ad6be536902df5617cad541ad6ffb5f..32110a7fafac268a5e69a015edb7c8785eadc601 100644 (file)
@@ -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;
index 8d045a4e2dcc379c41edbc643e1454962c6054b1..babbd2db2cabcef5e0ecf3b8455ad843c66c5335 100644 (file)
@@ -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  */
index d2de147799dcbd1e125c045eb6cad76bbfea3134..a72a9e8c8f3df92ea24e2ae59630fc76294f6dbe 100644 (file)
@@ -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);