GCC v10.3 use more stack size than GCC v6.3 for a function

Asked by abousamra

I have an application which I compile it using GCC v6.3, when I compile it with GCC v10.3 I find some functions use more stack size than what GCC v6.3 uses, for example this function uses zero stack for GCC v6.3 but uses 8 bytes for GCC v10.3
int func(int *x, int y, int z, int a)
{
    switch (y) {
        case 1:
            *x = a;
            y = z;
            return y;
    }
    return 77;
}

GCC v6.3 assembly:
   int func(int *x, int y, int z, int a)
{
   switch (y) {
   0: 2901 cmp r1, #1
   2: d102 bne.n a <func+0xa>
       case 1:
           *x = a;
   4: 6003 str r3, [r0, #0]
           y = z;
           return y;
   6: 0010 movs r0, r2
   }

   return 77;
}
   8: 4770 bx lr
   return 77;
   a: 204d movs r0, #77 ; 0x4d
   c: e7fc b.n 8 <func+0x8>

and GCC v10.3 assembly:
int func(int *x, int y, int z, int a)
{
   0: b510 push {r4, lr}
   2: 0004 movs r4, r0
           *x = a;
           y = z;
           return y;
   }

   return 77;
   4: 204d movs r0, #77 ; 0x4d
   switch (y) {
   6: 2901 cmp r1, #1
   8: d101 bne.n e <func+0xe>
           return y;
   a: 0010 movs r0, r2
           *x = a;
   c: 6023 str r3, [r4, #0]
}
   e: bd10 pop {r4, pc}

In GCCv10.3, it push {r4, lr} which is not the case in GCC v6.3

so why does this happen?, it costs the application more stack area over the old compiler, and how to avoid it to get less stack size
also, why it stacked the lr although it's a leaf function?

Notes:

1. This function is a dummy one just to reproduce the issue, so don't consider rewriting it.
2. Building flags are:

arm-none-eabi-gcc -O0 -c -std=c99 -fmessage-length=0 -fomit-frame-pointer -Wno-aggressive-loop-optimizations -Werror -Werror=strict-prototypes -pedantic-errors -Wconversion -pedantic -Wall -Wextra -Wno-unused-function -Wextra -Wpointer-arith -Wsign-compare -Wswitch -Wno-maybe-uninitialized -fno-strict-aliasing -fshort-wchar -mfix-cortex-m3-ldrd -gdwarf-3 -gstrict-dwarf -mabi=aapcs -mthumb -mcpu=Cortex-M0 -g3 -Os -mthumb -ffunction-sections -fdata-sections -MMD -MP -MF"xyz.d" -MT"xyz.o"

Question information

Language:
English Edit question
Status:
Open
For:
GNU Arm Embedded Toolchain Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
john (jkovach) said :
#1

Your command line has both -O0 ans -Os, which is confusing. Apparently, -Os takes precedence. I played around with your code on godbolt:
https://godbolt.org/z/4Y97o8PKK
Indeed, generated code for the function deteriorated somewhere between gcc 7 and gcc 8.

Revision history for this message
abousamra (my-abousamra) said :
#2

Thank you for your comment and trials.
We also noticed the deterioration starting from gcc 9 so I filed a bug linked to this question, were I removed the -O0

Can you help with this problem?

Provide an answer of your own, or ask abousamra for more information if necessary.

To post a message you must log in.