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 > >
0001-strlen-Fixup-load-alignment-for-memcmp.patch
Description: Binary data