OSDN Git Service

Joseph Myers <joseph@codesourcery.com>
[pf3gnuchains/gcc-fork.git] / gcc / ipa-struct-reorg.c
index 24b42e3..d787a66 100644 (file)
@@ -40,6 +40,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "target.h"
 #include "cgraph.h"
 #include "diagnostic.h"
+#include "tree-pretty-print.h"
+#include "gimple-pretty-print.h"
 #include "timevar.h"
 #include "params.h"
 #include "fibheap.h"
@@ -419,6 +421,10 @@ decompose_indirect_ref_acc (tree str_decl, struct field_access_site *acc)
   if (!is_result_of_mult (before_cast, &acc->num, struct_size))
     return false;
 
+  /* ???  Add TREE_OPERAND (acc->ref, 1) to acc->offset.  */
+  if (!integer_zerop (TREE_OPERAND (acc->ref, 1)))
+    return false;
+
   return true;
 }
 
@@ -432,7 +438,7 @@ decompose_access (tree str_decl, struct field_access_site *acc)
 {
   gcc_assert (acc->ref);
 
-  if (TREE_CODE (acc->ref) == INDIRECT_REF)
+  if (TREE_CODE (acc->ref) == MEM_REF)
     return decompose_indirect_ref_acc (str_decl, acc);
   else if (TREE_CODE (acc->ref) == ARRAY_REF)
     return true;
@@ -550,7 +556,7 @@ finalize_new_vars_creation (void **slot, void *data ATTRIBUTE_UNUSED)
   unsigned i;
   tree var;
 
-  for (i = 0; VEC_iterate (tree, n_var->new_vars, i, var); i++)
+  FOR_EACH_VEC_ELT (tree, n_var->new_vars, i, var)
     finalize_var_creation (var);
   return 1;
 }
@@ -564,7 +570,7 @@ find_var_in_new_vars_vec (new_var var, tree new_type)
   tree n_var;
   unsigned i;
 
-  for (i = 0; VEC_iterate (tree, var->new_vars, i, n_var); i++)
+  FOR_EACH_VEC_ELT (tree, var->new_vars, i, n_var)
     {
       tree type = strip_type(get_type_of_var (n_var));
       gcc_assert (type);
@@ -780,7 +786,7 @@ is_part_of_malloc (gimple stmt, tree fn_decl)
       alloc_site_t *call;
       unsigned i;
 
-      for (i = 0; VEC_iterate (alloc_site_t, fallocs->allocs, i, call); i++)
+      FOR_EACH_VEC_ELT (alloc_site_t, fallocs->allocs, i, call)
        if (call->stmt == stmt
            || get_final_alloc_stmt (call->stmt) == stmt)
          return true;
@@ -967,12 +973,12 @@ replace_field_acc (struct field_access_site *acc, tree new_type)
   type_wrapper_t *wr_p = NULL;
   struct ref_pos r_pos;
 
-  while (TREE_CODE (ref_var) == INDIRECT_REF
+  while (TREE_CODE (ref_var) == MEM_REF
         || TREE_CODE (ref_var) == ARRAY_REF)
     {
       type_wrapper_t wr;
 
-      if ( TREE_CODE (ref_var) == INDIRECT_REF)
+      if (TREE_CODE (ref_var) == MEM_REF)
        {
          wr.wrap = 0;
          wr.domain = 0;
@@ -999,7 +1005,7 @@ replace_field_acc (struct field_access_site *acc, tree new_type)
        new_ref = build4 (ARRAY_REF, type, new_ref,
                          wr_p->domain, NULL_TREE, NULL_TREE);
       else /* Pointer.  */
-       new_ref = build1 (INDIRECT_REF, type, new_ref);
+       new_ref = build_simple_mem_ref (new_ref);
       VEC_pop (type_wrapper_t, wrapper);
     }
 
@@ -1039,7 +1045,7 @@ static void
 replace_field_access_stmt (struct field_access_site *acc, tree new_type)
 {
 
-  if (TREE_CODE (acc->ref) == INDIRECT_REF
+  if (TREE_CODE (acc->ref) == MEM_REF
       ||TREE_CODE (acc->ref) == ARRAY_REF
       ||TREE_CODE (acc->ref) == VAR_DECL)
     replace_field_acc (acc, new_type);
@@ -1059,7 +1065,7 @@ find_structure (tree type)
 
   type = TYPE_MAIN_VARIANT (type);
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     if (is_equal_types (str->decl, type))
       return i;
 
@@ -1253,7 +1259,7 @@ create_new_stmts_for_cond_expr (gimple stmt)
   arg = integer_zerop (arg0) ? arg1 : arg0;
   pos = integer_zerop (arg0) ? 1 : 0;
 
-  for (i = 0; VEC_iterate (tree, str->new_types, i, type); i++)
+  FOR_EACH_VEC_ELT (tree, str->new_types, i, type)
     {
       tree new_arg;
 
@@ -1275,13 +1281,11 @@ insert_new_var_in_stmt (gimple stmt, tree var, tree new_var)
   pos = find_pos_in_stmt (stmt, var, &r_pos);
   gcc_assert (pos);
 
-  while (r_pos.container && (TREE_CODE(r_pos.container) == INDIRECT_REF
+  while (r_pos.container && (TREE_CODE(r_pos.container) == MEM_REF
                             || TREE_CODE(r_pos.container) == ADDR_EXPR))
     {
-      tree type = TREE_TYPE (TREE_TYPE (new_var));
-
-      if (TREE_CODE(r_pos.container) == INDIRECT_REF)
-       new_var = build1 (INDIRECT_REF, type, new_var);
+      if (TREE_CODE(r_pos.container) == MEM_REF)
+       new_var = build_simple_mem_ref (new_var);
       else
        new_var = build_fold_addr_expr (new_var);
       pos = find_pos_in_stmt (stmt, r_pos.container, &r_pos);
@@ -1309,7 +1313,7 @@ create_general_new_stmt (struct access_site *acc, tree new_type)
       gimple_set_vdef (new_stmt, NULL_TREE);
     }
 
-  for (i = 0; VEC_iterate (tree, acc->vars, i, var); i++)
+  FOR_EACH_VEC_ELT (tree, acc->vars, i, var)
     {
       tree new_var = find_new_var_of_type (var, new_type);
       tree lhs, rhs = NULL_TREE;
@@ -1362,7 +1366,7 @@ create_new_stmts_for_general_acc (struct access_site *acc, d_str str)
   gimple stmt = acc->stmt;
   unsigned i;
 
-  for (i = 0; VEC_iterate (tree, str->new_types, i, type); i++)
+  FOR_EACH_VEC_ELT (tree, str->new_types, i, type)
     {
       gimple new_stmt;
 
@@ -1471,7 +1475,7 @@ update_varpool_with_new_var (void **slot, void *data ATTRIBUTE_UNUSED)
   tree var;
   unsigned i;
 
-  for (i = 0; VEC_iterate (tree, n_var->new_vars, i, var); i++)
+  FOR_EACH_VEC_ELT (tree, n_var->new_vars, i, var)
     insert_global_to_varpool (var);
   return 1;
 }
@@ -1562,7 +1566,7 @@ add_unsuitable_type (VEC (tree, heap) **unsuitable_types, tree type)
 
   type = TYPE_MAIN_VARIANT (type);
 
-  for (i = 0; VEC_iterate (tree, *unsuitable_types, i, t); i++)
+  FOR_EACH_VEC_ELT (tree, *unsuitable_types, i, t)
     if (is_equal_types (t, type))
       break;
 
@@ -2084,7 +2088,7 @@ dump_acc (void **slot, void *data ATTRIBUTE_UNUSED)
     print_gimple_stmt (dump_file, acc->stmt, 0, 0);
   fprintf(dump_file, " : ");
 
-  for (i = 0; VEC_iterate (tree, acc->vars, i, var); i++)
+  FOR_EACH_VEC_ELT (tree, acc->vars, i, var)
     {
       print_generic_expr (dump_file, var, 0);
       fprintf(dump_file, ", ");
@@ -2151,7 +2155,7 @@ create_new_accesses_in_bb (basic_block bb)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     create_new_accs_for_struct (str, bb);
 }
 
@@ -2164,7 +2168,7 @@ create_new_alloc_sites (fallocs_t m_data, tree context)
   alloc_site_t *call;
   unsigned j;
 
-  for (j = 0; VEC_iterate (alloc_site_t, m_data->allocs, j, call); j++)
+  FOR_EACH_VEC_ELT (alloc_site_t, m_data->allocs, j, call)
     {
       gimple stmt = call->stmt;
       d_str str = call->str;
@@ -2183,7 +2187,7 @@ create_new_alloc_sites (fallocs_t m_data, tree context)
        }
 
       /* Generate an allocation sites for each new structure type.  */
-      for (i = 0; VEC_iterate (tree, str->new_types, i, type); i++)
+      FOR_EACH_VEC_ELT (tree, str->new_types, i, type)
        {
          gimple new_malloc_stmt = NULL;
          gimple last_stmt_tmp = NULL;
@@ -2528,7 +2532,7 @@ get_stmt_accesses (tree *tp, int *walk_subtrees, void *data)
        tree field_decl = TREE_OPERAND (t, 1);
 
 
-       if ((TREE_CODE (ref) == INDIRECT_REF
+       if ((TREE_CODE (ref) == MEM_REF
             || TREE_CODE (ref) == ARRAY_REF
             || TREE_CODE (ref) == VAR_DECL)
            && TREE_CODE (field_decl) == FIELD_DECL)
@@ -2642,7 +2646,7 @@ free_structures (void)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     free_data_struct (str);
 
   VEC_free (structure, heap, structures);
@@ -2870,7 +2874,7 @@ exclude_escaping_types_1 (VEC (tree, heap) **unsuitable_types)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     check_type_escape (str, unsuitable_types);
 }
 
@@ -2921,7 +2925,7 @@ exclude_types_passed_to_local_func (VEC (tree, heap) **unsuitable_types)
        tree fn = c_node->decl;
        tree arg;
 
-       for (arg = DECL_ARGUMENTS (fn); arg; arg = TREE_CHAIN (arg))
+       for (arg = DECL_ARGUMENTS (fn); arg; arg = DECL_CHAIN (arg))
          {
            tree type = TREE_TYPE (arg);
 
@@ -3241,6 +3245,7 @@ do_reorg_for_func (struct cgraph_node *node)
   create_new_accesses_for_func ();
   update_ssa (TODO_update_ssa);
   cleanup_tree_cfg ();
+  cgraph_rebuild_references ();
 
   /* Free auxiliary data representing local variables.  */
   free_new_vars_htab (new_local_vars);
@@ -3350,8 +3355,8 @@ remove_unsuitable_types (VEC (tree, heap) *unsuitable_types)
   tree type;
   unsigned i, j;
 
-  for (j = 0; VEC_iterate (tree, unsuitable_types, j, type); j++)
-    for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (tree, unsuitable_types, j, type)
+    FOR_EACH_VEC_ELT (structure, structures, i, str)
       if (is_equal_types (str->decl, type))
        {
          remove_structure (i);
@@ -3370,7 +3375,7 @@ exclude_types_with_bit_fields (VEC (tree, heap) **unsuitable_types)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     check_bitfields (str, unsuitable_types);
 }
 
@@ -3401,7 +3406,7 @@ analyze_struct_form (VEC (tree, heap) **unsuitable_types)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     check_struct_form (str, unsuitable_types);
 }
 
@@ -3413,7 +3418,6 @@ static void
 build_data_structure (VEC (tree, heap) **unsuitable_types)
 {
   tree var, type;
-  tree var_list;
   struct varpool_node *current_varpool;
   struct cgraph_node *c_node;
 
@@ -3436,6 +3440,7 @@ build_data_structure (VEC (tree, heap) **unsuitable_types)
       if (avail == AVAIL_LOCAL || avail == AVAIL_AVAILABLE)
        {
          struct function *fn = DECL_STRUCT_FUNCTION (c_node->decl);
+         unsigned ix;
 
          for (var = DECL_ARGUMENTS (c_node->decl); var;
               var = TREE_CHAIN (var))
@@ -3451,14 +3456,9 @@ build_data_structure (VEC (tree, heap) **unsuitable_types)
            }
 
          /* Check function local variables.  */
-         for (var_list = fn->local_decls; var_list;
-              var_list = TREE_CHAIN (var_list))
-           {
-             var = TREE_VALUE (var_list);
-
-             if (is_candidate (var, &type, unsuitable_types))
-               add_structure (type);
-           }
+         FOR_EACH_LOCAL_DECL (fn, ix, var)
+           if (is_candidate (var, &type, unsuitable_types))
+             add_structure (type);
        }
     }
 }
@@ -3580,7 +3580,7 @@ dump_accesses (void)
   if (!dump_file)
     return;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     dump_accs (str);
 }
 
@@ -3618,7 +3618,7 @@ exclude_alloc_and_field_accs (struct cgraph_node *node)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     exclude_alloc_and_field_accs_1 (str, node);
 }
 
@@ -3783,7 +3783,7 @@ dump_new_types (void)
   fprintf (dump_file, "\nThe following are the new types generated by"
           " this optimization:\n");
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     {
       if (dump_file)
        {
@@ -3792,7 +3792,7 @@ dump_new_types (void)
          fprintf (dump_file, "\nthe number of new types is %d\n",
                   VEC_length (tree, str->new_types));
        }
-      for (j = 0; VEC_iterate (tree, str->new_types, j, type); j++)
+      FOR_EACH_VEC_ELT (tree, str->new_types, j, type)
        dump_struct_type (type, 2, 0);
     }
 }
@@ -3806,7 +3806,7 @@ create_new_types (void)
   unsigned i;
   int str_num = 0;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     create_new_type (str, &str_num);
 }
 
@@ -3911,7 +3911,7 @@ exclude_cold_structs (void)
   d_str str;
 
   /* We summarize counts of fields of a structure into the structure count.  */
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     sum_counts (str, &hottest);
 
   /* Remove cold structures from structures vector.  */
@@ -3940,7 +3940,7 @@ peel_structs (void)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  FOR_EACH_VEC_ELT (structure, structures, i, str)
     peel_hot_fields (str);
 }
 
@@ -4028,7 +4028,10 @@ reorg_structs (void)
 static unsigned int
 reorg_structs_drive (void)
 {
-  reorg_structs ();
+  /* IPA struct-reorg is completely broken - its analysis phase is
+     non-conservative (which is not the only reason it is broken).  */
+  if (0)
+    reorg_structs ();
   return 0;
 }