This is the mail archive of the gcc-bugs@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]

[Bug c/38534] New: gcc 4.2.1 and above: No need to save called-saved registers in 'noreturn' function


/* When a function has been defined using the 'noreturn' attribute,
 * there is no reason to save the callee-saved registers, mainly
 * because the function is not going to return to the caller.
 *
 * This can save a few bytes of code generation for embedded-type
 * applications which may use 'noreturn' functions to restart, for
 * example, by jumping to a different address rather than returning to
 * the caller.
 *
 * gcc information:
 *
 *     Using built-in specs.
 *     Target: x86_64-redhat-linux
 *
 *     Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
 *                      --infodir=/usr/share/info --enable-shared
 *                      --enable-threads=posix --enable-checking=release
 *                      --with-system-zlib --enable-__cxa_atexit
 *                      --disable-libunwind-exceptions
--enable-libgcj-multifile
 *                      --enable-languages=c,c++,objc,obj-c++,java,fortran,ada
 *                      --enable-java-awt=gtk --disable-dssi --enable-plugin
 *                     
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre
 *                      --with-cpu=generic --host=x86_64-redhat-linux
 *     Thread model: posix
 *     gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
 *
 * compilation & disassembly information:
 *
 *   gcc -c -O3 -o noreturn.o noreturn.c
 *   objdump --disassemble --reloc noreturn.o
 *
 *      Notice in the disassembly of 'return_to_caller' that the
 *      registers pushed in the preamble are restored before
 *      returning.  But, in the 'no_return_to_caller', they are not
 *      restored; since they are no restored, there is no reason to
 *      even save them.
 */
#include <stdlib.h>

extern unsigned array[1024][1024][1024];
extern unsigned value(int i, int j, int k);

#define LOOP_BODY                                               \
   do {                                                         \
      unsigned i, j, k;                                         \
      for (i = 1024; i > 0; --i) {                              \
         for (j = 1024; j > 0; --j) {                           \
            for (k = 1024; k > 0; --k) {                        \
               array[i - 1][j - 1][k - 1] = value(i, j, k);     \
            }                                                   \
         }                                                      \
      }                                                         \
   } while (0)

void
return_to_caller(int a, int b, int c, int d)
{
   LOOP_BODY;
}

void __attribute__((noreturn))
no_return_to_caller(int a, int b, int c, int d)
{
   LOOP_BODY;
   while (1);
}


-- 
           Summary: gcc 4.2.1 and above: No need to save called-saved
                    registers in 'noreturn' function
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: thutt at vmware dot com


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


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