diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2005-03-15 01:26:35 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2005-03-15 01:26:35 +0000 |
commit | 9044951e0d66b05fb6f5b2982a99857d67d7c486 (patch) | |
tree | 5152c9ec2737c779726a8e050244706fcefdc704 /gcc/tree-ssa-operands.c | |
parent | 50668cf626cf30043890f1000f500ce69a54fedb (diff) | |
download | gcc-9044951e0d66b05fb6f5b2982a99857d67d7c486.tar.gz |
re PR tree-optimization/20458 (structure aliasing causes wrong code)
2005-03-14 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/20458
* tree-flow-inline.h (mark_call_clobbered): Don't fiddle
DECL_EXTERNAL on STRUCT_FIELD tags.
(clear_call_clobbered): Ditto.
* tree-ssa-operands.c (note_addressable): Make sure the original
variable doesn't slip into the addressable list if we have
subvars.
* tree-tailcall.c (suitable_for_tail_opt_p): Look at STRUCT_FIELD
tags too.
From-SVN: r96462
Diffstat (limited to 'gcc/tree-ssa-operands.c')
-rw-r--r-- | gcc/tree-ssa-operands.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 2a63d0874a6..a3b44e22ea3 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1729,7 +1729,7 @@ note_addressable (tree var, stmt_ann_t s_ann) if (s_ann->addresses_taken == NULL) s_ann->addresses_taken = BITMAP_GGC_ALLOC (); - bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid); + if (var_can_have_subvars (var) && (svars = get_subvars_for_var (var))) { @@ -1737,6 +1737,8 @@ note_addressable (tree var, stmt_ann_t s_ann) for (sv = svars; sv; sv = sv->next) bitmap_set_bit (s_ann->addresses_taken, var_ann (sv->var)->uid); } + else + bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid); } } |