This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: checked in patch for PR 27793


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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]