Testcase: #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char UART_RxChar; volatile unsigned char UART_ReceivedChar;
SIGNAL(SIG_USART_RECV) { /* Indicate that the UART has received a character */ UART_ReceivedChar = 1; /* Store received character */ UART_RxChar = UDR; } Request: use -frename-registers optimization, enabled on -O3. Result code: .global __vector_13 .type __vector_13, @function __vector_13: .LFB2: .LM1: push __zero_reg__ push r0 in r0,__SREG__ push r0 clr __zero_reg__ push r24 /* prologue: Signal */ /* frame size = 0 */ .LM2: ldi r26,lo8(1) sts UART_ReceivedChar,r26 .LM3: lds r24,198 sts UART_RxChar,r24 /* epilogue start */ .LM4: pop r24 pop r0 out __SREG__,r0 pop r0 pop __zero_reg__ reti R26 register used in ISR but don't saved/restored. To fix bug, need define HARD_REGNO_RENAME_OK macro in config/avr.h Anatoly. -- Summary: avr-gcc use don't saved registers in ISR with -O3 ('- frename-registers' ) optimization Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: aesok at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36424