diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc9ed6b09fa47479dcc173ac5b5444ab079a2967..3eea0bcd9d6a67f597a015f1b00229a867c6325c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,21 @@
+2011-02-15  Alexandre Oliva  <aoliva@redhat.com>
+
+	PR debug/47106
+	PR debug/47402
+	* tree-flow.h (FOR_EACH_REFERENCED_VAR): Add FN argument.
+	Adjust all users.  Pass FN to...
+	* tree-flow-inline.h (first_referenced_var): ... this.  Add
+	fn argument.
+	* ipa-struct-reorg.c: Adjust.
+	* tree-dfa.c: Adjust.
+	* tree-into-ssa.c: Adjust.
+	* tree-sra.c: Adjust.
+	* tree-ssa-alias.c: Adjust.
+	* tree-ssa-live.c: Adjust.
+	* tree-ssa.c: Adjust.
+	* tree-ssanames.c: Adjust.
+	* tree-tailcall.c: Adjust.
+
 2011-02-15  Alexandre Oliva  <aoliva@redhat.com>
 
 	PR debug/47106
diff --git a/gcc/ipa-struct-reorg.c b/gcc/ipa-struct-reorg.c
index ae18da2cda299eea9244f30e2aa40bb46066d864..7ab321eee47e26e81087fd385f6b7effdc7d257a 100644
--- a/gcc/ipa-struct-reorg.c
+++ b/gcc/ipa-struct-reorg.c
@@ -2712,7 +2712,7 @@ create_new_local_vars (void)
   new_local_vars = htab_create (num_referenced_vars,
 				new_var_hash, new_var_eq, NULL);
 
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (!is_global_var (var))
 	create_new_var (var, new_local_vars);
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index f37c30fc2c1d2fe6da855b4f8f14b9321c5edc3c..6490c5e87125c3c22b676490ab5428b27d4d433a 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -218,7 +218,7 @@ dump_referenced_vars (FILE *file)
   fprintf (file, "\nReferenced variables in %s: %u\n\n",
 	   get_name (current_function_decl), (unsigned) num_referenced_vars);
 
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       fprintf (file, "Variable: ");
       dump_variable (file, var);
@@ -400,7 +400,7 @@ collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
   memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
 
   /* Count all the variable annotations.  */
-  FOR_EACH_REFERENCED_VAR (var, vi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, vi)
     if (var_ann (var))
       dfa_stats_p->num_var_anns++;
 
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index 538d6fe678fb69610551cc854fb12ee2989fb8d5..86566101e394467eaf005408eb99b05bc3a00142 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -112,10 +112,10 @@ referenced_var (unsigned int uid)
    referenced_vars hashtable, and return that variable.  */
 
 static inline tree
-first_referenced_var (referenced_var_iterator *iter)
+first_referenced_var (struct function *fn, referenced_var_iterator *iter)
 {
   return (tree) first_htab_element (&iter->hti,
-				    gimple_referenced_vars (cfun));
+				    gimple_referenced_vars (fn));
 }
 
 /* Return true if we have hit the end of the referenced variables ITER is
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index e1700375cce124c42d7a9c83e7de40bf0c89f859..14c8827d1c5d0b8cbdd13a589003b90415dc354f 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -314,9 +314,9 @@ typedef struct
    to the hashtable while using this macro.  Doing so may cause it to behave
    erratically.  */
 
-#define FOR_EACH_REFERENCED_VAR(VAR, ITER) \
-  for ((VAR) = first_referenced_var (&(ITER)); \
-       !end_referenced_vars_p (&(ITER)); \
+#define FOR_EACH_REFERENCED_VAR(FN, VAR, ITER)		\
+  for ((VAR) = first_referenced_var ((FN), &(ITER));	\
+       !end_referenced_vars_p (&(ITER));		\
        (VAR) = next_referenced_var (&(ITER)))
 
 extern tree referenced_var_lookup (struct function *, unsigned int);
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 5f6ea19fc7c9500b47f3a52b8859937dc04dde8c..74386e44411c5a74f13e037b41db50bc4503d1d1 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -1156,7 +1156,7 @@ insert_phi_nodes (bitmap_head *dfs)
      differences but no UID ordering differences.  */
 
   vars = BITMAP_ALLOC (NULL);
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       struct def_blocks_d *def_map;
 
@@ -1573,7 +1573,7 @@ dump_currdefs (FILE *file)
   tree var;
 
   fprintf (file, "\n\nCurrent reaching definitions\n\n");
-  FOR_EACH_REFERENCED_VAR (var, i)
+  FOR_EACH_REFERENCED_VAR (cfun, var, i)
     if (SYMS_TO_RENAME (cfun) == NULL
 	|| bitmap_bit_p (SYMS_TO_RENAME (cfun), DECL_UID (var)))
       {
@@ -2313,7 +2313,7 @@ init_ssa_renamer (void)
   def_blocks = htab_create (num_referenced_vars, def_blocks_hash,
                             def_blocks_eq, def_blocks_free);
 
-  FOR_EACH_REFERENCED_VAR(var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     set_current_def (var, NULL_TREE);
 }
 
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 27cb303339cc80f388512ba697595cc0619b2d2e..8ed8771c8069684d2fa78b23269cbc3655013ea3 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1540,7 +1540,7 @@ find_var_candidates (void)
   referenced_var_iterator rvi;
   bool ret = false;
 
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (TREE_CODE (var) != VAR_DECL && TREE_CODE (var) != PARM_DECL)
         continue;
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 78275dec857428c8abc53a49ff7b0f7672ebdfdf..68321d29e2492c7777e16fe60623a8db86106808 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -364,7 +364,7 @@ dump_alias_info (FILE *file)
 
   fprintf (file, "Aliased symbols\n\n");
 
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (may_be_aliased (var))
 	dump_variable (file, var);
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index d917bb99a832dacf6ab590aaec5ca619f2503497..0441df67b64e4ae2f42e98854700d9eb6de92057 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -705,7 +705,7 @@ remove_unused_locals (void)
   mark_scope_block_unused (DECL_INITIAL (current_function_decl));
 
   /* Assume all locals are unused.  */
-  FOR_EACH_REFERENCED_VAR (t, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
     clear_is_used (t);
 
   /* Walk the CFG marking all referenced symbols.  */
@@ -821,7 +821,7 @@ remove_unused_locals (void)
     }
 
   /* Remove unused variables from REFERENCED_VARs.  */
-  FOR_EACH_REFERENCED_VAR (t, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
     if (!is_global_var (t)
 	&& TREE_CODE (t) != PARM_DECL
 	&& TREE_CODE (t) != RESULT_DECL
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index a787f710360c721677ebfada993ebedcee50af7f..5c9e0d88bf2ed0ef33f25c2d072572313ff3d9b1 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1157,7 +1157,7 @@ delete_tree_ssa (void)
   tree var;
 
   /* Remove annotations from every referenced local variable.  */
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (is_global_var (var))
 	continue;
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index cf67f6ce7c8ad149ec5798447dfd839e7d1e166a..c76dba5ea449d14b70e563b63f1b938ba06dc633 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -340,7 +340,7 @@ release_dead_ssa_names (void)
 
   /* Current defs point to various dead SSA names that in turn point to
      eventually dead variables so a bunch of memory is held live.  */
-  FOR_EACH_REFERENCED_VAR (t, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
     set_current_def (t, NULL);
   /* Now release the freelist.  */
   for (t = FREE_SSANAMES (cfun); t; t = next)
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index a9bf62835c7c0761fde89a3b138214ace89b8905..85aa82bc8555d80bb839c8adcabf7383a6852a52 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -481,7 +481,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
 
   /* Make sure the tail invocation of this function does not refer
      to local variables.  */
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (TREE_CODE (var) != PARM_DECL
 	  && auto_var_in_fn_p (var, cfun->decl)
@@ -889,7 +889,7 @@ add_virtual_phis (void)
      this, we cannot do much better than to rebuild the ssa form for
      possibly affected virtual ssa names from scratch.  */
 
-  FOR_EACH_REFERENCED_VAR (var, rvi)
+  FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
     {
       if (!is_gimple_reg (var) && gimple_default_def (cfun, var) != NULL_TREE)
 	mark_sym_for_renaming (var);