https://gcc.gnu.org/g:f656c3987286673082dfa3a98b729a41d890b496
commit r14-12746-gf656c3987286673082dfa3a98b729a41d890b496 Author: Jakub Jelinek <[email protected]> Date: Tue Jul 14 10:37:03 2026 +0200 cfgexpand: Align the whole asan var block to crtl->stack_alignment_needed [PR120201] If crtl->stack_alignment_needed / BITS_PER_UNIT is larger than data.asan_alignb, we can end up with misaligned stack for further allocations (e.g. to spill SSA_NAMEs with vector modes and large alignment). This patch increments data.asan_alignb in that case. 2026-07-14 Jakub Jelinek <[email protected]> H.J. Lu <[email protected]> PR tree-optimization/120201 * cfgexpand.cc (expand_used_vars): Set data.asan_alignb to maximum of itself and crtl->stack_alignment_needed / BITS_PER_UNIT. * g++.dg/asan/pr120201-1.C: New test. Signed-off-by: H.J. Lu <[email protected]> (cherry picked from commit 0f485cf70171a41ea39deec0a8b65aad0b9d2a9b) Diff: --- gcc/cfgexpand.cc | 3 +++ gcc/testsuite/g++.dg/asan/pr120201-1.C | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index 2e09d11e994a..d495dc8f55e5 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -2389,6 +2389,9 @@ expand_used_vars (bitmap forced_stack_vars) HOST_WIDE_INT offset, sz, redzonesz; redzonesz = ASAN_RED_ZONE_SIZE; sz = data.asan_vec[0] - prev_offset; + data.asan_alignb = MAX (data.asan_alignb, + crtl->stack_alignment_needed + / BITS_PER_UNIT); if (data.asan_alignb > ASAN_RED_ZONE_SIZE && data.asan_alignb <= 4096 && sz + ASAN_RED_ZONE_SIZE >= (int) data.asan_alignb) diff --git a/gcc/testsuite/g++.dg/asan/pr120201-1.C b/gcc/testsuite/g++.dg/asan/pr120201-1.C new file mode 100644 index 000000000000..7a1a748f014d --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/pr120201-1.C @@ -0,0 +1,42 @@ +// { dg-do run } +// { dg-options "-O3 -std=c++23 -fsanitize=address" } + +using size_t = decltype (sizeof 0); + +float* shaderLightData; + +using ShaderShadowTransform = float[4z * 4z * 6z]; +using Transform = float[4 * 4]; + +__attribute__ ((noipa)) +#if defined(__i386__) || defined(__x86_64__) +__attribute__ ((target ("arch=x86-64-v4"))) +#endif +static void +do_test (void) +{ + int lightCount = 3; + ShaderShadowTransform* shaderShadowData = new ShaderShadowTransform[lightCount]; + for (int index = 0; index < lightCount; index++) + { + Transform transforms[6]; + + const size_t matSize = 4z * 4z; + float* transformBlockStart = shaderShadowData[index]; + for (int face = 0; face < 6; face++) + __builtin_memcpy(transformBlockStart + (matSize * face), + &transforms[face][0], matSize * sizeof(float)); + } + + delete [] shaderShadowData; +} + +int +main (void) +{ +#if defined(__i386__) || defined(__x86_64__) + if (__builtin_cpu_supports ("x86-64-v4")) +#endif + do_test (); + return 0; +}
