Patchwork [PR,debug/47106] account used vars only once

login
register
mail settings
Submitter Alexandre Oliva
Date Feb. 2, 2011, 6:33 a.m.
Message ID <orlj1zueqz.fsf@livre.localdomain>
Download mbox | patch
Permalink /patch/81424/
State New
Headers show

Comments

Alexandre Oliva - Feb. 2, 2011, 6:33 a.m.
On Jan 31, 2011, Richard Guenther <richard.guenther@gmail.com> wrote:

>> 1st: fix duplicate LOCAL_DECLs for inlined result decls

> Ok (I think the assert is superfluous, a lot of things would already be
> broken if that didn't hold ...)

Ok, assert removed, then installed a separate patch when I realized that
the removal of the assert made the caller variable unused.

> +/* Clear VAR's used flag, so that it may be discarded during rtl
> +   expansion.  */
> +
> +static inline void
> +clear_is_used (tree var)

> I think this should just say "Clear VAR's used flag.".

Adjusted.  I also adjusted the last remaining direct use of the used
field from a dumping function.

Here are the patches I installed so far.  I got my build machines back,
and I've nearly finished the testing of the other patches in my queue,
so I'll try copying var_ann->used when duplicating variables.

Patch

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	PR debug/47106
	PR debug/47402
	* tree-flow-inline.h (clear_is_used, is_used_p): New.
	* cfgexpand.c (account_used_vars_for_block): Use them.
	* tree-nrv.c (tree_nrv): Likewise.
	* tree-ssa-live.c (remove_unused_scope_block_p): Likewise.
	(dump_scope_block): Likewise.
	(remove_unused_locals): Likewise.

Index: gcc/cfgexpand.c
===================================================================
--- gcc/cfgexpand.c.orig	2011-01-31 09:04:28.000000000 -0200
+++ gcc/cfgexpand.c	2011-02-02 03:45:49.306492981 -0200
@@ -1325,7 +1325,7 @@  account_used_vars_for_block (tree block,
 
   /* Expand all variables at this level.  */
   for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t))
-    if (var_ann (t) && var_ann (t)->used)
+    if (var_ann (t) && is_used_p (t))
       size += expand_one_var (t, toplevel, false);
 
   /* Expand all variables at containing levels.  */
Index: gcc/tree-flow-inline.h
===================================================================
--- gcc/tree-flow-inline.h.orig	2011-01-31 09:04:28.000000000 -0200
+++ gcc/tree-flow-inline.h	2011-02-02 03:59:32.083138770 -0200
@@ -569,9 +569,26 @@  static inline void
 set_is_used (tree var)
 {
   var_ann_t ann = get_var_ann (var);
-  ann->used = 1;
+  ann->used = true;
 }
 
+/* Clear VAR's used flag.  */
+
+static inline void
+clear_is_used (tree var)
+{
+  var_ann_t ann = var_ann (var);
+  ann->used = false;
+}
+
+/* Return true if VAR is marked as used.  */
+
+static inline bool
+is_used_p (tree var)
+{
+  var_ann_t ann = var_ann (var);
+  return ann->used;
+}
 
 /* Return true if T (assumed to be a DECL) is a global variable.
    A variable is considered global if its storage is not automatic.  */
Index: gcc/tree-nrv.c
===================================================================
--- gcc/tree-nrv.c.orig	2011-01-31 09:04:28.000000000 -0200
+++ gcc/tree-nrv.c	2011-02-02 03:45:49.314492733 -0200
@@ -263,7 +263,7 @@  tree_nrv (void)
   DECL_HAS_VALUE_EXPR_P (found) = 1;
 
   /* FOUND is no longer used.  Ensure it gets removed.  */
-  var_ann (found)->used = 0;
+  clear_is_used (found);
   return 0;
 }
 
Index: gcc/tree-ssa-live.c
===================================================================
--- gcc/tree-ssa-live.c.orig	2011-01-31 09:04:28.000000000 -0200
+++ gcc/tree-ssa-live.c	2011-02-02 04:10:16.132912744 -0200
@@ -468,7 +468,7 @@  remove_unused_scope_block_p (tree scope)
 	 Exception are the scope blocks not containing any instructions
 	 at all so user can't get into the scopes at first place.  */
       else if ((ann = var_ann (*t)) != NULL
-		&& ann->used)
+	       && 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
@@ -633,13 +633,11 @@  dump_scope_block (FILE *file, int indent
   for (var = BLOCK_VARS (scope); var; var = DECL_CHAIN (var))
     {
       bool used = false;
-      var_ann_t ann;
 
-      if ((ann = var_ann (var))
-	  && ann->used)
-	used = true;
+      if (var_ann (var))
+	used = is_used_p (var);
 
-      fprintf (file, "%*s",indent, "");
+      fprintf (file, "%*s", indent, "");
       print_generic_decl (file, var, flags);
       fprintf (file, "%s\n", used ? "" : " (unused)");
     }
@@ -708,7 +706,7 @@  remove_unused_locals (void)
 
   /* Assume all locals are unused.  */
   FOR_EACH_REFERENCED_VAR (t, rvi)
-    var_ann (t)->used = false;
+    clear_is_used (t);
 
   /* Walk the CFG marking all referenced symbols.  */
   FOR_EACH_BB (bb)
@@ -769,7 +767,7 @@  remove_unused_locals (void)
       var = VEC_index (tree, cfun->local_decls, srcidx);
       if (TREE_CODE (var) != FUNCTION_DECL
 	  && (!(ann = var_ann (var))
-	      || !ann->used))
+	      || !is_used_p (var)))
 	{
 	  if (is_global_var (var))
 	    {
@@ -801,7 +799,7 @@  remove_unused_locals (void)
 	if (TREE_CODE (var) == VAR_DECL
 	    && is_global_var (var)
 	    && (ann = var_ann (var)) != NULL
-	    && ann->used)
+	    && is_used_p (var))
 	  mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
 
       num = VEC_length (tree, cfun->local_decls);
@@ -827,8 +825,8 @@  remove_unused_locals (void)
     if (!is_global_var (t)
 	&& TREE_CODE (t) != PARM_DECL
 	&& TREE_CODE (t) != RESULT_DECL
-	&& !(ann = var_ann (t))->used
-	&& !ann->is_heapvar)
+	&& !is_used_p (t)
+	&& !var_ann (t)->is_heapvar)
       remove_referenced_var (t);
   remove_unused_scope_block_p (DECL_INITIAL (current_function_decl));
   if (dump_file && (dump_flags & TDF_DETAILS))