Georg-Johann Lay wrote:
> This patch adds memory barriers to
> 
> __builtin_avr_nop
> __builtin_avr_sei
> __builtin_avr_cli
> __builtin_avr_wdr
> __builtin_avr_sleep
> __builtin_avr_delay_cycles
> 
> so that their code cannot be dragged over memory accesses.
> 
> Ok for trunk?
> 
>       PR target/52496
>       * config/avr/avr.c (avr_mem_clobber): New static function.
>       (avr_expand_delay_cycles): Add memory clobber operand to
>       delay_cycles_1, delay_cycles_2, delay_cycles_3, delay_cycles_4.
>       * config/avr/avr.md (unspec): Add UNSPEC_MEMORY_BARRIER.
>       (enable_interrupt, disable_interrupt): New expander.
>       (nopv, sleep, wdr): New expanders.
>       (delay_cycles_1): Add memory clobber.
>       (delay_cycles_2): Add memory clobber.
>       (delay_cycles_3): Add memory clobber.
>       (delay_cycles_4): Add memory clobber.
>       (cli_sei): New insn from former "enable_interrupt",
>       "disable_interrupt" with memory clobber.
>       (*wdt): New insn from former "wdt" with memory clobber.
>       (*sleep): New insn from former "sleep" with memory clobber.

http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=185692

Applied this addendum that uses unspec_volatile instead of unspec in order to
be as conservative as possible.

Johann

        PR target/52496
        * config/avr/avr.md (unspec): Remove UNSPEC_MEMORY_BARRIER.
        (unspecv): Add UNSPECV_MEMORY_BARRIER.
        (cli_sei): Use unspec_volatile instead of unspec for memory barrier.
        (delay_cycles_1, delay_cycles_2): Ditto.
        (delay_cycles_3, delay_cycles_4): Ditto.
        (nopv, *nopv): Ditto.
        (sleep, *sleep): Ditto.
        (wdr, *wdr): Ditto.


Reply via email to