Bug 71587

Summary: missed inlining extern template function
Product: gcc Reporter: programmerjake
Component: c++Assignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED DUPLICATE    
Severity: enhancement CC: webrown.cpp
Priority: P3 Keywords: missed-optimization
Version: 5.3.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2016-06-26 00:00:00

Description programmerjake 2016-06-20 02:03:07 UTC
missed inlining fn2<false>

version: (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204

command: g++-5 -O3 -S -std=c++11 -xc++ -
source:
template <bool V>
void fn2();

extern template void fn2<false>();

void fn3();

void fn()
{
  fn2<false>();
  fn3();
}

template <bool V>
void fn2()
{
}

template void fn2<false>();

It generates
        subq    $8, %rsp
        call    void fn2<false>()
        addq    $8, %rsp
        jmp     fn3()
It should generate
        jmp     fn3()
Comment 1 Andrew Pinski 2016-06-26 06:33:32 UTC
Confirmed.
Comment 2 Andrew Pinski 2024-03-18 07:06:57 UTC
Without:
> template void fn2<false>();


No versions of GCC will inline fn2<false>

Starting in GCC 12, with that line still there, GCC does inline it now.
Comment 3 Andrew Pinski 2024-03-18 07:08:48 UTC
Dup.

*** This bug has been marked as a duplicate of bug 104539 ***