Interesting, I just read up on it and I didn't know that. Thanks. Is it correct to say though that it is a missing optimization and frame_pointer_needed shouldn't evaluate to true?
On Mon, Nov 18, 2013 at 10:55 AM, Andrew Pinski <pins...@gmail.com> wrote: > On Mon, Nov 18, 2013 at 10:47 AM, Hendrik Greving > <hendrik.greving.in...@gmail.com> wrote: >> What's the difference in the C vs. the C++ spec that makes it a VLA in GNU-C? > > > max in C++ is considered an integer constant expression while in C it > is just an expression. > > Thanks, > Andrew Pinski > >> >> On Fri, Nov 15, 2013 at 10:07 AM, Andrew Pinski <pins...@gmail.com> wrote: >>> On Fri, Nov 15, 2013 at 9:31 AM, Hendrik Greving >>> <hendrik.greving.in...@gmail.com> wrote: >>>> In the below test case, "CASE_A" actually uses a frame pointer, while >>>> !CASE_A doesn't. I can't imagine this is a feature, this is a bug, >>>> isn't it? Is there any reason the compiler couldn't know that >>>> loop_blocks never needs a dynamic stack size? >>> >>> >>> Both a feature and a bug. In the CASE_A case (with GNU C) it is a VLA >>> while in the !CASE_A case (or in either case with C++), it is a normal >>> array definition. The compiler could have converted the VLA to a >>> normal array but does not depending on the size of the array. >>> >>> Thanks, >>> Andrew Pinski >>> >>>> >>>> #include <stdio.h> >>>> #include <stdlib.h> >>>> >>>> #define MY_DEFINE 100 >>>> #define CASE_A 1 >>>> >>>> extern init(int (*a)[]); >>>> >>>> int >>>> foo() >>>> { >>>> #if CASE_A >>>> const int max = MY_DEFINE * 2; >>>> int loop_blocks[max]; >>>> #else >>>> int loop_blocks[MY_DEFINE * 2]; >>>> #endif >>>> init(&loop_blocks); >>>> return loop_blocks[5]; >>>> } >>>> >>>> int >>>> main() >>>> { >>>> int i = foo(); >>>> printf("is is %d\n", i); >>>> } >>>> >>>> Thanks, >>>> Hendrik Greving