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