This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][MSP430] Fix unnecessary saving of all callee-saved regs in an interrupt function that calls another function


On 7/18/19 6:33 AM, Jozef Lawrynowicz wrote:
> The attached patch fixes an issue for msp430 where the logic to decide which
> registers need to be saved in an interrupt function was unnecessarily
> choosing to save all callee-saved registers regardless of whether they were
> used or not. This came at a code size and performance penalty for the 430 ISA,
> and a performance penalty for the 430X ISA.
> 
> Interrupt functions require special conventions for saving registers which
> would normally be caller-saved. Since the interrupt happens without warning,
> registers that would normally have been preserved by the caller of a function
> cannot be preserved when an interrupt is triggered. This means interrupts must
> save and restore the used caller-saved registers, in addition to the used
> callee-saved registers that a regular function would save.
> 
> If an interrupt is not a leaf function, all caller-saved registers must be
> saved/restored in the prologue/epilogue of the interrupt function, since it
> is unknown which of these will be modified in later functions.
> 
> We can rely on the function called by an interrupt to save and restore
> callee-saved registers, so it is unnecessary to save all callee-saved regs
> in the ISR. This is what this patch changes.
> 
> Successfully regtested for msp430-elf on trunk for C/C++.
> 
> Ok for trunk?
> 
> Thanks,
> Jozef
> 
> 
> 0001-MSP430-Fix-unnecessary-saving-of-all-callee-saved-re.patch
> 
> From 1e151dac2be34ae50bea8b4b37bd2d78c5f7ddd6 Mon Sep 17 00:00:00 2001
> From: Jozef Lawrynowicz <jozef.l@mittosystems.com>
> Date: Thu, 18 Jul 2019 09:25:52 +0100
> Subject: [PATCH] MSP430: Fix unnecessary saving of all callee-saved regs in an
>  ISR which calls another function
> 
> gcc/ChangeLog:
> 
> 2019-07-18  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
> 
> 	* config/msp430/msp430.c (msp430_preserve_reg_p): Don't save
> 	callee-saved regs R4->R10 in an interrupt function that calls another
> 	function.
> 
> gcc/testsuite/ChangeLog:
> 
> 2019-07-18  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
> 
> 	* gcc.target/msp430/isr-push-pop-main.c: New test.
> 	* gcc.target/msp430/isr-push-pop-isr-430.c: Likewise.
> 	* gcc.target/msp430/isr-push-pop-isr-430x.c: Likewise.
> 	* gcc.target/msp430/isr-push-pop-leaf-isr-430.c: Likewise.
> 	* gcc.target/msp430/isr-push-pop-leaf-isr-430x.c: Likewise.
OK
jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]