https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107831
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- 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).