https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70676
Bug ID: 70676 Summary: suboptimal code generation on AVR Product: gcc Version: 5.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: night_ghost at ykoctpa dot ru Target Milestone: --- gcc -Os -fno-optimize-sibling-calls don't optimizes out tail recursion: return SPI::transfer(0xff); f54:8f ef ldi r24, 0xFF; 255 f56:0e 94 d9 2e call 0x5db2 ; 0x5db2 <_ZN3SPI8transferEh> } f5a:08 95 ret where it should be ldi r24, 0xFF; 255 jmp 0x5db2 ; 0x5db2 <_ZN3SPI8transferEh> Yes I can remove -fno-optimize-sibling-calls but then size of compiled project will be much more: with: 30566 bytes (93.3% Full) without: 30772 bytes and binary don't fit to flash (30720 is maximum) Reason is that even with -Os optimize-sibling-calls tries to make epilogue for each tail recursion: 2080:<----->92 e0 <-->ldi<--->r25, 0x02<----->; 2 2082:<----->df 91 <-->pop<--->r29 2084:<----->cf 91 <-->pop<--->r28 2086:<----->1f 91 <-->pop<--->r17 2088:<----->0f 91 <-->pop<--->r16 208a:<----->ff 90 <-->pop<--->r15 208c:<----->ef 90 <-->pop<--->r14 208e:<----->bf 90 <-->pop<--->r11 2090:<----->af 90 <-->pop<--->r10 2092:<----->9f 90 <-->pop<--->r9 2094:<----->8f 90 <-->pop<--->r8 2096:<----->0c 94 2a 0f <-->jmp<--->0x1e54<>; 0x1e54 <_ZL12osd_printf_1PKcf> (rjmp here) 209a:<----->df 91 <-->pop<--->r29 209c:<----->cf 91 <-->pop<--->r28 209e:<----->1f 91 <-->pop<--->r17 20a0:<----->0f 91 <-->pop<--->r16 20a2:<----->ff 90 <-->pop<--->r15 20a4:<----->ef 90 <-->pop<--->r14 20a6:<----->bf 90 <-->pop<--->r11 20a8:<----->af 90 <-->pop<--->r10 20aa:<----->9f 90 <-->pop<--->r9 20ac:<----->8f 90 <-->pop<--->r8 20ae:<----->08 95 <-->ret Can GCC in -Os really optimize only size and rollback optimizations if size of "optimized" code is more than size of non-optimized ?