2014-01-09 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Jan 2014 09:21:02 +0000 (09:21 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Jan 2014 09:21:02 +0000 (09:21 +0000)
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
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 3cdf385..6f2f19d 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 d4dc8cf..de7990b 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 7daf15b..32110a7 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 8d045a4..babbd2d 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 d2de147..a72a9e8 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);