]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
forwprop: Fix alignment of types in expansion of memcmp
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 2 Sep 2025 00:47:55 +0000 (17:47 -0700)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 2 Sep 2025 21:06:14 +0000 (14:06 -0700)
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.

Bootstrapped and tested on x86_64-linux-gnu.

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.pinski@oss.qualcomm.com>
gcc/tree-ssa-forwprop.cc

index 32ce750993428e3cd642c2f7b46931664f7bd3eb..df876f7db0a07b5f3b3752d915c47df3aaabb14b 100644 (file)
@@ -1618,8 +1618,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;