re PR tree-optimization/36291 (GCC is slow and memory-hungry building sipQtGuipart...
authorRichard Guenther <rguenther@suse.de>
Wed, 28 May 2008 13:54:05 +0000 (13:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 28 May 2008 13:54:05 +0000 (13:54 +0000)
2008-05-28  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/36291
* tree-flow. h (struct gimple_df): Remove var_anns member.
* tree-flow-inline.h (gimple_var_anns): Remove.
(var_ann): Simplify.
* tree-dfa.c (create_var_ann): Simplify.
(remove_referenced_var): Clear alias info from var_anns of globals.
* tree-ssa.c (init_tree_ssa): Do not allocate var_anns.
(delete_tree_ssa): Clear alias info from var_anns of globals.
Do not free var_anns.
(var_ann_eq): Remove.
(var_ann_hash): Likewise.

From-SVN: r136095

gcc/ChangeLog
gcc/tree-dfa.c
gcc/tree-flow-inline.h
gcc/tree-flow.h
gcc/tree-ssa.c

index 6af46e5e833fb6e4157775f67f021e85072c8eb0..20d5b105400c9c6e961288d9125b26338965529a 100644 (file)
@@ -1,3 +1,17 @@
+2008-05-28  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/36291
+       * tree-flow. h (struct gimple_df): Remove var_anns member.
+       * tree-flow-inline.h (gimple_var_anns): Remove.
+       (var_ann): Simplify.
+       * tree-dfa.c (create_var_ann): Simplify.
+       (remove_referenced_var): Clear alias info from var_anns of globals.
+       * tree-ssa.c (init_tree_ssa): Do not allocate var_anns.
+       (delete_tree_ssa): Clear alias info from var_anns of globals.
+       Do not free var_anns.
+       (var_ann_eq): Remove.
+       (var_ann_hash): Likewise.
+
 2008-05-28  Mark Shinwell  <shinwell@codesourcery.com>
 
        * config/mips/mips.c (mips_cpu_info_table): Add loongson2e
index 7e4bb7681b7b92c107377d3eb53d743ff0300c42..af167492de6404ef6f290aeb91738be9d8eebf3d 100644 (file)
@@ -142,33 +142,14 @@ var_ann_t
 create_var_ann (tree t)
 {
   var_ann_t ann;
-  struct static_var_ann_d *sann = NULL;
 
   gcc_assert (t);
   gcc_assert (DECL_P (t));
   gcc_assert (!t->base.ann || t->base.ann->common.type == VAR_ANN);
 
-  if (!MTAG_P (t) && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
-    {
-      sann = GGC_CNEW (struct static_var_ann_d);
-      ann = &sann->ann;
-    }
-  else
-    ann = GGC_CNEW (struct var_ann_d);
-
+  ann = GGC_CNEW (struct var_ann_d);
   ann->common.type = VAR_ANN;
-
-  if (!MTAG_P (t) && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
-    {
-       void **slot;
-       sann->uid = DECL_UID (t);
-       slot = htab_find_slot_with_hash (gimple_var_anns (cfun),
-                                       t, DECL_UID (t), INSERT);
-       gcc_assert (!*slot);
-       *slot = sann;
-    }
-  else
-    t->base.ann = (tree_ann_t) ann;
+  t->base.ann = (tree_ann_t) ann;
 
   return ann;
 }
@@ -765,8 +746,20 @@ remove_referenced_var (tree var)
 
   clear_call_clobbered (var);
   if ((v_ann = var_ann (var)))
-    ggc_free (v_ann);
-  var->base.ann = NULL;
+    {
+      /* Preserve var_anns of globals, but clear their alias info.  */
+      if (MTAG_P (var)
+         || (!TREE_STATIC (var) && !DECL_EXTERNAL (var)))
+       {
+         ggc_free (v_ann);
+         var->base.ann = NULL;
+       }
+      else
+       {
+         v_ann->mpt = NULL_TREE;
+         v_ann->symbol_mem_tag = NULL_TREE;
+       }
+    }
   gcc_assert (DECL_P (var));
   in.uid = uid;
   loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid,
index a41ee9ac2eb0c6b884c4ee19b76c03865429a3fc..95ddfb5b130dba9d3424ec84cfcea9182b2817dd 100644 (file)
@@ -91,14 +91,6 @@ gimple_nonlocal_all (const struct function *fun)
   return fun->gimple_df->nonlocal_all;
 }
 
-/* Hashtable of variables annotations.  Used for static variables only;
-   local variables have direct pointer in the tree node.  */
-static inline htab_t
-gimple_var_anns (const struct function *fun)
-{
-  return fun->gimple_df->var_anns;
-}
-
 /* Initialize the hashtable iterator HTI to point to hashtable TABLE */
 
 static inline void *
@@ -192,22 +184,9 @@ var_ann (const_tree t)
 {
   var_ann_t ann;
 
-  if (!MTAG_P (t)
-      && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
-    {
-      struct static_var_ann_d *sann
-        = ((struct static_var_ann_d *)
-          htab_find_with_hash (gimple_var_anns (cfun), t, DECL_UID (t)));
-      if (!sann)
-       return NULL;
-      ann = &sann->ann;
-    }
-  else
-    {
-      if (!t->base.ann)
-       return NULL;
-      ann = (var_ann_t) t->base.ann;
-    }
+  if (!t->base.ann)
+    return NULL;
+  ann = (var_ann_t) t->base.ann;
 
   gcc_assert (ann->common.type == VAR_ANN);
 
index bd1f87ab396a232752d03f69d507bee56360885b..8bc6cc8a0ca96093c729e7ff08dfe1dec4d5116f 100644 (file)
@@ -188,10 +188,6 @@ struct gimple_df GTY(())
 
   struct ssa_operands ssa_operands;
 
-  /* Hashtable of variables annotations.  Used for static variables only;
-     local variables have direct pointer in the tree node.  */
-  htab_t GTY((param_is (struct static_var_ann_d))) var_anns;
-
   /* Memory reference statistics collected during alias analysis.
      This information is used to drive the memory partitioning
      heuristics in compute_memory_partitions.  */
index 150074f7c23618c9cc1c98853fa9467465f68e67..1c01d71bf6ef6e4db6154ef34b0e068299cc51e2 100644 (file)
@@ -904,24 +904,6 @@ uid_decl_map_hash (const void *item)
   return ((const_tree)item)->decl_minimal.uid;
 }
 
-/* Return true if the uid in both int tree maps are equal.  */
-
-static int
-var_ann_eq (const void *va, const void *vb)
-{
-  const struct static_var_ann_d *a = (const struct static_var_ann_d *) va;
-  const_tree const b = (const_tree) vb;
-  return (a->uid == DECL_UID (b));
-}
-
-/* Hash a UID in a int_tree_map.  */
-
-static unsigned int
-var_ann_hash (const void *item)
-{
-  return ((const struct static_var_ann_d *)item)->uid;
-}
-
 /* Return true if the DECL_UID in both trees are equal.  */
 
 static int
@@ -951,8 +933,6 @@ init_tree_ssa (struct function *fn)
                                                    uid_decl_map_eq, NULL);
   fn->gimple_df->default_defs = htab_create_ggc (20, uid_ssaname_map_hash, 
                                                 uid_ssaname_map_eq, NULL);
-  fn->gimple_df->var_anns = htab_create_ggc (20, var_ann_hash, 
-                                            var_ann_eq, NULL);
   fn->gimple_df->call_clobbered_vars = BITMAP_GGC_ALLOC ();
   fn->gimple_df->addressable_vars = BITMAP_GGC_ALLOC ();
   init_ssanames (fn, 0);
@@ -998,9 +978,16 @@ delete_tree_ssa (void)
       set_phi_nodes (bb, NULL);
     }
 
-  /* Remove annotations from every referenced variable.  */
+  /* Remove annotations from every referenced local variable.  */
   FOR_EACH_REFERENCED_VAR (var, rvi)
     {
+      if (!MTAG_P (var)
+         && (TREE_STATIC (var) || DECL_EXTERNAL (var)))
+       {
+         var_ann (var)->mpt = NULL_TREE;
+         var_ann (var)->symbol_mem_tag = NULL_TREE;
+         continue;
+       }
       if (var->base.ann)
         ggc_free (var->base.ann);
       var->base.ann = NULL;
@@ -1018,8 +1005,6 @@ delete_tree_ssa (void)
   
   htab_delete (cfun->gimple_df->default_defs);
   cfun->gimple_df->default_defs = NULL;
-  htab_delete (cfun->gimple_df->var_anns);
-  cfun->gimple_df->var_anns = NULL;
   cfun->gimple_df->call_clobbered_vars = NULL;
   cfun->gimple_df->addressable_vars = NULL;
   cfun->gimple_df->modified_noreturn_calls = NULL;