re PR tree-optimization/21407 (wrong code with downcast in C++)
2005-05-18 Daniel Berlin <dberlin@dberlin.org> Fix PR tree-optimization/21407 * tree-ssa-operands.c (note_addressable): Change COMPONENT_REF handling in response to aliasing discussion. From-SVN: r99896
This commit is contained in:
parent
01063d48ed
commit
23e66a36cb
@ -1,3 +1,11 @@
|
||||
2005-05-18 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
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 <ebotcazou@libertysurf.fr>
|
||||
|
||||
* config/sparc/sol2.h (TARGET_DEFAULT): Add back MASK_APP_REGS.
|
||||
|
8
gcc/testsuite/g++.dg/tree-ssa/pr21407.C
Normal file
8
gcc/testsuite/g++.dg/tree-ssa/pr21407.C
Normal file
@ -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<T*>(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; }
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user