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

            Bug ID: 81035
           Summary: noreturn leads to worse code due to lack of sibcall
                    optimization
           Product: gcc
           Version: 6.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fw at gcc dot gnu.org
  Target Milestone: ---
            Target: x86-64

Created attachment 41521
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41521&action=edit
C test case

The attached test case compiles to this code with -O2 -DNORETURN:

0000000000000000 <g>:
   0:   69 d6 46 54 bc 00       imul   $0xbc5446,%esi,%edx
   6:   89 f0                   mov    %esi,%eax
   8:   89 f9                   mov    %edi,%ecx
   a:   0f af c7                imul   %edi,%eax
   d:   29 f1                   sub    %esi,%ecx
   f:   48 83 ec 08             sub    $0x8,%rsp
  13:   01 fa                   add    %edi,%edx
  15:   01 c2                   add    %eax,%edx
  17:   89 f0                   mov    %esi,%eax
  19:   31 f8                   xor    %edi,%eax
  1b:   69 ff a0 a2 14 00       imul   $0x14a2a0,%edi,%edi
  21:   0f af c1                imul   %ecx,%eax
  24:   01 f7                   add    %esi,%edi
  26:   89 d6                   mov    %edx,%esi
  28:   01 c7                   add    %eax,%edi
  2a:   e8 00 00 00 00          callq  2f <g+0x2f>
                        2b: R_X86_64_PC32       f-0x4

And with -O2:

0000000000000000 <g>:
   0:   69 d6 46 54 bc 00       imul   $0xbc5446,%esi,%edx
   6:   89 f0                   mov    %esi,%eax
   8:   89 f9                   mov    %edi,%ecx
   a:   0f af c7                imul   %edi,%eax
   d:   29 f1                   sub    %esi,%ecx
   f:   01 fa                   add    %edi,%edx
  11:   01 c2                   add    %eax,%edx
  13:   89 f0                   mov    %esi,%eax
  15:   31 f8                   xor    %edi,%eax
  17:   69 ff a0 a2 14 00       imul   $0x14a2a0,%edi,%edi
  1d:   0f af c1                imul   %ecx,%eax
  20:   01 f7                   add    %esi,%edi
  22:   89 d6                   mov    %edx,%esi
  24:   01 c7                   add    %eax,%edi
  26:   e9 00 00 00 00          jmpq   2b <g+0x2b>
                        27: R_X86_64_PC32       f-0x4

The -O2 code is shorter because it doesn't need CFI annotations.

It's probably a good idea to inhibit the sibcall optimization for noreturn
functions, to get more accurate stack trace, but that's not what the manual
suggests.

Reply via email to