[Bug target/89775] New: Stackpointer save/restore instructions optimized away

krebbel at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Mar 20 14:40:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89775

            Bug ID: 89775
           Summary: Stackpointer save/restore instructions optimized away
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: krebbel at gcc dot gnu.org
  Target Milestone: ---

Defining the stack pointer register as global register triggers wrong code to
be generated thanks to bug in the prologue/epilogue optimization. In this case
the prologue save instruction for the stack pointer is removed while the
epilogue insn is kept. So r15 will be restored from f0 and hence loaded with
garbage.

register a __asm__("15");
b() { char c = 0; }

b:
        ldgr    %f2,%r11
        lay     %r15,-168(%r15)
        lgr     %r11,%r15
        mvi     167(%r11),0
        lr      0,0
        lgr     %r2,%r1
        lgdr    %r11,%f2
        lgdr    %r15,%f0
        br      %r14


Even if a global register is being clobbered in a function we usually do not
save and restore it. However, we still have to do this if it is a special
register. Most of the places in the backend handle this correctly but not the
prologue/epilogue optimization.

A fix is being tested and will be available soon.


More information about the Gcc-bugs mailing list