aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-05-28 13:54:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-05-28 13:54:05 +0000
commit540f6bda9926d60d7691fc4a21fe78338b450952 (patch)
treebbf97b3fc675101df94246164a86835ad4504952 /gcc
parent00ea95170b661191fffee460554c33f075bcc733 (diff)
downloadgcc-540f6bda9926d60d7691fc4a21fe78338b450952.zip
gcc-540f6bda9926d60d7691fc4a21fe78338b450952.tar.gz
gcc-540f6bda9926d60d7691fc4a21fe78338b450952.tar.bz2
re PR tree-optimization/36291 (GCC is slow and memory-hungry building sipQtGuipart.cpp)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/tree-dfa.c39
-rw-r--r--gcc/tree-flow-inline.h27
-rw-r--r--gcc/tree-flow.h4
-rw-r--r--gcc/tree-ssa.c31
5 files changed, 41 insertions, 74 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6af46e5..20d5b10 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 7e4bb76..af16749 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -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,
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index a41ee9a..95ddfb5 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -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);
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index bd1f87a..8bc6cc8 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -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. */
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 150074f..1c01d71 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -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;