]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
strlen: Fixup load alignment for memcmp
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 2 Sep 2025 20:57:26 +0000 (13:57 -0700)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Tue, 2 Sep 2025 21:06:14 +0000 (14:06 -0700)
Like the previous commit but for strlen copy so we can backport
this commit. The loads should have the correct alignment on them
so we need to create newly aligned types when the alignment of the
pointer is less than the alignment of the current type.

Pushed as pre-approved by https://gcc.gnu.org/pipermail/gcc-patches/2025-September/694016.html
after a bootstrap/test on x86_64-linux-gnu.

gcc/ChangeLog:

* tree-ssa-strlen.cc (strlen_pass::handle_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-strlen.cc

index c4d64132e5380253720107fd2b597e7e3dd145aa..3cef33bf5b0795452caaa0c1049c9d6c9bc07bc3 100644 (file)
@@ -4009,8 +4009,16 @@ strlen_pass::handle_builtin_memcmp ()
          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;