[PATCH] Fix PR tree-opt/25500 SRA vs struct containing a vector

Richard Guenther richard.guenther@gmail.com
Wed Nov 15 14:12:00 GMT 2006


On 11/15/06, Paolo Bonzini <paolo.bonzini@lu.unisi.ch> wrote:
>
> > if (TREE_CODE (elt->type == RECORD_TYPE)
> >  for (field = TYPE_FIELDS (elt->type); field; field = TREE_CHAIN (field))
> >    if (TREE_CODE (field) == FIELD_DECL
> >        && AGGREGATE_TYPE_P (TREE_TYPE (field)))
> >      {
> >        if (num_aggregate++ > 1)
> >          {
> >            use_block_copy = false;
> >            break;
> >          }
> >       }
>
> I would even suggest moving it to its own function:
>
> bool single_field_in_record_p (tree type)
> {
>    int num_fields, num_aggregates;
>    if (TREE_CODE (type) != RECORD_TYPE)
>      return false;
>
>    for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
>      if (TREE_CODE (field) == FIELD_DECL)
>        {
>          num_fields++;
>          if (AGGREGATE_TYPE_P (TREE_TYPE (field))
>              && !single_field_in_record_p (TREE_TYPE (field)))
>            num_aggregates++;
>          if (num_fields == 2)
>            break;
>        }
>
>    return (num_fields <= 1 && num_aggregates == 0);
> }
>
> ...
>
>    /* For a single scalar element, use element-by-element copy.
>       RTL expansion will figure out how to implement that.  */
>    if (single_field_in_record_p (elt->type))
>      use_block_copy = false;

single_scalar_field_in_record_p probably.  And just return false on the first
aggregate or the second scalar.

Richard.



More information about the Gcc-patches mailing list