Function like this:

extern int bar(void);
int foo(int in)
{
 in += bar();
 in += bar(); 
 in += bar(); 
 in += bar(); 
 return in;
}

Result in putting the output of bar on stack, and adding the result just before
returning. It continues on until it about 16 iteration. Meaning useless heavy
stack usage and for some targets much code.

The general assembler will look like this:

push stack
call bar
put result on stack
call bar
put result on stack
call bar
put result on stack
call bar
add to in
add stack to in
add stack to in
add stack to in
pop stack
return 

This behaviour is seen on recent version for arm (4.3.3), x86 (4.3.3) and avr
(4.3.2).

Interresting is that providing the 'register' keyword on input for -00 'solves'
the problem.

It seems that GCC delays the add operations until returning, however delaying
beyond a function call is normally pointless and more expensive in terms of
code size and cycles.

See attached file for a test case with for unroll-loops and normal code.


-- 
           Summary: Delaying operation to end of function causes high stack
                    usage
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: wvangulik at xs4all dot nl
  GCC host triplet: linux-x86
GCC target triplet: multiple (at least: arm, x86, avr)


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39621

Reply via email to