https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107831
--- Comment #7 from Petr Skocik <pskocik at gmail dot com> --- (In reply to Jakub Jelinek from comment #4) > Say for > void bar (char *); > void > foo (int x, int y) > { > __attribute__((assume (x < 64))); > for (int i = 0; i < y; ++i) > bar (__builtin_alloca (x)); > } > all the alloca calls are known to be small, yet they can quickly cross pages. > Similarly: > void > baz (int x) > { > if (x >= 512) __builtin_unreachable (); > char a[x]; > bar (a); > char b[x]; > bar (b); > char c[x]; > bar (c); > char d[x]; > bar (d); > char e[x]; > bar (e); > char f[x]; > bar (f); > char g[x]; > bar (g); > char h[x]; > bar (h); > char i[x]; > bar (i); > char j[x]; > bar (j); > } > All the VLAs here are small, yet together they can cross a page. > So, we'd need to punt for dynamic allocations in loops and for others > estimate > the maximum size of all the allocations together (+ __builtin_alloca > overhead + normal frame size). I think this shouldn't need probes either (unless you tried to coalesce the allocations) on architectures where making a function call touches the stack. Also alloca's of less than or equal to half a page intertwined with writes anywhere to the allocated blocks should be always safe (but I guess I'll just turn stack-clash-protection off in the one file where I'm making such clearly safe dynamic stack allocations).