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

Reply via email to