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.