From e445a2ff978362e261a74f26fe5e06d539ed893b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 18 Oct 2007 14:59:48 +0000 Subject: [PATCH] tree-ssa.c (uid_ssaname_map_eq): New function. 2007-10-18 Richard Guenther * tree-ssa.c (uid_ssaname_map_eq): New function. (uid_ssaname_map_has): Likewise. (init_tree_ssa): Allocate default_defs as uid_ssaname map. * tree-flow.h (struct gimple_df): Make default_defs a uid_ssaname map. * tree-dfa.c (gimple_default_def): Deal with it. (set_default_def): Likewise. From-SVN: r129441 --- gcc/ChangeLog | 10 ++++++++++ gcc/tree-dfa.c | 41 +++++++++++++++-------------------------- gcc/tree-flow.h | 2 +- gcc/tree-ssa.c | 22 ++++++++++++++++++++-- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 976022755d8..e93e4cb9150 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2007-10-18 Richard Guenther + + * tree-ssa.c (uid_ssaname_map_eq): New function. + (uid_ssaname_map_has): Likewise. + (init_tree_ssa): Allocate default_defs as uid_ssaname map. + * tree-flow.h (struct gimple_df): Make default_defs a + uid_ssaname map. + * tree-dfa.c (gimple_default_def): Deal with it. + (set_default_def): Likewise. + 2007-10-18 Richard Guenther * tree-flow.h (struct gimple_df): Make referenced_vars diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 26e87c173b4..f7f4243948c 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -675,15 +675,12 @@ referenced_var_check_and_insert (tree to) tree gimple_default_def (struct function *fn, tree var) { - struct int_tree_map *h, in; + struct tree_decl_minimal ind; + struct tree_ssa_name in; gcc_assert (SSA_VAR_P (var)); - in.uid = DECL_UID (var); - h = (struct int_tree_map *) htab_find_with_hash (DEFAULT_DEFS (fn), - &in, - DECL_UID (var)); - if (h) - return h->to; - return NULL_TREE; + in.var = (tree)&ind; + ind.uid = DECL_UID (var); + return (tree) htab_find_with_hash (DEFAULT_DEFS (fn), &in, DECL_UID (var)); } /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */ @@ -691,37 +688,29 @@ gimple_default_def (struct function *fn, tree var) void set_default_def (tree var, tree def) { - struct int_tree_map in; - struct int_tree_map *h; + struct tree_decl_minimal ind; + struct tree_ssa_name in; void **loc; gcc_assert (SSA_VAR_P (var)); - in.uid = DECL_UID (var); - if (!def && gimple_default_def (cfun, var)) + in.var = (tree)&ind; + ind.uid = DECL_UID (var); + if (!def) { loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in, DECL_UID (var), INSERT); + gcc_assert (*loc); htab_remove_elt (DEFAULT_DEFS (cfun), *loc); return; } - gcc_assert (!def || TREE_CODE (def) == SSA_NAME); + gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var); loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in, DECL_UID (var), INSERT); /* Default definition might be changed by tail call optimization. */ - if (!*loc) - { - h = GGC_NEW (struct int_tree_map); - h->uid = DECL_UID (var); - h->to = def; - *(struct int_tree_map **) loc = h; - } - else - { - h = (struct int_tree_map *) *loc; - SSA_NAME_IS_DEFAULT_DEF (h->to) = false; - h->to = def; - } + if (*loc) + SSA_NAME_IS_DEFAULT_DEF (*(tree *) loc) = false; + *(tree *) loc = def; /* Mark DEF as the default definition for VAR. */ SSA_NAME_IS_DEFAULT_DEF (def) = true; diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index b004ad9b3b6..e07e2b2c006 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -159,7 +159,7 @@ struct gimple_df GTY(()) means that the first reference to this variable in the function is a USE or a VUSE. In those cases, the SSA renamer creates an SSA name for this variable with an empty defining statement. */ - htab_t GTY((param_is (struct int_tree_map))) default_defs; + htab_t GTY((param_is (union tree_node))) default_defs; /* 'true' after aliases have been computed (see compute_may_aliases). */ unsigned int aliases_computed_p : 1; diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index e325953884c..c6386beb816 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -810,6 +810,24 @@ 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 +uid_ssaname_map_eq (const void *va, const void *vb) +{ + const_tree a = (const_tree) va; + const_tree b = (const_tree) vb; + return (a->ssa_name.var->decl_minimal.uid == b->ssa_name.var->decl_minimal.uid); +} + +/* Hash a tree in a uid_decl_map. */ + +static unsigned int +uid_ssaname_map_hash (const void *item) +{ + return ((const_tree)item)->ssa_name.var->decl_minimal.uid; +} + /* Initialize global DFA and SSA structures. */ @@ -819,8 +837,8 @@ init_tree_ssa (void) cfun->gimple_df = GGC_CNEW (struct gimple_df); cfun->gimple_df->referenced_vars = htab_create_ggc (20, uid_decl_map_hash, uid_decl_map_eq, NULL); - cfun->gimple_df->default_defs = htab_create_ggc (20, int_tree_map_hash, - int_tree_map_eq, NULL); + cfun->gimple_df->default_defs = htab_create_ggc (20, uid_ssaname_map_hash, + uid_ssaname_map_eq, NULL); cfun->gimple_df->var_anns = htab_create_ggc (20, var_ann_hash, var_ann_eq, NULL); cfun->gimple_df->call_clobbered_vars = BITMAP_GGC_ALLOC ();