Tejas Belagod <tejas.bela...@arm.com> writes:
> Handle variable-sized vectors for BIT_FIELD_REF canonicalization.
>
> gcc/ChangeLog:
>
>       * gimple-fold.cc (maybe_canonicalize_mem_ref_addr): Handle variable
>       sized vector types in BIT_FIELD_REF canonicalization.
>       * tree-cfg.cc (verify_types_in_gimple_reference): Change object-size-
>       checking for BIT_FIELD_REF to error offsets that are known_gt to be
>       outside object-size.  Out-of-range offsets can happen in the case of
>       indices that reference VLA SVE vector elements that may be outside the
>       minimum vector size range and therefore maybe_gt is not appropirate
>       here.
> ---
>  gcc/gimple-fold.cc | 3 ++-
>  gcc/tree-cfg.cc    | 2 +-
>  2 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index c19dac0dbfd..97ac6f5379f 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -6294,7 +6294,8 @@ maybe_canonicalize_mem_ref_addr (tree *t, bool is_debug 
> = false)
>                                        (TYPE_SIZE (TREE_TYPE (*t))));
>                 widest_int ext
>                   = wi::add (idx, wi::to_widest (TYPE_SIZE (TREE_TYPE (*t))));
> -               if (wi::les_p (ext, wi::to_widest (TYPE_SIZE (vtype))))
> +               if (known_le (ext, wi::to_poly_widest (TYPE_SIZE (vtype)))
> +                   || !wi::to_poly_widest (TYPE_SIZE (vtype)).is_constant ())

Did you consider using:

                  if (maybe_le (ext, wi::to_poly_widest (TYPE_SIZE (vtype))))

here, without the is_constant definition?  That seems to match the
tree-cfg.cc code more closely.

Thanks,
Richard


>                   {
>                     *t = build3_loc (EXPR_LOCATION (*t), BIT_FIELD_REF,
>                                      TREE_TYPE (*t),
> diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> index 3eede0d61cd..5a44b89907e 100644
> --- a/gcc/tree-cfg.cc
> +++ b/gcc/tree-cfg.cc
> @@ -3176,7 +3176,7 @@ verify_types_in_gimple_reference (tree expr, bool 
> require_lvalue)
>             return true;
>           }
>         if (!AGGREGATE_TYPE_P (TREE_TYPE (op))
> -           && maybe_gt (size + bitpos,
> +           && known_gt (size + bitpos,
>                          tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (op)))))
>           {
>             error ("position plus size exceeds size of referenced object in "

Reply via email to