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]

[3/3] remove var_ann: die


Hi,

On Wed, 1 Aug 2012, Michael Matz wrote:

> The only remaining semantic of var_ann now is "if it's non-zero it's a 
> non-global variable that was put into referenced_vars".

And that's removed in this patch.  Most of the time it's not very 
interesting to know if a variable was put in referenced vars or not, in 
the inliner we can use a different mean.

So, this finally gets rid of the ugly variable annotations and hence a 
pointer for each var_decl, parm_decl and result_decl.

Regstrapped on x86_64-linux with the other two patches, no regressions.  
Okay for trunk?


Ciao,
Michael.
-- 
	* tree-complex.c (init_parameter_lattice_values): Don't call var_ann.
	* tree-dfa.c (struct dfa_stats_d): Remove num_var_anns member.
	(dump_dfa_stats): Don't dump stats about var anns.
	(collect_dfa_stats): Don't collect them.
	(add_referenced_var_1): Don't set var annotation pointers.
	(remove_referenced_var): Ditto, and only remove it it's in the
	hash table.

	* tree-flow-inline.h (var_ann): Remove.
	* tree-flow.h (struct var_ann_d, var_ann_t): Remove.

	* tree-inline.c (remapped_type): Remove.
	(can_be_nonlocal): Most variable will be considered live here,
	return false earlier.
	(remap_decls): Don't call var_ann, all variables will be considered
	referenced here.
	(copy_debug_stmt): Ditto, and use is_global_var.

	* tree-into-ssa.c (rewrite_debug_stmt_uses): Use get_current_def to
	determine if a variable was referred to, not var_ann.
	* tree-ssa-live.c (remove_unused_scope_block_p): Don't check var_ann.
	(remove_unused_locals): Ditto.
	* tree-ssa.c (delete_tree_ssa): Don't free/clear var ann pointers.
	* tree-tailcall.c (arg_needs_copy_p): Don't check var_ann.
	* tree.c (copy_node_stat): Don't clear var ann pointer.
	* tree.h (tree_result_decl, tree_parm_decl, tree_var_decl): Remove
	ann member.
	(DECL_VAR_ANN_PTR): Remove.

Index: gcc/tree-complex.c
===================================================================
*** gcc.orig/tree-complex.c	2012-08-01 15:58:32.000000000 +0200
--- gcc/tree-complex.c	2012-08-01 16:00:51.000000000 +0200
*************** init_parameter_lattice_values (void)
*** 176,182 ****
  
    for (parm = DECL_ARGUMENTS (cfun->decl); parm ; parm = DECL_CHAIN (parm))
      if (is_complex_reg (parm)
- 	&& var_ann (parm) != NULL
  	&& (ssa_name = gimple_default_def (cfun, parm)) != NULL_TREE)
        VEC_replace (complex_lattice_t, complex_lattice_values,
  		   SSA_NAME_VERSION (ssa_name), VARYING);
--- 176,181 ----
Index: gcc/tree-dfa.c
===================================================================
*** gcc.orig/tree-dfa.c	2012-08-01 15:59:27.000000000 +0200
--- gcc/tree-dfa.c	2012-08-01 16:00:51.000000000 +0200
*************** along with GCC; see the file COPYING3.
*** 46,52 ****
  /* Counters used to display DFA and SSA statistics.  */
  struct dfa_stats_d
  {
-   long num_var_anns;
    long num_defs;
    long num_uses;
    long num_phis;
--- 46,51 ----
*************** dump_dfa_stats (FILE *file)
*** 303,313 ****
    fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
  	   SCALE (size), LABEL (size));
  
-   size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
-   total += size;
-   fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
- 	   SCALE (size), LABEL (size));
- 
    size = dfa_stats.num_uses * sizeof (tree *);
    total += size;
    fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
--- 302,307 ----
*************** collect_dfa_stats (struct dfa_stats_d *d
*** 374,382 ****
  
    memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
  
-   /* Count all the variable annotations.  */
-   dfa_stats_p->num_var_anns = htab_elements (gimple_referenced_vars (cfun));
- 
    /* Walk all the statements in the function counting references.  */
    FOR_EACH_BB (bb)
      {
--- 368,373 ----
*************** add_referenced_var_1 (tree var, struct f
*** 561,571 ****
    /* Insert VAR into the referenced_vars hash table if it isn't present
       and allocate its var-annotation.  */
    if (referenced_var_check_and_insert (var, fn))
!     {
!       gcc_checking_assert (!*DECL_VAR_ANN_PTR (var));
!       *DECL_VAR_ANN_PTR (var) = ggc_alloc_cleared_var_ann_d ();
!       return true;
!     }
  
    return false;
  }
--- 552,558 ----
    /* Insert VAR into the referenced_vars hash table if it isn't present
       and allocate its var-annotation.  */
    if (referenced_var_check_and_insert (var, fn))
!     return true;
  
    return false;
  }
*************** add_referenced_var_1 (tree var, struct f
*** 576,582 ****
  void
  remove_referenced_var (tree var)
  {
-   var_ann_t v_ann;
    struct tree_decl_minimal in;
    void **loc;
    unsigned int uid = DECL_UID (var);
--- 563,568 ----
*************** remove_referenced_var (tree var)
*** 587,600 ****
  
    gcc_checking_assert (!is_global_var (var));
  
-   v_ann = var_ann (var);
-   ggc_free (v_ann);
-   *DECL_VAR_ANN_PTR (var) = NULL;
- 
    in.uid = uid;
    loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid,
  				  NO_INSERT);
!   htab_clear_slot (gimple_referenced_vars (cfun), loc);
  }
  
  
--- 573,583 ----
  
    gcc_checking_assert (!is_global_var (var));
  
    in.uid = uid;
    loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid,
  				  NO_INSERT);
!   if (loc)
!     htab_clear_slot (gimple_referenced_vars (cfun), loc);
  }
  
  
Index: gcc/tree-flow-inline.h
===================================================================
*** gcc.orig/tree-flow-inline.h	2012-08-01 16:00:42.000000000 +0200
--- gcc/tree-flow-inline.h	2012-08-01 16:00:51.000000000 +0200
*************** next_referenced_var (referenced_var_iter
*** 136,150 ****
    return (tree) next_htab_element (&iter->hti);
  }
  
- /* Return the variable annotation for T, which must be a _DECL node.
-    Return NULL if the variable annotation doesn't already exist.  */
- static inline var_ann_t
- var_ann (const_tree t)
- {
-   const var_ann_t *p = DECL_VAR_ANN_PTR (t);
-   return p ? *p : NULL;
- }
- 
  /* Get the number of the next statement uid to be allocated.  */
  static inline unsigned int
  gimple_stmt_max_uid (struct function *fn)
--- 136,141 ----
Index: gcc/tree-flow.h
===================================================================
*** gcc.orig/tree-flow.h	2012-08-01 16:00:42.000000000 +0200
--- gcc/tree-flow.h	2012-08-01 16:00:51.000000000 +0200
*************** enum need_phi_state {
*** 177,189 ****
  };
  
  
- struct GTY(()) var_ann_d {
-   /* Nonzero if this variable was used after SSA optimizations were
-      applied.  We set this when translating out of SSA form.  */
-   unsigned donotuse : 1;
- };
- 
- 
  /* Immediate use lists are used to directly access all uses for an SSA
     name and get pointers to the statement for each use.
  
--- 177,182 ----
*************** typedef struct immediate_use_iterator_d
*** 278,286 ****
  
  
  
- typedef struct var_ann_d *var_ann_t;
- 
- static inline var_ann_t var_ann (const_tree);
  static inline void update_stmt (gimple);
  static inline int get_lineno (const_gimple);
  
--- 271,276 ----
Index: gcc/tree-inline.c
===================================================================
*** gcc.orig/tree-inline.c	2012-08-01 15:59:27.000000000 +0200
--- gcc/tree-inline.c	2012-08-01 16:00:51.000000000 +0200
*************** remap_type (tree type, copy_body_data *i
*** 501,526 ****
    return tmp;
  }
  
- /* Return previously remapped type of TYPE in ID.  Return NULL if TYPE
-    is NULL or TYPE has not been remapped before.  */
- 
- static tree
- remapped_type (tree type, copy_body_data *id)
- {
-   tree *node;
- 
-   if (type == NULL)
-     return type;
- 
-   /* See if we have remapped this type.  */
-   node = (tree *) pointer_map_contains (id->decl_map, type);
-   if (node)
-     return *node;
-   else
-     return NULL;
- }
- 
-   /* The type only needs remapping if it's variably modified.  */
  /* Decide if DECL can be put into BLOCK_NONLOCAL_VARs.  */
  
  static bool
--- 501,506 ----
*************** can_be_nonlocal (tree decl, copy_body_da
*** 536,561 ****
        && !auto_var_in_fn_p (decl, id->src_fn))
      return true;
  
!   /* At the moment dwarf2out can handle only these types of nodes.  We
!      can support more later.  */
!   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL)
!     return false;
! 
!   /* We must use global type.  We call remapped_type instead of
!      remap_type since we don't want to remap this type here if it
!      hasn't been remapped before.  */
!   if (TREE_TYPE (decl) != remapped_type (TREE_TYPE (decl), id))
!     return false;
! 
!   /* Wihtout SSA we can't tell if variable is used.  */
!   if (!gimple_in_ssa_p (cfun))
!     return false;
! 
!   /* Live variables must be copied so we can attach DECL_RTL.  */
!   if (var_ann (decl))
!     return false;
! 
!   return true;
  }
  
  static tree
--- 516,522 ----
        && !auto_var_in_fn_p (decl, id->src_fn))
      return true;
  
!   return false;
  }
  
  static tree
*************** remap_decls (tree decls, VEC(tree,gc) **
*** 571,579 ****
  
        if (can_be_nonlocal (old_var, id))
  	{
  	  if (TREE_CODE (old_var) == VAR_DECL
! 	      && ! DECL_EXTERNAL (old_var)
! 	      && (var_ann (old_var) || !gimple_in_ssa_p (cfun)))
  	    add_local_decl (cfun, old_var);
  	  if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
  	      && !DECL_IGNORED_P (old_var)
--- 532,541 ----
  
        if (can_be_nonlocal (old_var, id))
  	{
+ 	  /* We need to add this variable to the local decls as otherwise
+ 	     nothing else will do so.  */
  	  if (TREE_CODE (old_var) == VAR_DECL
! 	      && ! DECL_EXTERNAL (old_var))
  	    add_local_decl (cfun, old_var);
  	  if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
  	      && !DECL_IGNORED_P (old_var)
*************** copy_debug_stmt (gimple stmt, copy_body_
*** 2371,2380 ****
        t = *n;
      }
    else if (TREE_CODE (t) == VAR_DECL
! 	   && !TREE_STATIC (t)
! 	   && gimple_in_ssa_p (cfun)
! 	   && !pointer_map_contains (id->decl_map, t)
! 	   && !var_ann (t))
      /* T is a non-localized variable.  */;
    else
      walk_tree (&t, remap_gimple_op_r, &wi, NULL);
--- 2333,2340 ----
        t = *n;
      }
    else if (TREE_CODE (t) == VAR_DECL
! 	   && !is_global_var (t)
! 	   && !pointer_map_contains (id->decl_map, t))
      /* T is a non-localized variable.  */;
    else
      walk_tree (&t, remap_gimple_op_r, &wi, NULL);
Index: gcc/tree-into-ssa.c
===================================================================
*** gcc.orig/tree-into-ssa.c	2012-08-01 15:59:25.000000000 +0200
--- gcc/tree-into-ssa.c	2012-08-01 16:00:51.000000000 +0200
*************** rewrite_debug_stmt_uses (gimple stmt)
*** 1274,1282 ****
  
    FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
      {
!       tree var = USE_FROM_PTR (use_p), def = NULL_TREE;
        gcc_assert (DECL_P (var));
!       if (var_ann (var) == NULL)
  	{
  	  if (TREE_CODE (var) == PARM_DECL && single_succ_p (ENTRY_BLOCK_PTR))
  	    {
--- 1274,1283 ----
  
    FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
      {
!       tree var = USE_FROM_PTR (use_p), def;
        gcc_assert (DECL_P (var));
!       def = get_current_def (var);
!       if (!def)
  	{
  	  if (TREE_CODE (var) == PARM_DECL && single_succ_p (ENTRY_BLOCK_PTR))
  	    {
*************** rewrite_debug_stmt_uses (gimple stmt)
*** 1318,1355 ****
  	}
        else
  	{
- 	  def = get_current_def (var);
  	  /* Check if get_current_def can be trusted.  */
! 	  if (def)
  	    {
! 	      basic_block bb = gimple_bb (stmt);
! 	      basic_block def_bb
! 		= SSA_NAME_IS_DEFAULT_DEF (def)
! 		  ? NULL : gimple_bb (SSA_NAME_DEF_STMT (def));
  
! 	      /* If definition is in current bb, it is fine.  */
! 	      if (bb == def_bb)
! 		;
! 	      /* If definition bb doesn't dominate the current bb,
! 		 it can't be used.  */
! 	      else if (def_bb && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
! 		def = NULL;
! 	      /* If there is just one definition and dominates the current
! 		 bb, it is fine.  */
! 	      else if (get_phi_state (var) == NEED_PHI_STATE_NO)
  		;
  	      else
! 		{
! 		  struct def_blocks_d *db_p = get_def_blocks_for (var);
! 
! 		  /* If there are some non-debug uses in the current bb,
! 		     it is fine.  */
! 		  if (bitmap_bit_p (db_p->livein_blocks, bb->index))
! 		    ;
! 		  /* Otherwise give up for now.  */
! 		  else
! 		    def = NULL;
! 		}
  	    }
  	}
        if (def == NULL)
--- 1319,1352 ----
  	}
        else
  	{
  	  /* Check if get_current_def can be trusted.  */
! 	  basic_block bb = gimple_bb (stmt);
! 	  basic_block def_bb
! 	      = SSA_NAME_IS_DEFAULT_DEF (def)
! 	      ? NULL : gimple_bb (SSA_NAME_DEF_STMT (def));
! 
! 	  /* If definition is in current bb, it is fine.  */
! 	  if (bb == def_bb)
! 	    ;
! 	  /* If definition bb doesn't dominate the current bb,
! 	     it can't be used.  */
! 	  else if (def_bb && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
! 	    def = NULL;
! 	  /* If there is just one definition and dominates the current
! 	     bb, it is fine.  */
! 	  else if (get_phi_state (var) == NEED_PHI_STATE_NO)
! 	    ;
! 	  else
  	    {
! 	      struct def_blocks_d *db_p = get_def_blocks_for (var);
  
! 	      /* If there are some non-debug uses in the current bb,
! 		 it is fine.  */
! 	      if (bitmap_bit_p (db_p->livein_blocks, bb->index))
  		;
+ 	      /* Otherwise give up for now.  */
  	      else
! 		def = NULL;
  	    }
  	}
        if (def == NULL)
Index: gcc/tree-ssa-live.c
===================================================================
*** gcc.orig/tree-ssa-live.c	2012-08-01 16:00:42.000000000 +0200
--- gcc/tree-ssa-live.c	2012-08-01 16:00:51.000000000 +0200
*************** remove_unused_scope_block_p (tree scope,
*** 477,483 ****
  	 at all so user can't get into the scopes at first place.  */
        else if ((is_global_var (*t)
  		&& !bitmap_bit_p (global_unused_vars, DECL_UID (*t)))
! 	       || (var_ann (*t) != NULL && is_used_p (*t)))
  	unused = false;
        else if (TREE_CODE (*t) == LABEL_DECL && TREE_USED (*t))
  	/* For labels that are still used in the IL, the decision to
--- 477,483 ----
  	 at all so user can't get into the scopes at first place.  */
        else if ((is_global_var (*t)
  		&& !bitmap_bit_p (global_unused_vars, DECL_UID (*t)))
! 	       || is_used_p (*t))
  	unused = false;
        else if (TREE_CODE (*t) == LABEL_DECL && TREE_USED (*t))
  	/* For labels that are still used in the IL, the decision to
*************** remove_unused_locals (void)
*** 826,836 ****
  	      if (bitmap_bit_p (global_unused_vars, DECL_UID (var)))
  		continue;
  	    }
! 	  else if (var_ann (var) == NULL
! 		   || !is_used_p (var))
  	    {
! 	      if (var_ann (var))
! 		remove_referenced_var (var);
  	      if (cfun->nonlocal_goto_save_area
  		  && TREE_OPERAND (cfun->nonlocal_goto_save_area, 0) == var)
  		cfun->nonlocal_goto_save_area = NULL;
--- 826,834 ----
  	      if (bitmap_bit_p (global_unused_vars, DECL_UID (var)))
  		continue;
  	    }
! 	  else if (!is_used_p (var))
  	    {
! 	      remove_referenced_var (var);
  	      if (cfun->nonlocal_goto_save_area
  		  && TREE_OPERAND (cfun->nonlocal_goto_save_area, 0) == var)
  		cfun->nonlocal_goto_save_area = NULL;
Index: gcc/tree-ssa.c
===================================================================
*** gcc.orig/tree-ssa.c	2012-08-01 15:59:27.000000000 +0200
--- gcc/tree-ssa.c	2012-08-01 16:00:51.000000000 +0200
*************** struct gimple_opt_pass pass_init_datastr
*** 1150,1164 ****
  void
  delete_tree_ssa (void)
  {
-   referenced_var_iterator rvi;
-   tree var;
- 
    /* Remove annotations from every referenced local variable.  */
-   FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
-     {
-       ggc_free (var_ann (var));
-       *DECL_VAR_ANN_PTR (var) = NULL;
-     }
    htab_delete (gimple_referenced_vars (cfun));
    cfun->gimple_df->referenced_vars = NULL;
  
--- 1150,1156 ----
Index: gcc/tree-tailcall.c
===================================================================
*** gcc.orig/tree-tailcall.c	2012-08-01 15:59:25.000000000 +0200
--- gcc/tree-tailcall.c	2012-08-01 16:00:51.000000000 +0200
*************** arg_needs_copy_p (tree param)
*** 765,771 ****
  {
    tree def;
  
!   if (!is_gimple_reg (param) || !var_ann (param))
      return false;
  
    /* Parameters that are only defined but never used need not be copied.  */
--- 765,771 ----
  {
    tree def;
  
!   if (!is_gimple_reg (param))
      return false;
  
    /* Parameters that are only defined but never used need not be copied.  */
Index: gcc/tree.c
===================================================================
*** gcc.orig/tree.c	2012-08-01 15:58:32.000000000 +0200
--- gcc/tree.c	2012-08-01 16:00:51.000000000 +0200
*************** copy_node_stat (tree node MEM_STAT_DECL)
*** 961,968 ****
      TREE_CHAIN (t) = 0;
    TREE_ASM_WRITTEN (t) = 0;
    TREE_VISITED (t) = 0;
-   if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
-     *DECL_VAR_ANN_PTR (t) = 0;
  
    if (TREE_CODE_CLASS (code) == tcc_declaration)
      {
--- 961,966 ----
Index: gcc/tree.h
===================================================================
*** gcc.orig/tree.h	2012-08-01 15:58:32.000000000 +0200
--- gcc/tree.h	2012-08-01 16:00:51.000000000 +0200
*************** struct GTY(()) tree_label_decl {
*** 3116,3125 ****
    int eh_landing_pad_nr;
  };
  
- struct var_ann_d;
  struct GTY(()) tree_result_decl {
    struct tree_decl_with_rtl common;
-   struct var_ann_d *ann;
  };
  
  struct GTY(()) tree_const_decl {
--- 3116,3123 ----
*************** struct GTY(()) tree_const_decl {
*** 3138,3144 ****
  struct GTY(()) tree_parm_decl {
    struct tree_decl_with_rtl common;
    rtx incoming_rtl;
-   struct var_ann_d *ann;
  };
  
  
--- 3136,3141 ----
*************** extern void decl_fini_priority_insert (t
*** 3355,3369 ****
  #define VAR_DECL_IS_VIRTUAL_OPERAND(NODE) \
    (VAR_DECL_CHECK (NODE)->base.saturating_flag)
  
- #define DECL_VAR_ANN_PTR(NODE) \
-   (TREE_CODE (NODE) == VAR_DECL ? &(NODE)->var_decl.ann \
-    : TREE_CODE (NODE) == PARM_DECL ? &(NODE)->parm_decl.ann \
-    : TREE_CODE (NODE) == RESULT_DECL ? &(NODE)->result_decl.ann \
-    : NULL)
- 
  struct GTY(()) tree_var_decl {
    struct tree_decl_with_vis common;
-   struct var_ann_d *ann;
  };
  
  
--- 3352,3359 ----


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