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).