passes.c (init_optimization_passes): Exchange store_copy_prop with copy_prop.
authorRichard Guenther <rguenther@suse.de>
Mon, 29 Oct 2007 21:16:45 +0000 (21:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 29 Oct 2007 21:16:45 +0000 (21:16 +0000)
2007-10-29  Richard Guenther  <rguenther@suse.de>

* passes.c (init_optimization_passes): Exchange store_copy_prop
with copy_prop.
* tree-pass.h (pass_store_copy_prop): Remove.
* tree-ssa-copy.c (do_store_copy_prop): Remove.
(stmt_may_generate-copy): Do not handle store_copy_prop.
(get_copy_of_val): Likewise.
(set_copy_of_val): Likewise.
(copy_prop_visit_assignment): Likewise.
(copy_prop_visit_stmt): Likewise.
(copy_prop_visit_phi_node): Likewise.
(init_copy_prop): Likewise.
(execute_copy_prop): Likewise.
(do_copy_prop): Remove.
(gate_store_copy_prop): Likewise.
(store_copy_prop): Likewise.
(pass_store_copy_prop): Likewise.
(pass_copy_prop): Call execute_copy_prop.
* opts.c (decode_options): Do not set flag_tree_store_copy_prop.
* common.opt (ftree-store-copy-prop): Mark obsolete.
* doc/invoke.texi (ftree-store-copy-prop): Remove documentation.

* gcc.dg/tree-ssa/ssa-copyprop-1.c: Scan optimized dump.

From-SVN: r129734

gcc/ChangeLog
gcc/common.opt
gcc/doc/invoke.texi
gcc/opts.c
gcc/passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-1.c
gcc/tree-pass.h
gcc/tree-ssa-copy.c

index b5875054707c88f4965d80b90d0afe2e57458a96..f8dd7fcb22fe990ccda4acd3ea58a0c8910e1e0d 100644 (file)
@@ -1,3 +1,26 @@
+2007-10-29  Richard Guenther  <rguenther@suse.de>
+
+       * passes.c (init_optimization_passes): Exchange store_copy_prop
+       with copy_prop.
+       * tree-pass.h (pass_store_copy_prop): Remove.
+       * tree-ssa-copy.c (do_store_copy_prop): Remove.
+       (stmt_may_generate-copy): Do not handle store_copy_prop.
+       (get_copy_of_val): Likewise.
+       (set_copy_of_val): Likewise.
+       (copy_prop_visit_assignment): Likewise.
+       (copy_prop_visit_stmt): Likewise.
+       (copy_prop_visit_phi_node): Likewise.
+       (init_copy_prop): Likewise.
+       (execute_copy_prop): Likewise.
+       (do_copy_prop): Remove.
+       (gate_store_copy_prop): Likewise.
+       (store_copy_prop): Likewise.
+       (pass_store_copy_prop): Likewise.
+       (pass_copy_prop): Call execute_copy_prop.
+       * opts.c (decode_options): Do not set flag_tree_store_copy_prop.
+       * common.opt (ftree-store-copy-prop): Mark obsolete.
+       * doc/invoke.texi (ftree-store-copy-prop): Remove documentation.
+
 2007-10-29  Ian Lance Taylor  <iant@google.com>
 
        * ifcvt.c (noce_can_store_speculate_p): New static function.
index c468b3b198f37f797fb8bcebfab4215952f432b9..aba400b28c48bc9ead8a868c2136f077fd128553 100644 (file)
@@ -1054,8 +1054,8 @@ Common Report Var(flag_tree_copy_prop) Optimization
 Enable copy propagation on trees
 
 ftree-store-copy-prop
-Common Report Var(flag_tree_store_copy_prop) Optimization
-Enable copy propagation for stores and loads
+Common
+This switch is obsolete
 
 ftree-cselim
 Common Report Var(flag_tree_cselim) Init(2) Optimization
index 55cd96ea5254d3c036d71bbf36b8d7ccd48655fd..ce1693ac1b05dc3759f9604435db4da72b0f0591 100644 (file)
@@ -364,7 +364,7 @@ Objective-C and Objective-C++ Dialects}.
 -ftree-dominator-opts -ftree-dse -ftree-copyrename -ftree-sink @gol
 -ftree-ch -ftree-sra -ftree-ter -ftree-fre -ftree-vectorize @gol
 -ftree-vect-loop-version -fvect-cost-model -ftree-salias -fipa-pta -fweb @gol
--ftree-copy-prop -ftree-store-ccp -ftree-store-copy-prop -ftree-vrp @gol
+-ftree-copy-prop -ftree-store-ccp -ftree-vrp @gol
 -funit-at-a-time -fwhole-program @gol
 --param @var{name}=@var{value}
 -O  -O0  -O1  -O2  -O3  -Os}
@@ -5677,13 +5677,6 @@ Perform copy propagation on trees.  This pass eliminates unnecessary
 copy operations.  This flag is enabled by default at @option{-O} and
 higher.
 
-@item -ftree-store-copy-prop
-@opindex ftree-store-copy-prop
-Perform copy propagation of memory loads and stores.  This pass
-eliminates unnecessary copy operations in memory references
-(structures, global variables, arrays, etc).  This flag is enabled by
-default at @option{-O2} and higher.
-
 @item -ftree-salias
 @opindex ftree-salias
 Perform structural alias analysis on trees.  This flag
index f93c746bd97818c10dc3cec258038e39576bb125..90c9139abe080701206a681ec1769d6053387db3 100644 (file)
@@ -844,7 +844,6 @@ decode_options (unsigned int argc, const char **argv)
       flag_reorder_blocks = 1;
       flag_reorder_functions = 1;
       flag_tree_store_ccp = 1;
-      flag_tree_store_copy_prop = 1;
       flag_tree_vrp = 1;
 
       if (!optimize_size)
index c0f11edf212a886d2ff1714a42b2d5a577231d52..48f78b42be8d2b8748d8f1750eb5fb661e60c186 100644 (file)
@@ -602,7 +602,7 @@ init_optimization_passes (void)
       NEXT_PASS (pass_phiopt);
       NEXT_PASS (pass_object_sizes);
       NEXT_PASS (pass_store_ccp);
-      NEXT_PASS (pass_store_copy_prop);
+      NEXT_PASS (pass_copy_prop);
       NEXT_PASS (pass_fold_builtins);
       NEXT_PASS (pass_cse_sincos);
       NEXT_PASS (pass_split_crit_edges);
index 69a05fb6043fb97fc9aca2b4a1c7e4e843e16878..3b2704314529b68ac87c909a03c957bd905404b2 100644 (file)
@@ -1,3 +1,7 @@
+2007-10-29  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/ssa-copyprop-1.c: Scan optimized dump.
+
 2007-10-29  Razya Ladelsky  <razya@il.ibm.com>
 
        Automatic parallelization reduction tests.
index 4308cea78665fcff35445dfc3ec009472a2b3156..41ad6ce6e349c3e2dfde49d41a1cdb01dd1e0e3c 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-store_copyprop-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-optimized" } */
 
 typedef struct { int i; int j; } A;
 int foo(A *a, int i)
@@ -8,5 +8,5 @@ int foo(A *a, int i)
   return a->i;
 }
 
-/* { dg-final { scan-tree-dump "return i" "store_copyprop" } } */
-/* { dg-final { cleanup-tree-dump "store_copyprop" } } */
+/* { dg-final { scan-tree-dump "return i" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index e22827d3dfba760b6ec4c411c86e79e8009671a9..3eda29ec44d1741101fc3acc59e2806b8282bf9f 100644 (file)
@@ -321,7 +321,6 @@ extern struct tree_opt_pass pass_linear_transform;
 extern struct tree_opt_pass pass_check_data_deps;
 extern struct tree_opt_pass pass_copy_prop;
 extern struct tree_opt_pass pass_store_ccp;
-extern struct tree_opt_pass pass_store_copy_prop;
 extern struct tree_opt_pass pass_vrp;
 extern struct tree_opt_pass pass_create_structure_vars;
 extern struct tree_opt_pass pass_uncprop;
index 4c3c9d5d6105ae3e133b3f4cbae327014e9795aa..9f58087cfacba37da819cc5edb96c3fd6823474b 100644 (file)
@@ -384,9 +384,6 @@ static prop_value_t *copy_of;
    chain has changed.  */
 static tree *cached_last_copy_of;
 
-/* True if we are doing copy propagation on loads and stores.  */
-static bool do_store_copy_prop;
-
 
 /* Return true if this statement may generate a useful copy.  */
 
@@ -411,19 +408,15 @@ stmt_may_generate_copy (tree stmt)
   if (ann->has_volatile_ops)
     return false;
 
-  /* If we are not doing store copy-prop, statements with loads and/or
-     stores will never generate a useful copy.  */
-  if (!do_store_copy_prop
-      && !ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
+  /* Statements with loads and/or stores will never generate a useful copy.  */
+  if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
     return false;
 
   /* Otherwise, the only statements that generate useful copies are
      assignments whose RHS is just an SSA name that doesn't flow
      through abnormal edges.  */
-  return (do_store_copy_prop
-         && TREE_CODE (lhs) == SSA_NAME)
-        || (TREE_CODE (rhs) == SSA_NAME
-            && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs));
+  return (TREE_CODE (rhs) == SSA_NAME
+         && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs));
 }
 
 
@@ -440,7 +433,6 @@ get_copy_of_val (tree var)
       /* If the variable will never generate a useful copy relation,
         make it its own copy.  */
       val->value = var;
-      val->mem_ref = NULL_TREE;
     }
 
   return val;
@@ -493,7 +485,7 @@ get_last_copy_of (tree var)
    and stores.  */
 
 static inline bool
-set_copy_of_val (tree dest, tree first, tree mem_ref)
+set_copy_of_val (tree dest, tree first)
 {
   unsigned int dest_ver = SSA_NAME_VERSION (dest);
   tree old_first, old_last, new_last;
@@ -502,7 +494,6 @@ set_copy_of_val (tree dest, tree first, tree mem_ref)
      changed, return true.  */
   old_first = copy_of[dest_ver].value;
   copy_of[dest_ver].value = first;
-  copy_of[dest_ver].mem_ref = mem_ref;
 
   if (old_first != first)
     return true;
@@ -604,41 +595,12 @@ copy_prop_visit_assignment (tree stmt, tree *result_p)
         This is different from what we do in copy_prop_visit_phi_node. 
         In those cases, we are interested in the copy-of chains.  */
       *result_p = lhs;
-      if (set_copy_of_val (*result_p, rhs_val->value, rhs_val->mem_ref))
-       return SSA_PROP_INTERESTING;
-      else
-       return SSA_PROP_NOT_INTERESTING;
-    }
-  else if (stmt_makes_single_store (stmt))
-    {
-      /* Otherwise, set the names in VDEF operands to be a copy
-        of RHS.  */
-      ssa_op_iter i;
-      tree vdef;
-      bool changed;
-
-      /* This should only be executed when doing store copy-prop.  */
-      gcc_assert (do_store_copy_prop);
-
-      /* Set the value of every VDEF to RHS_VAL.  */
-      changed = false;
-      FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS)
-       changed |= set_copy_of_val (vdef, rhs_val->value, lhs);
-      
-      /* Note that for propagation purposes, we are only interested in
-        visiting statements that load the exact same memory reference
-        stored here.  Those statements will have the exact same list
-        of virtual uses, so it is enough to set the output of this
-        statement to be its first virtual definition.  */
-      *result_p = first_vdef (stmt);
-
-      if (changed)
+      if (set_copy_of_val (*result_p, rhs_val->value))
        return SSA_PROP_INTERESTING;
       else
        return SSA_PROP_NOT_INTERESTING;
     }
 
-
   return SSA_PROP_VARYING;
 }
 
@@ -721,41 +683,12 @@ copy_prop_visit_stmt (tree stmt, edge *taken_edge_p, tree *result_p)
 
   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
       && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == SSA_NAME
-      && (do_store_copy_prop
-         || TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME))
+      && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME)
     {
       /* If the statement is a copy assignment, evaluate its RHS to
         see if the lattice value of its output has changed.  */
       retval = copy_prop_visit_assignment (stmt, result_p);
     }
-  else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
-          && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME
-          && do_store_copy_prop
-          && stmt_makes_single_load (stmt))
-    {
-      /* If the statement is a copy assignment with a memory load
-        on the RHS, see if we know the value of this load and
-        update the lattice accordingly.  */
-      prop_value_t *val = get_value_loaded_by (stmt, copy_of);
-      if (val
-         && val->mem_ref
-         && is_gimple_reg (val->value)
-         && operand_equal_p (val->mem_ref, GIMPLE_STMT_OPERAND (stmt, 1), 0))
-        {
-         bool changed;
-         changed = set_copy_of_val (GIMPLE_STMT_OPERAND (stmt, 0),
-                                    val->value, val->mem_ref);
-         if (changed)
-           {
-             *result_p = GIMPLE_STMT_OPERAND (stmt, 0);
-             retval = SSA_PROP_INTERESTING;
-           }
-         else
-           retval = SSA_PROP_NOT_INTERESTING;
-       }
-      else
-        retval = SSA_PROP_VARYING;
-    }
   else if (TREE_CODE (stmt) == COND_EXPR)
     {
       /* See if we can determine which edge goes out of a conditional
@@ -779,7 +712,7 @@ copy_prop_visit_stmt (tree stmt, edge *taken_edge_p, tree *result_p)
         statement again and mark all the definitions in the statement
         to be copies of nothing.  */
       FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_ALL_DEFS)
-       set_copy_of_val (def, def, NULL_TREE);
+       set_copy_of_val (def, def);
     }
 
   return retval;
@@ -859,7 +792,6 @@ copy_prop_visit_phi_node (tree phi)
       if (phi_val.value == NULL_TREE)
        {
          phi_val.value = arg;
-         phi_val.mem_ref = arg_val->mem_ref;
          continue;
        }
 
@@ -868,18 +800,14 @@ copy_prop_visit_phi_node (tree phi)
         copy propagating stores and these two arguments came from
         different memory references, they cannot be considered
         copies.  */
-      if (get_last_copy_of (phi_val.value) != get_last_copy_of (arg)
-         || (do_store_copy_prop
-             && phi_val.mem_ref
-             && arg_val->mem_ref
-             && simple_cst_equal (phi_val.mem_ref, arg_val->mem_ref) != 1))
+      if (get_last_copy_of (phi_val.value) != get_last_copy_of (arg))
        {
          phi_val.value = lhs;
          break;
        }
     }
 
-  if (phi_val.value && set_copy_of_val (lhs, phi_val.value, phi_val.mem_ref))
+  if (phi_val.value && set_copy_of_val (lhs, phi_val.value))
     retval = (phi_val.value != lhs) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
   else
     retval = SSA_PROP_NOT_INTERESTING;
@@ -948,7 +876,7 @@ init_copy_prop (void)
             the copy of anything.  */
          FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
            if (DONT_SIMULATE_AGAIN (stmt))
-             set_copy_of_val (def, def, NULL_TREE);
+             set_copy_of_val (def, def);
            else
              cached_last_copy_of[SSA_NAME_VERSION (def)] = def;
        }
@@ -956,13 +884,13 @@ init_copy_prop (void)
       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
        {
          def = PHI_RESULT (phi);
-         if (!do_store_copy_prop && !is_gimple_reg (def))
+         if (!is_gimple_reg (def))
            DONT_SIMULATE_AGAIN (phi) = true;
          else
            DONT_SIMULATE_AGAIN (phi) = false;
 
          if (DONT_SIMULATE_AGAIN (phi))
-           set_copy_of_val (def, def, NULL_TREE);
+           set_copy_of_val (def, def);
          else
            cached_last_copy_of[SSA_NAME_VERSION (def)] = def;
        }
@@ -1104,34 +1032,26 @@ fini_copy_prop (void)
    Once the propagator stabilizes, we end up with the desired result
    x_53 and x_54 are both copies of x_898.  */
 
-static void
-execute_copy_prop (bool store_copy_prop)
+static unsigned int
+execute_copy_prop (void)
 {
-  do_store_copy_prop = store_copy_prop;
   init_copy_prop ();
   ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
   fini_copy_prop ();
+  return 0;
 }
 
-
 static bool
 gate_copy_prop (void)
 {
   return flag_tree_copy_prop != 0;
 }
 
-static unsigned int
-do_copy_prop (void)
-{
-  execute_copy_prop (false);
-  return 0;
-}
-
 struct tree_opt_pass pass_copy_prop =
 {
   "copyprop",                          /* name */
   gate_copy_prop,                      /* gate */
-  do_copy_prop,                                /* execute */
+  execute_copy_prop,                   /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */
   0,                                   /* static_pass_number */
@@ -1148,41 +1068,3 @@ struct tree_opt_pass pass_copy_prop =
   0                                    /* letter */
 };
 
-static bool
-gate_store_copy_prop (void)
-{
-  /* STORE-COPY-PROP is enabled only with -ftree-store-copy-prop, but
-     when -fno-tree-store-copy-prop is specified, we should run
-     regular COPY-PROP. That's why the pass is enabled with either
-     flag.  */
-  return flag_tree_store_copy_prop != 0 || flag_tree_copy_prop != 0;
-}
-
-static unsigned int
-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);
-  return 0;
-}
-
-struct tree_opt_pass pass_store_copy_prop =
-{
-  "store_copyprop",                    /* name */
-  gate_store_copy_prop,                        /* gate */
-  store_copy_prop,                     /* execute */
-  NULL,                                        /* sub */
-  NULL,                                        /* next */
-  0,                                   /* static_pass_number */
-  TV_TREE_STORE_COPY_PROP,             /* tv_id */
-  PROP_ssa | PROP_alias | PROP_cfg,    /* properties_required */
-  0,                                   /* properties_provided */
-  0,                                   /* properties_destroyed */
-  0,                                   /* todo_flags_start */
-  TODO_dump_func
-    | TODO_cleanup_cfg
-    | TODO_ggc_collect
-    | TODO_verify_ssa
-    | TODO_update_ssa,                 /* todo_flags_finish */
-  0                                    /* letter */
-};