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



             Bug #: 55747

           Summary: Extra registers are saved in functions that only call

                    noreturn functions

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: enhancement

          Priority: P3

         Component: rtl-optimization

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: josh.m.con...@gmail.com





On architectures such as ARM, where a link register is used to save the return

address, this value does not need to be saved in a function that only calls

noreturn functions.



For example, if I build the following source:



  __attribute__((noreturn))

  extern void bar (void);



  int x;



  void foo (void)

  {

    if (x)

      bar ();

  }



Using the options "-O2", the link register is saved:



  stmfd   sp!, {r3, lr}

  ...

  ldmeqfd sp!, {r3, pc}



However, this is unnecessary since the only way the link register cannot be

corrupted since any calls to "bar" will not return.



Note that I am not filing this as an ARM target bug since the issue appears to

be a general problem related to dataflow analysis not tracking the difference

between calls to normal functions and calls to noreturn functions.  At any

rate, I see a similar problem in our custom target as well.

Reply via email to