OSDN Git Service

Merge from gomp-branch.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-copy.c
index 47ac55f..84f3cd1 100644 (file)
@@ -838,17 +838,19 @@ copy_prop_visit_phi_node (tree phi)
 }
 
 
-/* Initialize structures used for copy propagation.  */
+/* Initialize structures used for copy propagation.   PHIS_ONLY is true
+   if we should only consider PHI nodes as generating copy propagation
+   opportunities.  */
 
 static void
-init_copy_prop (void)
+init_copy_prop (bool phis_only)
 {
   basic_block bb;
 
-  copy_of = xmalloc (num_ssa_names * sizeof (*copy_of));
+  copy_of = XNEWVEC (prop_value_t, num_ssa_names);
   memset (copy_of, 0, num_ssa_names * sizeof (*copy_of));
 
-  cached_last_copy_of = xmalloc (num_ssa_names * sizeof (*cached_last_copy_of));
+  cached_last_copy_of = XNEWVEC (tree, num_ssa_names);
   memset (cached_last_copy_of, 0, num_ssa_names * sizeof (*cached_last_copy_of));
 
   FOR_EACH_BB (bb)
@@ -866,7 +868,7 @@ init_copy_prop (void)
             lists of the propagator.  */
          if (stmt_ends_bb_p (stmt))
            DONT_SIMULATE_AGAIN (stmt) = false;
-         else if (stmt_may_generate_copy (stmt))
+         else if (!phis_only && stmt_may_generate_copy (stmt))
            DONT_SIMULATE_AGAIN (stmt) = false;
          else
            {
@@ -900,7 +902,7 @@ fini_copy_prop (void)
   
   /* Set the final copy-of value for each variable by traversing the
      copy-of chains.  */
-  tmp = xmalloc (num_ssa_names * sizeof (*tmp));
+  tmp = XNEWVEC (prop_value_t, num_ssa_names);
   memset (tmp, 0, num_ssa_names * sizeof (*tmp));
   for (i = 1; i < num_ssa_names; i++)
     {
@@ -917,10 +919,15 @@ fini_copy_prop (void)
 }
 
 
-/* Main entry point to the copy propagator.  The algorithm propagates
-   the value COPY-OF using ssa_propagate.  For every variable X_i,
-   COPY-OF(X_i) indicates which variable is X_i created from.  The
-   following example shows how the algorithm proceeds at a high level:
+/* Main entry point to the copy propagator.
+
+   PHIS_ONLY is true if we should only consider PHI nodes as generating
+   copy propagation opportunities. 
+
+   The algorithm propagates the value COPY-OF using ssa_propagate.  For
+   every variable X_i, COPY-OF(X_i) indicates which variable is X_i created
+   from.  The following example shows how the algorithm proceeds at a
+   high level:
 
            1   a_24 = x_1
            2   a_2 = PHI <a_24, x_1>
@@ -1020,10 +1027,10 @@ fini_copy_prop (void)
    x_53 and x_54 are both copies of x_898.  */
 
 static void
-execute_copy_prop (bool store_copy_prop)
+execute_copy_prop (bool store_copy_prop, bool phis_only)
 {
   do_store_copy_prop = store_copy_prop;
-  init_copy_prop ();
+  init_copy_prop (phis_only);
   ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
   fini_copy_prop ();
 }
@@ -1038,7 +1045,7 @@ gate_copy_prop (void)
 static void
 do_copy_prop (void)
 {
-  execute_copy_prop (false);
+  execute_copy_prop (false, false);
 }
 
 struct tree_opt_pass pass_copy_prop =
@@ -1063,6 +1070,34 @@ struct tree_opt_pass pass_copy_prop =
 };
 
 
+static void
+do_phi_only_copy_prop (void)
+{
+  execute_copy_prop (false, true);
+}
+
+struct tree_opt_pass pass_phi_only_copy_prop =
+{
+  "phionlycopyprop",                   /* name */
+  gate_copy_prop,                      /* gate */
+  do_phi_only_copy_prop,               /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  TV_TREE_COPY_PROP,                   /* tv_id */
+  PROP_ssa | PROP_alias | PROP_cfg,    /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  TODO_cleanup_cfg
+    | TODO_dump_func
+    | TODO_ggc_collect
+    | TODO_verify_ssa
+    | TODO_update_ssa,                 /* todo_flags_finish */
+  0                                    /* letter */
+};
+
+
 static bool
 gate_store_copy_prop (void)
 {
@@ -1077,7 +1112,7 @@ static void
 store_copy_prop (void)
 {
   /* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP.  */
-  execute_copy_prop (flag_tree_store_copy_prop != 0);
+  execute_copy_prop (flag_tree_store_copy_prop != 0, false);
 }
 
 struct tree_opt_pass pass_store_copy_prop =