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

Reply via email to