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