From 4e20d9c461087c46560b6485b7f4b00e43a07f00 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Fri, 2 Dec 2005 11:56:35 +0000
Subject: [PATCH] tree-cfg.c (mark_used_vars): New function.

2005-12-02  Richard Guenther  <rguenther@suse.de>

	* tree-cfg.c (mark_used_vars): New function.
	(dump_function_to_file): Dump only used VAR_DECLs.

	* gcc.dg/tree-ssa/20031106-6.c: Remove XFAIL.

From-SVN: r107885
---
 gcc/ChangeLog                              |  5 +++
 gcc/testsuite/ChangeLog                    |  4 ++
 gcc/testsuite/gcc.dg/tree-ssa/20031106-6.c |  2 +-
 gcc/tree-cfg.c                             | 49 ++++++++++++++++++++++
 4 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b583ee5f0288..c949c5fa4af8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-12-02  Richard Guenther  <rguenther@suse.de>
+
+	* tree-cfg.c (mark_used_vars): New function.
+	(dump_function_to_file): Dump only used VAR_DECLs.
+
 2005-12-02  Richard Guenther  <rguenther@suse.de>
 
 	* convert.c (convert_to_integer): Fix compare for nonpositive
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b5d0daa2cac5..27a310f604c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-12-02  Richard Guenther  <rguenther@suse.de>
+
+	* gcc.dg/tree-ssa/20031106-6.c: Remove XFAIL.
+
 2005-12-02  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
 	* gcc.dg/lvalue-2.c (f0): Put "error: " marker back.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20031106-6.c b/gcc/testsuite/gcc.dg/tree-ssa/20031106-6.c
index 6d15c7b50530..8708fe12dcf2 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20031106-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20031106-6.c
@@ -25,5 +25,5 @@ struct s foo (struct s r)
 
 /* There should be no references to any of "temp_struct*"
    temporaries.  */
-/* { dg-final { scan-tree-dump-times "temp_struct" 0 "optimized" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "temp_struct" 0 "optimized" } } */
 /* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 13868e99e61e..497715abac00 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -4425,6 +4425,26 @@ tree_duplicate_sese_region (edge entry, edge exit,
 }
 
 
+static tree
+mark_used_vars (tree *tp, int *walk_subtrees, void *used_vars_)
+{
+  bitmap *used_vars = (bitmap *)used_vars_;
+
+  if (walk_subtrees
+      && IS_TYPE_OR_DECL_P (*tp))
+    *walk_subtrees = 0;
+
+  if (!SSA_VAR_P (*tp))
+    return NULL_TREE;
+
+  if (TREE_CODE (*tp) == SSA_NAME)
+    bitmap_set_bit (*used_vars, DECL_UID (SSA_NAME_VAR (*tp)));
+  else
+    bitmap_set_bit (*used_vars, DECL_UID (*tp));
+
+  return NULL_TREE;
+}
+
 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
 
 void
@@ -4459,18 +4479,47 @@ dump_function_to_file (tree fn, FILE *file, int flags)
      BIND_EXPRs, so display them separately.  */
   if (cfun && cfun->decl == fn && cfun->unexpanded_var_list)
     {
+      bitmap used_vars = BITMAP_ALLOC (NULL);
       ignore_topmost_bind = true;
 
+      /* Record vars we'll use dumping the functions tree.  */
+      if (cfun->cfg && basic_block_info)
+	{
+	  FOR_EACH_BB (bb)
+	    {
+	      block_stmt_iterator bsi;
+	      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+	        walk_tree (bsi_stmt_ptr (bsi), mark_used_vars,
+			   &used_vars, NULL);
+	    }
+	  for (vars = cfun->unexpanded_var_list; vars;
+	       vars = TREE_CHAIN (vars))
+	    {
+	      var = TREE_VALUE (vars);
+	      if (TREE_CODE (var) == VAR_DECL
+		  && DECL_INITIAL (var)
+		  && bitmap_bit_p (used_vars, DECL_UID (var)))
+		walk_tree (&DECL_INITIAL (var), mark_used_vars,
+			   &used_vars, NULL);
+	    }
+	}
+
+      /* Dump used vars.  */
       fprintf (file, "{\n");
       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
 	{
 	  var = TREE_VALUE (vars);
+	  if (cfun->cfg && basic_block_info
+	      && !bitmap_bit_p (used_vars, DECL_UID (var)))
+            continue;
 
 	  print_generic_decl (file, var, flags);
 	  fprintf (file, "\n");
 
 	  any_var = true;
 	}
+
+      BITMAP_FREE (used_vars);
     }
 
   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
-- 
GitLab