OSDN Git Service

2011-11-10 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Nov 2011 13:46:27 +0000 (13:46 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Nov 2011 13:46:27 +0000 (13:46 +0000)
PR tree-optimization/51070
* tree-loop-distribution.c (generate_builtin): Do not replace
the loop with a builtin if the partition contains statements which
results are used outside of the loop.
(pass_loop_distribution): Verify and collect.

* gcc.dg/torture/pr51070.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181255 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr51070.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

index 52fc3f4..ee388f6 100644 (file)
@@ -1,5 +1,13 @@
 2011-11-10  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/51070
+       * tree-loop-distribution.c (generate_builtin): Do not replace
+       the loop with a builtin if the partition contains statements which
+       results are used outside of the loop.
+       (pass_loop_distribution): Verify and collect.
+
+2011-11-10  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/51030
        * tree-ssa-phiopt.c (jump_function_from_stmt): New function.
        (value_replacement): Use it to handle trivial non-empty
index 68a3415..c04d8dc 100644 (file)
@@ -1,5 +1,10 @@
 2011-11-10  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/51070
+       * gcc.dg/torture/pr51070.c: New testcase.
+
+2011-11-10  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/51030
        * gcc.dg/tree-ssa/phi-opt-6.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr51070.c b/gcc/testsuite/gcc.dg/torture/pr51070.c
new file mode 100644 (file)
index 0000000..cc06a90
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+
+int
+func_4 (int si1, int si2)
+{
+  return si1;
+}
+
+int
+func_14 (int left, int right)
+{
+  return 1;
+}
+
+int
+func_37 (int left, int right)
+{
+  return left;
+}
+
+int g_92[1024];
+int g_95[1024];
+int g_224;
+int g_352[1024];
+int
+func_9 ()
+{
+  for (; g_224; g_224 += 1)
+    {
+      g_95[0] = func_4 (func_37 (g_92[g_224], 0), 0);
+      g_92[g_224] = 0, g_352[g_224] = func_14 (0, 0);
+    }
+  return 0;
+}
index 810b974..0daef06 100644 (file)
@@ -63,6 +63,48 @@ static bitmap remaining_stmts;
    predecessor a node that writes to memory.  */
 static bitmap upstream_mem_writes;
 
+/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
+   the LOOP.  */
+
+static bool
+ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
+{
+  imm_use_iterator imm_iter;
+  use_operand_p use_p;
+
+  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
+    if (loop != loop_containing_stmt (USE_STMT (use_p)))
+      return true;
+
+  return false;
+}
+
+/* Returns true when STMT defines a scalar variable used after the
+   loop.  */
+
+static bool
+stmt_has_scalar_dependences_outside_loop (gimple stmt)
+{
+  tree name;
+
+  switch (gimple_code (stmt))
+    {
+    case GIMPLE_ASSIGN:
+      name = gimple_assign_lhs (stmt);
+      break;
+
+    case GIMPLE_PHI:
+      name = gimple_phi_result (stmt);
+      break;
+
+    default:
+      return false;
+    }
+
+  return TREE_CODE (name) == SSA_NAME
+    && ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
+}
+
 /* Update the PHI nodes of NEW_LOOP.  NEW_LOOP is a duplicate of
    ORIG_LOOP.  */
 
@@ -330,10 +372,18 @@ generate_builtin (struct loop *loop, bitmap partition, bool copy_p)
        {
          gimple stmt = gsi_stmt (bsi);
 
-         if (gimple_code (stmt) != GIMPLE_LABEL
-             && !is_gimple_debug (stmt)
-             && bitmap_bit_p (partition, x++)
-             && is_gimple_assign (stmt)
+         if (gimple_code (stmt) == GIMPLE_LABEL
+             || is_gimple_debug (stmt))
+           continue;
+
+         if (!bitmap_bit_p (partition, x++))
+           continue;
+
+         /* If the stmt has uses outside of the loop fail.  */
+         if (stmt_has_scalar_dependences_outside_loop (stmt))
+           goto end;
+
+         if (is_gimple_assign (stmt)
              && !is_gimple_reg (gimple_assign_lhs (stmt)))
            {
              /* Don't generate the builtins when there are more than
@@ -824,48 +874,6 @@ fuse_partitions_with_similar_memory_accesses (struct graph *rdg,
          }
 }
 
-/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
-   the LOOP.  */
-
-static bool
-ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
-{
-  imm_use_iterator imm_iter;
-  use_operand_p use_p;
-
-  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
-    if (loop != loop_containing_stmt (USE_STMT (use_p)))
-      return true;
-
-  return false;
-}
-
-/* Returns true when STMT defines a scalar variable used after the
-   loop.  */
-
-static bool
-stmt_has_scalar_dependences_outside_loop (gimple stmt)
-{
-  tree name;
-
-  switch (gimple_code (stmt))
-    {
-    case GIMPLE_ASSIGN:
-      name = gimple_assign_lhs (stmt);
-      break;
-
-    case GIMPLE_PHI:
-      name = gimple_phi_result (stmt);
-      break;
-
-    default:
-      return false;
-    }
-
-  return TREE_CODE (name) == SSA_NAME
-    && ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
-}
-
 /* Returns true when STMT will be code generated in a partition of RDG
    different than PART and that will not be code generated as a
    builtin.  */
@@ -1311,6 +1319,7 @@ struct gimple_opt_pass pass_loop_distribution =
   0,                           /* properties_provided */
   0,                           /* properties_destroyed */
   0,                           /* todo_flags_start */
-  0                             /* todo_flags_finish */
+  TODO_ggc_collect
+  | TODO_verify_ssa             /* todo_flags_finish */
  }
 };