I am compiling for an avr target and sharing variables with interrupts. To safely update the variables I am disabling interrupts but I want the interrupts to be disabled for the shortest possible period of time.
The compiler shifts the instructions around slightly when optimizing, this has the effect of increasing the time that interrupts are disabled. I've attached a trivial example which demonstrates this however more complicated code has a similar result with a varying number of instructions moved into the disabled section. I'm attaching a trivial example with .c, .i (typedefs trimmed) and .s files. The gcc used is from the Debian gcc-avr package version 4.2.2-1 Compilation line was: avr-gcc -mmcu=attiny13 -Wall -Os -fsigned-char -S -c -o interrupt_disable_bug.s interrupt_disable_bug.c -- Summary: AVR optimiser does not keep interrupt disabled blocks small Product: gcc Version: 4.2.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: gcc-david at tulloh dot id dot au GCC target triplet: AVR http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34736