re PR c++/27768 (wrong-code with vectors)

PR c++/27768
        * tree-ssa-alias.c (compute_flow_insensitive_aliasing): Add
        may_aliases already in the tag's annotations to the bitmap.

From-SVN: r115062
This commit is contained in:
Jason Merrill 2006-06-28 21:12:20 -04:00 committed by Jason Merrill
parent 8547c7f8c9
commit 9949572916
3 changed files with 68 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2006-06-28 Jason Merrill <jason@redhat.com>
PR c++/27768
* tree-ssa-alias.c (compute_flow_insensitive_aliasing): Add
may_aliases already in the tag's annotations to the bitmap.
2006-06-28 Roger Sayle <roger@eyesopen.com>
* genpreds.c (write_predicate_stmts) <IOR>: Add missing break.

View File

@ -0,0 +1,56 @@
// PR c++/27768
// Alias grouping was losing some may_aliases, causing us to think
// the store to w.p was dead.
// { dg-do run }
// { dg-options "-O2" }
int N = 1;
struct VA
{
int *p, *q, *r;
VA() : p(), q() {}
VA(const VA&) : p(), q() {}
~VA() { if (p) --N; }
};
inline void foo(VA, VA, VA) {}
struct VB
{
VA va;
VB() {}
VB(const VB&)
{
va.p = new int(va.q - va.p);
va.r = va.p + (va.q - va.p);
foo(va, va, va);
}
};
struct VC : VB { char c; };
struct V : VC {};
struct WA
{
struct X {};
X **p, **q, **r;
WA() : p() {}
~WA() { if (p) --N; }
};
struct W : WA {};
int main()
{
{
V v, u(v);
W w;
}
return N;
}

View File

@ -1162,6 +1162,7 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
struct alias_map_d *p_map = ai->pointers[i];
tree tag = var_ann (p_map->var)->symbol_mem_tag;
var_ann_t tag_ann = var_ann (tag);
tree var;
/* Call-clobbering information is not finalized yet at this point. */
if (PTR_IS_REF_ALL (p_map->var))
@ -1170,11 +1171,15 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
p_map->total_alias_vops = 0;
p_map->may_aliases = BITMAP_ALLOC (&alias_obstack);
/* Add any pre-existing may_aliases to the bitmap used to represent
TAG's alias set in case we need to group aliases. */
for (j = 0; VEC_iterate (tree, tag_ann->may_aliases, j, var); ++j)
bitmap_set_bit (p_map->may_aliases, DECL_UID (var));
for (j = 0; j < ai->num_addressable_vars; j++)
{
struct alias_map_d *v_map;
var_ann_t v_ann;
tree var;
bool tag_stored_p, var_stored_p;
v_map = ai->addressable_vars[j];