[patch,avr] PR70677: Use -fno-caller-saves for avr

Denis Chertykov chertykov@gmail.com
Mon Aug 1 18:31:00 GMT 2016


2016-08-01 15:17 GMT+03:00 Georg-Johann Lay <avr@gjlay.de>:
> Problem with -fcaller-saves is that there are situations where it triggers
> an expensive frame just to store a variable around a function call even
> though there are plenty of call-saved registers.
>
> Example:
>
> typedef __UINT8_TYPE__ uint8_t;
>
> extern uint8_t uart0_getc (void);
>
> void foo (uint8_t *buffer, uint8_t cnt)
> {
>   while (--cnt)
>     {
>       *buffer++ = uart0_getc();
>     }
> }
>
> $ avr-gcc -Os -S -dp -mmcu=atmega8 loop-buf.c
>
> $ avr-gcc gcc -B$TV -Os -c -save-temps -dp -mmcu=atmega8 loop-buf.c &&
> avr-size loop-buf.o
>    text    data     bss     dec     hex filename
>      50       0       0      50      32 loop-buf.o
>
> $ avr-gcc -Os -c -save-temps -dp -mmcu=atmega8 loop-buf.c -fno-caller-saves
> && avr-size loop-buf.o
>    text    data     bss     dec     hex filename
>      32       0       0      32      20 loop-buf.o
>
> I actually came never across a situation where -fcaller-saves improved the
> code performance, hence this patch proposes to switch off -fcaller-saved per
> default.
>
> I can test the patch without regressions, but what bothers me is the
> following lines in ira-color.c:allocno_reload_assign()
>
>       if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0
>           && ira_hard_reg_set_intersection_p (hard_regno, ALLOCNO_MODE (a),
>                                               call_used_reg_set))
>         {
>           ira_assert (flag_caller_saves);
>           caller_save_needed = 1;
>         }
>
> What's not clear is whether this assertion is about the inner working of IRA
> as alloc depends on caller-saves in other places of IRA, or if caller-saves
> is needed because otherwise IRA cannot resolve complicated reload situations
> and hence the proposed change might trigger ICEs for complex programs.
>
> Therefore CCed Vladimir who added the assertion to IRA.
>
> Ok to apply if IRA can do without caller-saves?


Ok.



>
> Johann
>
>
>         PR 70677
>         * common/config/avr/avr-common.c (avr_option_optimization_table)
>         [OPT_LEVELS_ALL]: Turn off -fcaller-saves.
>
>



More information about the Gcc-patches mailing list