Hi Richard,

This looks good to me. OK for master. Do you have any plans to backport to
10-branch, say?

Thanks

Paul


On Tue, 27 Oct 2020 at 09:28, Richard Biener via Fortran <
fort...@gcc.gnu.org> wrote:

> On Fri, Oct 16, 2020 at 10:47 AM Richard Biener <rguent...@suse.de> wrote:
> >
> > This refactors the array descriptor component access tree building
> > to commonize code into new helpers to provide a single place to
> > fix correctness issues with respect to TBAA.
> >
> > The only interesting part is the gfc_conv_descriptor_data_get change
> > to drop broken special-casing of REFERENCE_TYPE desc which, when hit,
> > would build invalid GENERIC trees, missing an INDIRECT_REF before
> > subsetting the descriptor with a COMPONENT_REF.
> >
> > Tested on x86_64-unknown-linux-gnu, full bootstrap / test running.
> >
> > OK for trunk?
>
> Ping.
>
> > Thanks,
> > Richard.
> >
> > 2020-10-16  Richard Biener  <rguent...@suse.de>
> >
> > gcc/fortran/ChangeLog:
> >         * trans-array.c (gfc_get_descriptor_field): New helper.
> >         (gfc_conv_descriptor_data_get): Use it - drop strange
> >         REFERENCE_TYPE handling and make sure we don't trigger it.
> >         (gfc_conv_descriptor_offset): Use gfc_get_descriptor_field.
> >         (gfc_conv_descriptor_dtype): Likewise.
> >         (gfc_conv_descriptor_span): Likewise.
> >         (gfc_get_descriptor_dimension): Likewise.
> >         (gfc_conv_descriptor_token): Likewise.
> >         (gfc_conv_descriptor_subfield): New helper.
> >         (gfc_conv_descriptor_stride): Use it.
> >         (gfc_conv_descriptor_lbound): Likewise.
> >         (gfc_conv_descriptor_ubound): Likewise.
> > ---
> >  gcc/fortran/trans-array.c | 158 +++++++++++++-------------------------
> >  1 file changed, 52 insertions(+), 106 deletions(-)
> >
> > diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
> > index 998d4d4ed9b..f30a2f75701 100644
> > --- a/gcc/fortran/trans-array.c
> > +++ b/gcc/fortran/trans-array.c
> > @@ -133,28 +133,31 @@ gfc_array_dataptr_type (tree desc)
> >  #define LBOUND_SUBFIELD 1
> >  #define UBOUND_SUBFIELD 2
> >
> > +static tree
> > +gfc_get_descriptor_field (tree desc, unsigned field_idx)
> > +{
> > +  tree type = TREE_TYPE (desc);
> > +  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > +
> > +  tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
> > +  gcc_assert (field != NULL_TREE);
> > +
> > +  return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > +                         desc, field, NULL_TREE);
> > +}
> > +
> >  /* This provides READ-ONLY access to the data field.  The field itself
> >     doesn't have the proper type.  */
> >
> >  tree
> >  gfc_conv_descriptor_data_get (tree desc)
> >  {
> > -  tree field, type, t;
> > -
> > -  type = TREE_TYPE (desc);
> > +  tree type = TREE_TYPE (desc);
> >    if (TREE_CODE (type) == REFERENCE_TYPE)
> > -    type = TREE_TYPE (type);
> > -
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > -
> > -  field = TYPE_FIELDS (type);
> > -  gcc_assert (DATA_FIELD == 0);
> > -
> > -  t = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field), desc,
> > -                      field, NULL_TREE);
> > -  t = fold_convert (GFC_TYPE_ARRAY_DATAPTR_TYPE (type), t);
> > +    gcc_unreachable ();
> >
> > -  return t;
> > +  tree field = gfc_get_descriptor_field (desc, DATA_FIELD);
> > +  return fold_convert (GFC_TYPE_ARRAY_DATAPTR_TYPE (type), field);
> >  }
> >
> >  /* This provides WRITE access to the data field.
> > @@ -204,17 +207,9 @@ gfc_conv_descriptor_data_addr (tree desc)
> >  static tree
> >  gfc_conv_descriptor_offset (tree desc)
> >  {
> > -  tree type;
> > -  tree field;
> > -
> > -  type = TREE_TYPE (desc);
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > -
> > -  field = gfc_advance_chain (TYPE_FIELDS (type), OFFSET_FIELD);
> > -  gcc_assert (field != NULL_TREE && TREE_TYPE (field) ==
> gfc_array_index_type);
> > -
> > -  return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                         desc, field, NULL_TREE);
> > +  tree field = gfc_get_descriptor_field (desc, OFFSET_FIELD);
> > +  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
> > +  return field;
> >  }
> >
> >  tree
> > @@ -235,34 +230,17 @@ gfc_conv_descriptor_offset_set (stmtblock_t
> *block, tree desc,
> >  tree
> >  gfc_conv_descriptor_dtype (tree desc)
> >  {
> > -  tree field;
> > -  tree type;
> > -
> > -  type = TREE_TYPE (desc);
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > -
> > -  field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD);
> > -  gcc_assert (field != NULL_TREE
> > -             && TREE_TYPE (field) == get_dtype_type_node ());
> > -
> > -  return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                         desc, field, NULL_TREE);
> > +  tree field = gfc_get_descriptor_field (desc, DTYPE_FIELD);
> > +  gcc_assert (TREE_TYPE (field) == get_dtype_type_node ());
> > +  return field;
> >  }
> >
> >  static tree
> >  gfc_conv_descriptor_span (tree desc)
> >  {
> > -  tree type;
> > -  tree field;
> > -
> > -  type = TREE_TYPE (desc);
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > -
> > -  field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD);
> > -  gcc_assert (field != NULL_TREE && TREE_TYPE (field) ==
> gfc_array_index_type);
> > -
> > -  return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                         desc, field, NULL_TREE);
> > +  tree field = gfc_get_descriptor_field (desc, SPAN_FIELD);
> > +  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
> > +  return field;
> >  }
> >
> >  tree
> > @@ -328,22 +306,13 @@ gfc_conv_descriptor_attribute (tree desc)
> >                           dtype, tmp, NULL_TREE);
> >  }
> >
> > -
> >  tree
> >  gfc_get_descriptor_dimension (tree desc)
> >  {
> > -  tree type, field;
> > -
> > -  type = TREE_TYPE (desc);
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> > -
> > -  field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD);
> > -  gcc_assert (field != NULL_TREE
> > -         && TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
> > -         && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == RECORD_TYPE);
> > -
> > -  return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                         desc, field, NULL_TREE);
> > +  tree field = gfc_get_descriptor_field (desc, DIMENSION_FIELD);
> > +  gcc_assert (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
> > +             && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) ==
> RECORD_TYPE);
> > +  return field;
> >  }
> >
> >
> > @@ -361,38 +330,31 @@ gfc_conv_descriptor_dimension (tree desc, tree dim)
> >  tree
> >  gfc_conv_descriptor_token (tree desc)
> >  {
> > -  tree type;
> > -  tree field;
> > -
> > -  type = TREE_TYPE (desc);
> > -  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> >    gcc_assert (flag_coarray == GFC_FCOARRAY_LIB);
> > -  field = gfc_advance_chain (TYPE_FIELDS (type), CAF_TOKEN_FIELD);
> > -
> > +  tree field = gfc_get_descriptor_field (desc, CAF_TOKEN_FIELD);
> >    /* Should be a restricted pointer - except in the finalization
> wrapper.  */
> > -  gcc_assert (field != NULL_TREE
> > -             && (TREE_TYPE (field) == prvoid_type_node
> > -                 || TREE_TYPE (field) == pvoid_type_node));
> > +  gcc_assert (TREE_TYPE (field) == prvoid_type_node
> > +             || TREE_TYPE (field) == pvoid_type_node);
> > +  return field;
> > +}
> > +
> > +static tree
> > +gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned field_idx)
> > +{
> > +  tree tmp = gfc_conv_descriptor_dimension (desc, dim);
> > +  tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (tmp)),
> field_idx);
> > +  gcc_assert (field != NULL_TREE);
> >
> >    return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                         desc, field, NULL_TREE);
> > +                         tmp, field, NULL_TREE);
> >  }
> >
> > -
> >  static tree
> >  gfc_conv_descriptor_stride (tree desc, tree dim)
> >  {
> > -  tree tmp;
> > -  tree field;
> > -
> > -  tmp = gfc_conv_descriptor_dimension (desc, dim);
> > -  field = TYPE_FIELDS (TREE_TYPE (tmp));
> > -  field = gfc_advance_chain (field, STRIDE_SUBFIELD);
> > -  gcc_assert (field != NULL_TREE && TREE_TYPE (field) ==
> gfc_array_index_type);
> > -
> > -  tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                        tmp, field, NULL_TREE);
> > -  return tmp;
> > +  tree field = gfc_conv_descriptor_subfield (desc, dim,
> STRIDE_SUBFIELD);
> > +  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
> > +  return field;
> >  }
> >
> >  tree
> > @@ -421,17 +383,9 @@ gfc_conv_descriptor_stride_set (stmtblock_t *block,
> tree desc,
> >  static tree
> >  gfc_conv_descriptor_lbound (tree desc, tree dim)
> >  {
> > -  tree tmp;
> > -  tree field;
> > -
> > -  tmp = gfc_conv_descriptor_dimension (desc, dim);
> > -  field = TYPE_FIELDS (TREE_TYPE (tmp));
> > -  field = gfc_advance_chain (field, LBOUND_SUBFIELD);
> > -  gcc_assert (field != NULL_TREE && TREE_TYPE (field) ==
> gfc_array_index_type);
> > -
> > -  tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                        tmp, field, NULL_TREE);
> > -  return tmp;
> > +  tree field = gfc_conv_descriptor_subfield (desc, dim,
> LBOUND_SUBFIELD);
> > +  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
> > +  return field;
> >  }
> >
> >  tree
> > @@ -451,17 +405,9 @@ gfc_conv_descriptor_lbound_set (stmtblock_t *block,
> tree desc,
> >  static tree
> >  gfc_conv_descriptor_ubound (tree desc, tree dim)
> >  {
> > -  tree tmp;
> > -  tree field;
> > -
> > -  tmp = gfc_conv_descriptor_dimension (desc, dim);
> > -  field = TYPE_FIELDS (TREE_TYPE (tmp));
> > -  field = gfc_advance_chain (field, UBOUND_SUBFIELD);
> > -  gcc_assert (field != NULL_TREE && TREE_TYPE (field) ==
> gfc_array_index_type);
> > -
> > -  tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE
> (field),
> > -                        tmp, field, NULL_TREE);
> > -  return tmp;
> > +  tree field = gfc_conv_descriptor_subfield (desc, dim,
> UBOUND_SUBFIELD);
> > +  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
> > +  return field;
> >  }
> >
> >  tree
> > --
> > 2.26.2
>


-- 
"If you can't explain it simply, you don't understand it well enough" -
Albert Einstein

Reply via email to