------- Comment #13 from ian at airs dot com  2007-06-30 18:08 -------
The problem here is that although the stack pointer is not used in the
function, adjusting it does reserve space on the stack for the local variables
which are used.  The local variables are accessed via the frame pointer with a
negative offset.  Deleting the adjustment of the stack pointer is causing that
the reference to be implicitly invalid.  This test case makes the problem
obvious via an asm which essentially does a function call which the compiler
doesn't know about.  If the asm weren't there, though, there would still be a
difficult to diagnose problem in that an interrupt at the wrong time would
corrupt the value of the local variables.

One possible approach to this is that DF should note that any reference to a
local variable via the frame pointer is implicitly a use of the stack pointer. 
Note that this doesn't necessarily mean a negative offset from the frame
pointer, although it does in this case.  On processors like the Thumb even
local variables are accessed as positive offsets from the frame pointer, and
parameters are accessed by larger positive offsets.  We also need to consider
whether any asm statement is a use of the stack pointer.  It may be that DF
should treat an asm statement however it treats a function call with regard to
uses of the stack pointer.  A non-volatile asm would be a const call, and a
volatile asm would be an ordinary call.  I'm not completely sure about that,
but it seems worth considering. 

A simpler approach would be for DCE to simply not remove adjustments to the
stack pointer.  I believe this would have to be done whether the adjustment was
frame related or not.  I think the fact that the instruction is frame related
is probably a red herring here.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32475

Reply via email to