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: [3/3] remove var_ann: die


On Wed, Aug 1, 2012 at 4:13 PM, Michael Matz <matz@suse.de> wrote:
> 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?

Ok!

Thanks,
Richard.

>
> 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]