In following example, call to sbfoo isn't a tail call with -O2. GCC
analyzes local variable may be referenced in sbfoo. Is it a reasonable
analysis? In another word, is it a legal program that bar stores
address of local to a static variable, and then for sbfoo to access
it?

This issue cause a missed tail call opportunity in newlib, thus
unnecessarily increased stack consumption.

a.c:
extern int sbfoo(void);
extern int bar(int *);
int foo()
{
    int local = 0;
    if (bar(&local)) return 0;

    return sbfoo();
}

b.c:
int * g;
int bar(int *c) { g=c; return 0;}

int sbfoo() { return *g; }

Reply via email to