ARM: code size increase starting from gcc 10

Gabriele Favalessa gabriele@rzerosystems.com
Fri Mar 11 09:57:14 GMT 2022


Hi,

up to gcc 9 this function

#include <stdint.h>
#include <stdbool.h>

bool f() {
    return *(volatile uint32_t*)0x42143fa8 == 0;
}

compiles (arm-none-eabi-gcc -mcpu=cortex-m4 -Os) to:

   0: 4b02       ldr r3, [pc, #8] ; (c <f+0xc>)
   2: 6818       ldr r0, [r3, #0]
   4: fab0 f080 clz r0, r0
   8: 0940       lsrs r0, r0, #5
   a: 4770       bx lr
   c: 42143fa8 .word 0x42143fa8

Starting with gcc 10 it compiles to:

   0: 4b03       ldr r3, [pc, #12] ; (10 <f+0x10>)
   2: f8d3 0fa8 ldr.w r0, [r3, #4008] ; 0xfa8
   6: fab0 f080 clz r0, r0
   a: 0940       lsrs r0, r0, #5
   c: 4770       bx lr
   e: bf00       nop
  10: 42143000 .word 0x42143000

Questions:

1) why newer gcc versions don't generate the smallest possible size in
spite of -Os?
2) is there a way to get the smaller code with newer gcc versions?

Thanks

Gabriele


More information about the Gcc-help mailing list