From 23e66a36cb937636be796fce2f7d273209a80a4f Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Wed, 18 May 2005 13:26:20 +0000 Subject: [PATCH] re PR tree-optimization/21407 (wrong code with downcast in C++) 2005-05-18 Daniel Berlin Fix PR tree-optimization/21407 * tree-ssa-operands.c (note_addressable): Change COMPONENT_REF handling in response to aliasing discussion. From-SVN: r99896 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/tree-ssa/pr21407.C | 8 ++++++++ gcc/tree-ssa-operands.c | 27 +++---------------------- 3 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr21407.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a1e6066948..11b9bc3ec4b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-05-18 Daniel Berlin + + Fix PR tree-optimization/21407 + + * tree-ssa-operands.c (note_addressable): Change + COMPONENT_REF handling in response to aliasing + discussion. + 2005-05-18 Eric Botcazou * config/sparc/sol2.h (TARGET_DEFAULT): Add back MASK_APP_REGS. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21407.C b/gcc/testsuite/g++.dg/tree-ssa/pr21407.C new file mode 100644 index 00000000000..561dc707ae6 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21407.C @@ -0,0 +1,8 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +extern "C" void abort(void); +struct T1 {int a, b; virtual void f(){}}; +struct T : T1 { struct T1 w; int b; }; +void foo (struct T1 *p) { struct T *q = dynamic_cast(p); if (q->b != 2) abort (); } +/* We shouldn't kill the store to c.b, because foo uses it. */ +int main () { struct T c; c.b = 2; foo (&c); return 0; } diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index ccc2033dbc0..e43b6030726 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1886,35 +1886,14 @@ add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags) static void note_addressable (tree var, stmt_ann_t s_ann) { - tree ref; subvar_t svars; - HOST_WIDE_INT offset; - HOST_WIDE_INT size; if (!s_ann) return; - /* If this is a COMPONENT_REF, and we know exactly what it touches, we only - take the address of the subvariables it will touch. - Otherwise, we take the address of all the subvariables, plus the real - ones. */ - - if (var && TREE_CODE (var) == COMPONENT_REF - && (ref = okay_component_ref_for_subvars (var, &offset, &size))) - { - subvar_t sv; - svars = get_subvars_for_var (ref); - - if (s_ann->addresses_taken == NULL) - s_ann->addresses_taken = BITMAP_GGC_ALLOC (); - - for (sv = svars; sv; sv = sv->next) - { - if (overlap_subvar (offset, size, sv, NULL)) - bitmap_set_bit (s_ann->addresses_taken, var_ann (sv->var)->uid); - } - return; - } + /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF + as the only thing we take the address of. + See PR 21407 and the ensuing mailing list discussion. */ var = get_base_address (var); if (var && SSA_VAR_P (var)) -- 2.30.2