On Thu, Nov 7, 2024 at 11:13 AM Tejas Belagod <tejas.bela...@arm.com> wrote:
>
> On 11/7/24 2:36 PM, Richard Biener wrote:
> > On Thu, Nov 7, 2024 at 8:25 AM Tejas Belagod <tejas.bela...@arm.com> wrote:
> >>
> >> On 11/6/24 6:02 PM, Richard Biener wrote:
> >>> On Wed, Nov 6, 2024 at 12:49 PM Tejas Belagod <tejas.bela...@arm.com> 
> >>> wrote:
> >>>>
> >>>> Ensure sizeless types don't end up trying to be canonicalised to 
> >>>> BIT_FIELD_REFs.
> >>>
> >>> You mean variable-sized?  But don't we know, when there's a constant
> >>> array index,
> >>> that the size is at least so this indexing is OK?  So what's wrong with a
> >>> fixed position, fixed size BIT_FIELD_REF extraction of a VLA object?
> >>>
> >>> Richard.
> >>>
> >>
> >> Ah! The code and comment/description don't match, sorry. This change
> >> started out as gating out all canonicalizations of VLA vectors when I
> >> had limited understanding of how this worked, but eventually was
> >> simplified to gate in only those offsets that were known_le, but missed
> >> out fixing the comment/description. So, for eg.
> >>
> >> int foo (svint32_t v) { return v[3]; }
> >>
> >> canonicalises to a BIT_FIELD_REF <v, 32, 96>
> >>
> >> but something like:
> >>
> >> int foo (svint32_t v) { return v[4]; }
> >
> > So this is possibly out-of-bounds?
> >
> >> reduces to a VEC_EXTRACT <>
> >
> > But if out-of-bounds a VEC_EXTRACT isn't any better than a BIT_FIELD_REF, 
> > no?
>
> Someone may have code protecting accesses like so:
>
>   /* svcntw () returns num of 32-bit elements in a vec */
>   if (svcntw () >= 8)
>     return v[4];
>
> So I didn't error or warn (-Warray-bounds) for this or for that matter
> make it UB as it will be spurious. So technically, it may not be OOB access.
>
> Therefore BIT_FIELD_REFs are generated for anything within the range of
> a Adv SIMD register and anything beyond is left to be vec_extracted with
> SVE instructions.

You still didn't state the technical reason why BIT_FIELD_REF is worse than
.VEC_EXTRACT (which is introduced quite late only btw).

I'm mostly questioning that we have two different canonicalizations that oddly
depend on the constant index.  I'd rather always go .VEC_EXTRACT or
always BIT_FIELD_REF (prefer that one) instead of having a mix for VLA vectors.

Richard.

>
> Thanks,
> Tejas.
>
>
> >
> >> I'll fix the comment/description.
> >>
> >> Thanks,
> >> Tejas.
> >>
> >>>> gcc/ChangeLog:
> >>>>
> >>>>           * gimple-fold.cc (maybe_canonicalize_mem_ref_addr): Disallow 
> >>>> sizeless
> >>>>           types in BIT_FIELD_REFs.
> >>>> ---
> >>>>    gcc/gimple-fold.cc | 3 ++-
> >>>>    1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> >>>> index c19dac0dbfd..dd45d9f7348 100644
> >>>> --- a/gcc/gimple-fold.cc
> >>>> +++ b/gcc/gimple-fold.cc
> >>>> @@ -6281,6 +6281,7 @@ maybe_canonicalize_mem_ref_addr (tree *t, bool 
> >>>> is_debug = false)
> >>>>          && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*t, 
> >>>> 0), 0))))
> >>>>        {
> >>>>          tree vtype = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*t, 0), 0));
> >>>> +      /* BIT_FIELD_REF can only happen on constant-size vectors.  */
> >>>>          if (VECTOR_TYPE_P (vtype))
> >>>>           {
> >>>>             tree low = array_ref_low_bound (*t);
> >>>> @@ -6294,7 +6295,7 @@ 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))))
> >>>>                       {
> >>>>                         *t = build3_loc (EXPR_LOCATION (*t), 
> >>>> BIT_FIELD_REF,
> >>>>                                          TREE_TYPE (*t),
> >>>> --
> >>>> 2.25.1
> >>>>
> >>
>

Reply via email to