gcc: AArch64 - Fix strict-align cpymem/setmem

The cpymemdi/setmemdi implementation doesn't fully support strict alignment.
Block the expansion if the alignment is less than 16 with STRICT_ALIGNMENT.
Clean up the condition when to use MOPS. (PR103100)

The original patch for GCC 12 removed MOPS & SIMD conditionals for setmem and
cpymem expansions in aarch64.md file. However, this version for GCC 11 does not
backport the SIMD & MOPS-related changes and retains the conditions in aarch64.md
file to preserve correctness and compatibility with the GCC 11 backend.

All changes and outputs have been verified by the author.

Upstream-Status: Backport [https://gcc.gnu.org/cgit/gcc/commit/?id=b9d16d8361a9e3a82a2f21e759e760d235d43322]

(From OE-Core rev: a99a65632116955dc69809a14bf536b22582de72)

Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@windriver.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
Sundeep KOKKONDA
2025-05-22 21:49:35 -07:00
committed by Steve Sakoman
parent aee1d45a83
commit c6cd61f1a2
2 changed files with 46 additions and 0 deletions

View File

@@ -60,6 +60,7 @@ SRC_URI = "\
file://0029-Fix-install-path-of-linux64.h.patch \
file://0030-rust-recursion-limit.patch \
file://0031-gcc-sanitizers-fix.patch \
file://0032-gcc-aarch64-fix-strict-align-cpymem-setmem.patch \
file://0001-CVE-2021-42574.patch \
file://0002-CVE-2021-42574.patch \
file://0003-CVE-2021-42574.patch \

View File

@@ -0,0 +1,45 @@
gcc: AArch64 - Fix strict-align cpymem/setmem
The cpymemdi/setmemdi implementation doesn't fully support strict alignment.
Block the expansion if the alignment is less than 16 with STRICT_ALIGNMENT.
Clean up the condition when to use MOPS.
Upstream-Status: Backport [https://gcc.gnu.org/cgit/gcc/commit/?id=b9d16d8361a9e3a82a2f21e759e760d235d43322]
Signed-off-by: Wilco Dijkstra <wilco.dijkstra@arm.com>
Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@windriver.com>
---
--- a/gcc/config/aarch64/aarch64.c 2025-05-08 20:40:10.969865898 -0700
+++ b/gcc/config/aarch64/aarch64.c 2025-05-13 23:11:07.006796627 -0700
@@ -23621,14 +23621,15 @@
int mode_bits;
rtx dst = operands[0];
rtx src = operands[1];
+ unsigned align = UINTVAL (operands[3]);
rtx base;
machine_mode cur_mode = BLKmode;
/* Only expand fixed-size copies. */
- if (!CONST_INT_P (operands[2]))
+ if (!CONST_INT_P (operands[2]) || (STRICT_ALIGNMENT && align < 16))
return false;
- unsigned HOST_WIDE_INT size = INTVAL (operands[2]);
+ unsigned HOST_WIDE_INT size = UINTVAL (operands[2]);
/* Inline up to 256 bytes when optimizing for speed. */
unsigned HOST_WIDE_INT max_copy_size = 256;
@@ -23750,11 +23751,12 @@
unsigned HOST_WIDE_INT len;
rtx dst = operands[0];
rtx val = operands[2], src;
+ unsigned align = UINTVAL (operands[3]);
rtx base;
machine_mode cur_mode = BLKmode, next_mode;
/* We can't do anything smart if the amount to copy is not constant. */
- if (!CONST_INT_P (operands[1]))
+ if (!CONST_INT_P (operands[1]) || (STRICT_ALIGNMENT && align < 16))
return false;
bool speed_p = !optimize_function_for_size_p (cfun);