OSDN Git Service

2006-03-03 Daniel Berlin <dberlin@dberlin.org>
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 4 Mar 2006 00:04:11 +0000 (00:04 +0000)
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 4 Mar 2006 00:04:11 +0000 (00:04 +0000)
* tree-sra.c (tree_sra): Return todoflags;
(generate_one_element): Set TODO_update_smt_usage if needed.
(pass_sra): Remove TODO_update_smt_usage.
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Add some
parameter.
(tree_ssa_forward_propagate_single_use_vars): Return
TODO_update_smt_usage if we need to update SMT usage.
(pass_forwprop): Remove TODO_update_smt_usage.

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

gcc/ChangeLog
gcc/tree-sra.c
gcc/tree-ssa-forwprop.c

index aa9bfbf..07edcc3 100644 (file)
@@ -1,3 +1,14 @@
+2006-03-03  Daniel Berlin  <dberlin@dberlin.org>
+
+       * tree-sra.c (tree_sra): Return todoflags;
+       (generate_one_element): Set TODO_update_smt_usage if needed.
+       (pass_sra): Remove TODO_update_smt_usage.
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr): Add some
+       parameter.
+       (tree_ssa_forward_propagate_single_use_vars): Return
+       TODO_update_smt_usage if we need to update SMT usage.
+       (pass_forwprop): Remove TODO_update_smt_usage.
+       
 2006-03-03  Diego Novillo  <dnovillo@redhat.com>
 
        * tree-ssa-operands.c: Tidy whitespace.  Fix spelling.
index 0b594b9..1faff83 100644 (file)
@@ -75,6 +75,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 */
 
 
+/* The set of todo flags to return from tree_sra.  */
+static unsigned int todoflags;
+
 /* The set of aggregate variables that are candidates for scalarization.  */
 static bitmap sra_candidates;
 
@@ -1432,6 +1435,9 @@ decide_instantiations (void)
       bitmap_and_compl_into (needs_copy_in, &done_head);
     }
   bitmap_clear (&done_head);
+  
+  if (!bitmap_empty_p (sra_candidates))
+    todoflags |= TODO_update_smt_usage;
 
   mark_set_for_renaming (sra_candidates);
 
@@ -1515,6 +1521,7 @@ generate_one_element_ref (struct sra_elt *elt, tree base)
       }
 
     case ARRAY_TYPE:
+      todoflags |= TODO_update_smt_usage;
       return build4 (ARRAY_REF, elt->type, base, elt->element, NULL, NULL);
 
     case COMPLEX_TYPE:
@@ -2182,6 +2189,7 @@ static unsigned int
 tree_sra (void)
 {
   /* Initialize local variables.  */
+  todoflags = 0;
   gcc_obstack_init (&sra_obstack);
   sra_candidates = BITMAP_ALLOC (NULL);
   needs_copy_in = BITMAP_ALLOC (NULL);
@@ -2204,7 +2212,7 @@ tree_sra (void)
   BITMAP_FREE (sra_type_decomp_cache);
   BITMAP_FREE (sra_type_inst_cache);
   obstack_free (&sra_obstack, NULL);
-  return 0;
+  return todoflags;
 }
 
 static bool
@@ -2226,7 +2234,7 @@ struct tree_opt_pass pass_sra =
   0,                                   /* properties_provided */
   PROP_smt_usage,                      /* properties_destroyed */
   0,                                   /* todo_flags_start */
-  TODO_update_smt_usage | TODO_dump_func /* todo_flags_finish */
+  TODO_dump_func /* todo_flags_finish */
   | TODO_update_ssa
   | TODO_ggc_collect | TODO_verify_ssa,
   0                                    /* letter */
index d91ab45..c95d098 100644 (file)
@@ -792,6 +792,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
 }
 
 /* STMT is a statement of the form SSA_NAME = ADDR_EXPR <whatever>.
+   SOME is a pointer to a boolean value indicating whether we
+   propagated the address expression anywhere.
 
    Try to forward propagate the ADDR_EXPR into all uses of the SSA_NAME.
    Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
@@ -799,7 +801,7 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
    Returns true, if all uses have been propagated into.  */
 
 static bool
-forward_propagate_addr_expr (tree stmt)
+forward_propagate_addr_expr (tree stmt, bool *some)
 {
   int stmt_loop_depth = bb_for_stmt (stmt)->loop_depth;
   tree name = TREE_OPERAND (stmt, 0);
@@ -809,6 +811,7 @@ forward_propagate_addr_expr (tree stmt)
 
   FOR_EACH_IMM_USE_SAFE (imm_use, iter, name)
     {
+      bool result;
       tree use_stmt = USE_STMT (imm_use);
 
       /* If the use is not in a simple assignment statement, then
@@ -827,8 +830,11 @@ forward_propagate_addr_expr (tree stmt)
          all = false;
          continue;
        }
-
-      all = forward_propagate_addr_expr_1 (stmt, use_stmt) && all;
+      
+      result = forward_propagate_addr_expr_1 (stmt, use_stmt);
+      if (some)
+       *some |= result;
+      all &= result;
     }
 
   return all;
@@ -931,6 +937,7 @@ static unsigned int
 tree_ssa_forward_propagate_single_use_vars (void)
 {
   basic_block bb;
+  unsigned int todoflags = 0;
 
   cfg_changed = false;
 
@@ -959,10 +966,13 @@ tree_ssa_forward_propagate_single_use_vars (void)
 
              if (TREE_CODE (rhs) == ADDR_EXPR)
                {
-                 if (forward_propagate_addr_expr (stmt))
+                 bool some = false;
+                 if (forward_propagate_addr_expr (stmt, &some))
                    bsi_remove (&bsi, true);
                  else
                    bsi_next (&bsi);
+                 if (some)
+                   todoflags |= TODO_update_smt_usage;
                }
              else if ((TREE_CODE (rhs) == BIT_NOT_EXPR
                        || TREE_CODE (rhs) == NEGATE_EXPR)
@@ -991,7 +1001,7 @@ tree_ssa_forward_propagate_single_use_vars (void)
 
   if (cfg_changed)
     cleanup_tree_cfg ();
-  return 0;
+  return todoflags;
 }
 
 
@@ -1014,7 +1024,7 @@ struct tree_opt_pass pass_forwprop = {
   0,                           /* properties_provided */
   PROP_smt_usage,              /* properties_destroyed */
   0,                           /* todo_flags_start */
-  TODO_update_smt_usage |TODO_dump_func /* todo_flags_finish */
+  TODO_dump_func /* todo_flags_finish */
   | TODO_ggc_collect
   | TODO_update_ssa | TODO_verify_ssa,
   0                                    /* letter */