[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2024-03-18 Thread pinskia at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

Andrew Pinski  changed:

   What|Removed |Added

 CC||programmerjake at gmail dot com

--- Comment #6 from Andrew Pinski  ---
*** Bug 71587 has been marked as a duplicate of this bug. ***

[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2022-02-17 Thread jason at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

Jason Merrill  changed:

   What|Removed |Added

  Known to fail|12.0|
  Known to work||12.0
 Status|ASSIGNED|RESOLVED
   Target Milestone|--- |12.0
 Resolution|--- |FIXED

--- Comment #5 from Jason Merrill  ---
Fixed for GCC 12.

[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2022-02-17 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

--- Comment #4 from CVS Commits  ---
The master branch has been updated by Jason Merrill :

https://gcc.gnu.org/g:2c9b7077b72529fbbe896212a0088bff6025c5e7

commit r12-7288-g2c9b7077b72529fbbe896212a0088bff6025c5e7
Author: Jason Merrill 
Date:   Thu Feb 17 00:04:21 2022 -0500

c++: inlining explicit instantiations [PR104539]

The PR10968 fix cleared DECL_COMDAT to force output of explicit
instantiations.  Then the PR59469 fix added a call to mark_needed, after
which we no longer need to clear DECL_COMDAT, and leaving it set allows us
to inline explicit instantiations without worrying about symbol
interposition.

I suppose there's an argument to be made that an explicit instantiation
declaration (extern template) should clear DECL_COMDAT, since that suggests
that there will be only a single instantiation somewhere that could be
subject to interposition, but that doesn't change the 'inline' semantics,
and it seems cleaner to treat template instantiations uniformly.

PR c++/104539

gcc/cp/ChangeLog:

* pt.cc (mark_decl_instantiated): Don't clear DECL_COMDAT.

gcc/testsuite/ChangeLog:

* g++.dg/ipa/inline-4.C: New test.

[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2022-02-17 Thread jason at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

Jason Merrill  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |jason at gcc dot gnu.org

[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2022-02-16 Thread jason at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

--- Comment #3 from Jason Merrill  ---
(In reply to Richard Biener from comment #2)
> the explicit instantiation lacks COMDAT (but has comdat_group) and it
> has forced_by_abi.
> 
> I'm not sure the C++ standard calls out any semantic difference for
> explicit vs. implicit instantiations but maybe the Itanium ABI does.

The ABI says nothing about explicit vs. implicit instantiations.

mark_decl_instantiated cleared DECL_COMDAT to fix PR10968, where we failed to
emit an explicit instantiation.  But that was before mark_needed; now that we
have that, I'd think it makes sense to have DECL_COMDAT set on explicit
instantiations just like implicit ones.

[Bug c++/104539] Failed to inline a very simple template function when it's explicit instantiated.

2022-02-15 Thread rguenth at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104539

Richard Biener  changed:

   What|Removed |Added

   Keywords||missed-optimization
   Last reconfirmed||2022-02-15
  Component|tree-optimization   |c++
 Ever confirmed|0   |1
 CC||hubicka at gcc dot gnu.org,
   ||jason at gcc dot gnu.org
 Status|UNCONFIRMED |NEW
  Known to fail||12.0

--- Comment #2 from Richard Biener  ---
t.ii:9:20: missed:   not inlinable: int g()/1 -> int f() [with int 
= 0]/0, function body can be overwritten at link time

so the issue seems to be that explicitely instantiating changes

_Z1fILi0EEiv/1 (int f() [with int  = 0]) @0x76697220
  Type: function definition analyzed
  Visibility: semantic_interposition public weak comdat
comdat_group:_Z1fILi0EEiv one_only
  Aux: @0x42d7d00
  References:
  Referring:
  Function flags: body
  Called by: _Z1gv/0
  Calls:

to

_Z1fILi0EEiv/0 (int f() [with int  = 0]) @0x76697000
  Type: function definition analyzed
  Visibility: forced_by_abi semantic_interposition public weak
comdat_group:_Z1fILi0EEiv one_only
  Aux: @0x76697220
  References:
  Referring:
  Function flags: body
  Called by: _Z1gv/1 (can throw external)
  Calls:

the explicit instantiation lacks COMDAT (but has comdat_group) and it
has forced_by_abi.

I'm not sure the C++ standard calls out any semantic difference for
explicit vs. implicit instantiations but maybe the Itanium ABI does.

Jason?  Honza?