aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-dfa.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-11-08 22:35:44 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-11-08 22:35:44 +0000
commit7d32e17a1a2d1fa8b61aa46b98bc2c3c4ea12468 (patch)
tree7af2a0401d9232f0559d57993204c20f466576e1 /gcc/tree-dfa.c
parent35a3be486acc186f21b4f9155b98e1267f921c15 (diff)
downloadgcc-7d32e17a1a2d1fa8b61aa46b98bc2c3c4ea12468.zip
gcc-7d32e17a1a2d1fa8b61aa46b98bc2c3c4ea12468.tar.gz
gcc-7d32e17a1a2d1fa8b61aa46b98bc2c3c4ea12468.tar.bz2
tree-dfa.c (remove_referenced_var): If removing a variable which has subvars...
2007-11-08 Richard Guenther <rguenther@suse.de> * tree-dfa.c (remove_referenced_var): If removing a variable which has subvars, also remove those from the referenced vars. Do not create a variable annotation. From-SVN: r130030
Diffstat (limited to 'gcc/tree-dfa.c')
-rw-r--r--gcc/tree-dfa.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 6ee90d7..4880e83 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -751,10 +751,22 @@ remove_referenced_var (tree var)
struct tree_decl_minimal in;
void **loc;
unsigned int uid = DECL_UID (var);
+ subvar_t sv;
+
+ /* If we remove a var, we should also remove its subvars, as we kill
+ their parent var and its annotation. */
+ if (var_can_have_subvars (var)
+ && (sv = get_subvars_for_var (var)))
+ {
+ unsigned int i;
+ tree subvar;
+ for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
+ remove_referenced_var (subvar);
+ }
clear_call_clobbered (var);
- v_ann = get_var_ann (var);
- ggc_free (v_ann);
+ if ((v_ann = var_ann (var)))
+ ggc_free (v_ann);
var->base.ann = NULL;
gcc_assert (DECL_P (var));
in.uid = uid;