AIUI, the outcome of PR38964 was that we can't use TBAA for testing an
anti_dependence between a load X and store Y because Y might be defining
a new object in the same space as the object that was being read by X.
But it looks like we still use component-based disambiguation
(nonoverlapping_component_refs_p) in this case. Is it true that
that's also a problem? E.g. for:
struct s { int f; float g; };
struct t { int header; struct s s; };
float foo (struct t *newt, struct s *olds, int x, int y)
{
float ret = olds[x * y].g;
newt->header = 0;
newt->s.f = 1;
newt->s.g = 1.0;
return ret;
}
we can (and on ARM Cortex A8, do) move the store to newt->s.f above
the load from olds[...].g. If we view the assignment to newt
as defining a new object in the same space as the now-defunct olds,
and if x * y happens to be zero, then the accesses might well be
to the same address.
Sorry if this is already a known problem...
Richard