https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87843
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
I think this is caused by misoptimizing
void **x;
void *info ATTRIBUTE_UNUSED;
{
cselib_val *v = (cselib_val *)*x;
struct elt_loc_list **p = &v->locs;
int had_locs = v->locs != 0;
while (*p)
{
if (references_value_p ((*p)->loc, 1))
unchain_one_elt_loc_list (p);
else
p = &(*p)->next;
}
if (had_locs && v->locs == 0)
{
n_useless_values++;
values_became_useless = 1;
}
return 1;
}
where fre1 after type cleaning concludes that v->locs is unchanged while it is
unchanged in:
static void
unchain_one_elt_loc_list (pl)
struct elt_loc_list **pl;
{
struct elt_loc_list *l = *pl;
*pl = l->next;
l->next = empty_elt_loc_lists;
empty_elt_loc_lists = l;
}
So it seems that in some cases alias analysis gets lost in pointer dereferences
while we are still in early optimization.
Perhaps we want to produce alias sets earlier?
Honza