On Tue, Sep 2, 2025 at 5:32 AM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Tue, Sep 2, 2025 at 6:29 AM Andrew Pinski
> <andrew.pin...@oss.qualcomm.com> wrote:
> >
> > I noticed that when looking into g++.dg/tree-ssa/vector-compare-1.C
> > failure on arm, the wrong alignment was being used for the load.
> > There needs to be an unaligned type here to get the correct alignment.
> >
> > NOTE this means the code in strlen is also wrong but that is on its way
> > out so I am not sure if we should update it or not to backport to the
> > release branches; there could be wrong code happening too.
>
> Please.

Attached is the patch which adds the fix to strlen which I committed
and will be backporting in the next couple of days to GCC 15, 14 and
13.

Thanks,
Andrew

>
> > Bootstrapped and tested on x86_64-linux-gnu.
>
> OK.
>
> Thanks,
> Richard.
>
> > gcc/ChangeLog:
> >
> >         * tree-ssa-forwprop.cc (simplify_builtin_memcmp): Create
> >         unaligned types if the alignment of the pointers is less
> >         than the alignment of the new type.
> >
> > Signed-off-by: Andrew Pinski <andrew.pin...@oss.qualcomm.com>
> > ---
> >  gcc/tree-ssa-forwprop.cc | 12 ++++++++++--
> >  1 file changed, 10 insertions(+), 2 deletions(-)
> >
> > diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> > index 9ce04d24122..d356770261a 100644
> > --- a/gcc/tree-ssa-forwprop.cc
> > +++ b/gcc/tree-ssa-forwprop.cc
> > @@ -1642,8 +1642,16 @@ simplify_builtin_memcmp (gimple_stmt_iterator 
> > *gsi_p, gcall *stmt)
> >           tree ptrtype = build_pointer_type_for_mode (char_type_node,
> >                                                       ptr_mode, true);
> >           off = build_int_cst (ptrtype, 0);
> > -         arg1 = build2_loc (loc, MEM_REF, type, arg1, off);
> > -         arg2 = build2_loc (loc, MEM_REF, type, arg2, off);
> > +
> > +         /* Create unaligned types if needed. */
> > +         tree type1 = type, type2 = type;
> > +         if (TYPE_ALIGN (type1) > align1)
> > +           type1 = build_aligned_type (type1, align1);
> > +         if (TYPE_ALIGN (type2) > align2)
> > +           type2 = build_aligned_type (type2, align2);
> > +
> > +         arg1 = build2_loc (loc, MEM_REF, type1, arg1, off);
> > +         arg2 = build2_loc (loc, MEM_REF, type2, arg2, off);
> >           tree tem1 = fold_const_aggregate_ref (arg1);
> >           if (tem1)
> >             arg1 = tem1;
> > --
> > 2.43.0
> >

Attachment: 0001-strlen-Fixup-load-alignment-for-memcmp.patch
Description: Binary data

Reply via email to