This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: checked in patch for PR 27793
- From: Andrew MacLeod <amacleod at redhat dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 07 Jun 2006 21:20:25 -0400
- Subject: Re: checked in patch for PR 27793
- References: <1149649906.17968.56.camel@pain>
On Tue, 2006-06-06 at 23:11 -0400, Andrew MacLeod wrote:
> I checked the following patch in the 4.1 branch. bootstrapped and no new
> regressions on i686-pc-linux-gnu.
>
> 4.2 to follow later.
Mainline patch attached and checked in. Again, bootstrapped and no new
regressions on i686-pc-linux-gnu.
Its almost the same, just juggled around where things are done slightly
to match mainline changes for 26757.
Andrew
2006-06-07 Andrew MacLeod <amacleod@redhat.com>
PR middle-end/27793
* tree-dfa.c (referenced_vars_dup_list): New. List of duplicate
referenced_variables with matching DECL_UID's.
(find_referenced_vars): Make sure duplicate list is empty to start.
(referenced_var_p): Remove.
(referenced_var_check_and_insert): Renamed from referenced_var_insert.
Check if var is in the list, and add if needed. Update the duplicate
list if a different var is in the list with the same DECL_UID.
(add_referenced_var): Call routine to check and insert.
* tree-ssa.c (delete_tree_ssa): Clear var_ann's on duplicates.
* tree-flow.h (referenced_vars_dup_list): External declaration.
Index: tree-dfa.c
===================================================================
*** tree-dfa.c (revision 114436)
--- tree-dfa.c (working copy)
*************** static tree find_vars_r (tree *, int *,
*** 75,80 ****
--- 75,82 ----
/* Array of all variables referenced in the function. */
htab_t referenced_vars;
+ /* List of referenced variables with duplicate UID's. */
+ VEC(tree,gc) *referenced_vars_dup_list;
/* Default definition for this symbols. If set for symbol, it
means that the first reference to this variable in the function is a
*************** find_referenced_vars (void)
*** 100,105 ****
--- 102,108 ----
basic_block bb;
block_stmt_iterator si;
+ gcc_assert (VEC_length (tree, referenced_vars_dup_list) == 0);
FOR_EACH_BB (bb)
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
*************** find_vars_r (tree *tp, int *walk_subtree
*** 606,627 ****
return NULL_TREE;
}
- /* Lookup VAR in the referenced_vars hashtable and return true if it is
- present. */
-
- static inline bool
- referenced_var_p (tree var)
- {
- struct int_tree_map *h, in;
- in.uid = DECL_UID (var);
- h = (struct int_tree_map *) htab_find_with_hash (referenced_vars,
- &in,
- in.uid);
- if (h)
- return h->to != NULL_TREE;
- return false;
- }
-
/* Lookup UID in the referenced_vars hashtable and return the associated
variable. */
--- 609,614 ----
*************** referenced_var_lookup (unsigned int uid)
*** 637,658 ****
return NULL_TREE;
}
! /* Insert the pair UID, TO into the referenced_vars hashtable. */
! static void
! referenced_var_insert (unsigned int uid, tree to)
{
! struct int_tree_map *h;
void **loc;
h = GGC_NEW (struct int_tree_map);
h->uid = uid;
h->to = to;
loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
- /* This assert can only trigger if a variable with the same UID has been
- inserted already. */
- gcc_assert ((*(struct int_tree_map **)loc) == NULL);
*(struct int_tree_map **) loc = h;
}
/* Lookup VAR UID in the default_defs hashtable and return the associated
--- 624,675 ----
return NULL_TREE;
}
! /* Check if TO is in the referenced_vars hash table and insert it if not.
! Return true if it required insertion. */
! static bool
! referenced_var_check_and_insert (tree to)
{
! struct int_tree_map *h, in;
void **loc;
+ unsigned int uid = DECL_UID (to);
+
+ in.uid = uid;
+ in.to = to;
+ h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
+
+ if (h)
+ {
+ unsigned u;
+ tree t = NULL_TREE;
+
+ /* DECL_UID has already been entered in the table. Verify that it is
+ the same entry as TO. */
+ gcc_assert (h->to != NULL);
+ if (h->to == to)
+ return false;
+
+ /* PRs 26757 and 27793. Maintain a list of duplicate variable pointers
+ with the same DECL_UID. There isn't usually very many.
+ TODO. Once the C++ front end doesn't create duplicate DECL UID's, this
+ code can be removed. */
+ for (u = 0; u < VEC_length (tree, referenced_vars_dup_list); u++)
+ {
+ t = VEC_index (tree, referenced_vars_dup_list, u);
+ if (t == to)
+ break;
+ }
+ if (t != to)
+ VEC_safe_push (tree, gc, referenced_vars_dup_list, to);
+ return false;
+ }
h = GGC_NEW (struct int_tree_map);
h->uid = uid;
h->to = to;
loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
*(struct int_tree_map **) loc = h;
+ return true;
}
/* Lookup VAR UID in the default_defs hashtable and return the associated
*************** add_referenced_var (tree var)
*** 715,727 ****
v_ann = get_var_ann (var);
gcc_assert (DECL_P (var));
! if (!referenced_var_p (var))
{
! /* This is the first time we find this variable, add it to the
! REFERENCED_VARS array and annotate it with attributes that are
! intrinsic to the variable. */
!
! referenced_var_insert (DECL_UID (var), var);
/* Tag's don't have DECL_INITIAL. */
if (MTAG_P (var))
--- 732,742 ----
v_ann = get_var_ann (var);
gcc_assert (DECL_P (var));
! /* Insert VAR into the referenced_vars has table if it isn't present. */
! if (referenced_var_check_and_insert (var))
{
! /* This is the first time we found this variable, annotate it with
! attributes that are intrinsic to the variable. */
/* Tag's don't have DECL_INITIAL. */
if (MTAG_P (var))
Index: tree-ssa.c
===================================================================
*** tree-ssa.c (revision 114436)
--- tree-ssa.c (working copy)
*************** delete_tree_ssa (void)
*** 853,858 ****
--- 853,859 ----
block_stmt_iterator bsi;
referenced_var_iterator rvi;
tree var;
+ unsigned u;
/* Release any ssa_names still in use. */
for (i = 0; i < num_ssa_names; i++)
*************** delete_tree_ssa (void)
*** 887,892 ****
--- 888,903 ----
ggc_free (var->common.ann);
var->common.ann = NULL;
}
+
+ /* Remove any referenced variables which had duplicate UID's. */
+ for (u = 0; u < VEC_length (tree, referenced_vars_dup_list); u++)
+ {
+ var = VEC_index (tree, referenced_vars_dup_list, u);
+ ggc_free (var->common.ann);
+ var->common.ann = NULL;
+ }
+ VEC_free (tree, gc, referenced_vars_dup_list);
+
htab_delete (referenced_vars);
referenced_vars = NULL;
Index: tree-flow.h
===================================================================
*** tree-flow.h (revision 114436)
--- tree-flow.h (working copy)
*************** typedef struct
*** 419,424 ****
--- 419,426 ----
/* Array of all variables referenced in the function. */
extern GTY((param_is (struct int_tree_map))) htab_t referenced_vars;
+ /* List of referenced variables in the function with duplicate UID's. */
+ extern VEC(tree,gc) *referenced_vars_dup_list;
/* Default defs for undefined symbols. */
extern GTY((param_is (struct int_tree_map))) htab_t default_defs;