The m_ranges[] field in int_range<N> are trees, so they live in GC
space. Since invalid_range is static, it must be marked with GTY
magic. However, calculating invalid_range is not particularly slow,
or on a critical path, so we can just put it in local scope and
recalculate every time.
Tested on x86-64 Linux.
gcc/ChangeLog:
PR tree-optimization/102560
* gimple-ssa-warn-alloca.c (alloca_call_type): Remove static
marker for invalid_range.
gcc/testsuite/ChangeLog:
* g++.dg/Walloca2.C: New test.
&& !r.varying_p ())
{
// The invalid bits are anything outside of [0, MAX_SIZE].
- static int_range<2> invalid_range (build_int_cst (size_type_node, 0),
- build_int_cst (size_type_node,
- max_size),
- VR_ANTI_RANGE);
+ int_range<2> invalid_range (build_int_cst (size_type_node, 0),
+ build_int_cst (size_type_node, max_size),
+ VR_ANTI_RANGE);
r.intersect (invalid_range);
if (r.undefined_p ())
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Walloca-larger-than=4207115063 -Wvla-larger-than=1233877270 -O2 --param ggc-min-heapsize=0 --param ggc-min-expand=0 -w" }
+// { dg-require-effective-target alloca }
+
+int a;
+char *b = static_cast<char *>(__builtin_alloca (a));