Commit 23e66a36 by Daniel Berlin Committed by Daniel Berlin

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
parent 01063d48
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> 2005-05-18 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sol2.h (TARGET_DEFAULT): Add back MASK_APP_REGS. * config/sparc/sol2.h (TARGET_DEFAULT): Add back MASK_APP_REGS.
......
/* { 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) ...@@ -1886,35 +1886,14 @@ add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
static void static void
note_addressable (tree var, stmt_ann_t s_ann) note_addressable (tree var, stmt_ann_t s_ann)
{ {
tree ref;
subvar_t svars; subvar_t svars;
HOST_WIDE_INT offset;
HOST_WIDE_INT size;
if (!s_ann) if (!s_ann)
return; return;
/* If this is a COMPONENT_REF, and we know exactly what it touches, we only /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
take the address of the subvariables it will touch. as the only thing we take the address of.
Otherwise, we take the address of all the subvariables, plus the real See PR 21407 and the ensuing mailing list discussion. */
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;
}
var = get_base_address (var); var = get_base_address (var);
if (var && SSA_VAR_P (var)) if (var && SSA_VAR_P (var))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment