On Tue, Jun 02, 2020 at 04:56:49PM -0400, David Edelsohn wrote:
> > > +  if (TREE_CODE (type) == RECORD_TYPE
> > > +      && rs6000_discover_homogeneous_aggregate (TYPE_MODE (type), type, 
> > > NULL,
> > > +                                             NULL))
> > > +    {
> > > +      tree field_type = TREE_TYPE (first_field (type));
> > > +      if (field_type && TREE_CODE (field_type) == ARRAY_TYPE
> > > +       && TREE_CODE (TREE_TYPE (field_type)) == REAL_TYPE)
> > > +     elt_mode = TYPE_MODE (TREE_TYPE (field_type));
> > > +    }
> >
> > Homogeneous aggregates only exist in the ELFv2 ABI, while the problem
> > here is the SP float things.  You also noticed (elsewhere) that if the
> > struct contains (say) SI, SF, SI, SF, then this does not help.
> >
> > Is there some better condition this could use, and maybe an expansion
> > that works in more cases as well?
> >
> > And, it would be lovely if generic code could expand to something better
> > already (not expand to a block move at all, certainly not for something
> > as tiny as this).
> 
> And please don't refer to homogeneous aggregates outside of ELFv2 ABI
> code because that will miss an optimization or generate incorrect code
> other PowerPC OSes and ABIs, such as AIX.

Yes, rs6000_discover_homogeneous_aggregate always returns false if some
other ABI is in use, which means for this particular code that the
problem isn't solved for those other ABIs at all.


Segher

Reply via email to