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;
+}

Reply via email to