[llvm-dev] Stack pointer updates and hoisting/scheduling vs interrupts

Mikael Holmén via llvm-dev llvm-dev at lists.llvm.org
Mon Oct 16 04:08:58 PDT 2017


Hi llvm-dev,

On a number of occations we've run into different versions of problems 
with our out-of-tree target when it comes to scheduling of stack pointer 
updates vs interrupts at unfortunate places.

Example:

If we allocate an object on the stack with alignment we get something like:

mv sp, r0
sub r0, 2, r0
and r0, 0xfffe, r0
mv r0, sp

and then there might follow an instruction storing to the allocated space:

store 42, r0

and further down a load from it

load r0, r1

The problem we've run into is that the store is scheduled before the 
update of sp:

mv sp, r0
sub r0, 2, r0
and r0, 0xfffe, r0
store 42, r0
mv r0, sp

This works well in most cases, but if we are unfortunate enough to 
trigger an interrupt after the store, but before the sp update, the 
interrupt code might overwrite the stuff that the store just wrote to 
the stack, so when we continue after the interrupt, the last load might 
read rubbish data.

The store is only depending on r0, but we would like to make sure that 
the actual move to sp is carried out before it too.

I've failed to see how other targets solve this kind of problem, I 
suppose we're not alone in facing this issue?

Regards,
Mikael


More information about the llvm-dev mailing list