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:
Daniel Berlin 2005-05-18 13:26:20 +00:00 committed by Daniel Berlin
parent 01063d48ed
commit 23e66a36cb
3 changed files with 19 additions and 24 deletions

View File

@ -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.

View 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; }

View File

@ -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))