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. > 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 >