unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Emacs' C: static inline considered useless nowadays?
@ 2022-10-16 22:08 Matt Armstrong
  2022-10-17  0:43 ` Stefan Monnier
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Matt Armstrong @ 2022-10-16 22:08 UTC (permalink / raw)
  To: emacs-devel

For Emacs, I would think:

a) In header files, use Emacs' INLINE and NO_INLINE macros.

b) In .c files, use static, EXTERN_INLINE, but never 'inline' since it
does nothing.

I'm seeking confirmation (or refutation) of (a) and (b).  I'm not asking
generally, but for Emacs' C code.

Specifically, ignoring the uselesness of the function itself, assuming
the code is in a .c file, is the use of the "inline" keyword redundant
with static, below?

    static inline int
    add_two_int (int a, int b)
    {
        return a + b
    }

I've spent the last few decades coding with an undersanding that
"inline" is about linkage and allows one to place code in header files
so that it *may* be inlined, but that compilers long ago stopped using
it as a meaningful inlining hint.  But this is mostly colored by how gcc
and clang behave with C++, and not much else.

-- 
matt (sent from an Emacs running the feature/noverlay branch)



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-16 22:08 Emacs' C: static inline considered useless nowadays? Matt Armstrong
@ 2022-10-17  0:43 ` Stefan Monnier
  2022-10-17  3:13   ` Matt Armstrong
  2022-10-17  6:10 ` Eli Zaretskii
  2022-10-18 11:58 ` Richard Stallman
  2 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2022-10-17  0:43 UTC (permalink / raw)
  To: Matt Armstrong; +Cc: emacs-devel

Matt Armstrong [2022-10-16 15:08:51] wrote:
> I've spent the last few decades coding with an undersanding that
> "inline" is about linkage and allows one to place code in header files
> so that it *may* be inlined, but that compilers long ago stopped using
> it as a meaningful inlining hint.  But this is mostly colored by how gcc
> and clang behave with C++, and not much else.

I believe what you say does hold true for "optimized builds".
I'd be interested to know if it's true for lower levels of optimization
as well.


        Stefan "compiling with -Og"




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17  0:43 ` Stefan Monnier
@ 2022-10-17  3:13   ` Matt Armstrong
  2022-10-17  3:33     ` Óscar Fuentes
  0 siblings, 1 reply; 15+ messages in thread
From: Matt Armstrong @ 2022-10-17  3:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Matt Armstrong [2022-10-16 15:08:51] wrote:
>> I've spent the last few decades coding with an undersanding that
>> "inline" is about linkage and allows one to place code in header files
>> so that it *may* be inlined, but that compilers long ago stopped using
>> it as a meaningful inlining hint.  But this is mostly colored by how gcc
>> and clang behave with C++, and not much else.
>
> I believe what you say does hold true for "optimized builds".
> I'd be interested to know if it's true for lower levels of optimization
> as well.
>
>         Stefan "compiling with -Og"

Seems the answer, thanks to godbolt, is "it depends", but "static
inline" does enable inlining in gcc's -Og, so it has its use.

For this program:

    static inline int static_inline_add(int x, int y) { return x + y; }
    static int static_add(int x, int y) { return x + y; }
    int add_three(int x, int y, int z) {
        return static_add(x, static_inline_add(y, z));
    }

gcc and clang has the same behavior:

    -O0: nither static functions are inlined into 'add_three'
    -Og: only 'static_inline_add' is inlined
    -O1: 'static_add' is also inlined

Microsoft Visual Studio has more optimization knobs.

    /Od: neither are inlined
    /Ot: neither are inlined
    /Ox: both are inlined
    /Odb1: only static_inline_add is inlined
    /Odb2: only static_inline_add is inlined
    /O1: both are inlined
    /O2: both are inlined

I couldn't find a way to trigger Visual Studio into behaving like gcc.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17  3:13   ` Matt Armstrong
@ 2022-10-17  3:33     ` Óscar Fuentes
  0 siblings, 0 replies; 15+ messages in thread
From: Óscar Fuentes @ 2022-10-17  3:33 UTC (permalink / raw)
  To: emacs-devel

Matt Armstrong <matt@rfc20.org> writes:

> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
>> Matt Armstrong [2022-10-16 15:08:51] wrote:
>>> I've spent the last few decades coding with an undersanding that
>>> "inline" is about linkage and allows one to place code in header files
>>> so that it *may* be inlined, but that compilers long ago stopped using
>>> it as a meaningful inlining hint.  But this is mostly colored by how gcc
>>> and clang behave with C++, and not much else.
>>
>> I believe what you say does hold true for "optimized builds".
>> I'd be interested to know if it's true for lower levels of optimization
>> as well.
>>
>>         Stefan "compiling with -Og"
>
> Seems the answer, thanks to godbolt, is "it depends", but "static
> inline" does enable inlining in gcc's -Og, so it has its use.
>
> For this program:
>
>     static inline int static_inline_add(int x, int y) { return x + y; }
>     static int static_add(int x, int y) { return x + y; }
>     int add_three(int x, int y, int z) {
>         return static_add(x, static_inline_add(y, z));
>     }
>
> gcc and clang has the same behavior:
>
>     -O0: nither static functions are inlined into 'add_three'
>     -Og: only 'static_inline_add' is inlined
>     -O1: 'static_add' is also inlined

See https://gcc.gnu.org/onlinedocs/gcc/Inline.html for some enlightening
comments on this topic.

Please note that modern compilers implement complex heuristics for
deciding when a function is inlined (and the presence of the `inline'
keyword is just another factor.) An "static inline" function may not be
inlined even at -O2 if your compiler decides that it is better left
un-inlined.




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-16 22:08 Emacs' C: static inline considered useless nowadays? Matt Armstrong
  2022-10-17  0:43 ` Stefan Monnier
@ 2022-10-17  6:10 ` Eli Zaretskii
  2022-10-17 19:08   ` Matt Armstrong
  2022-10-18 11:58 ` Richard Stallman
  2 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2022-10-17  6:10 UTC (permalink / raw)
  To: Matt Armstrong; +Cc: emacs-devel

> From: Matt Armstrong <matt@rfc20.org>
> Date: Sun, 16 Oct 2022 15:08:51 -0700
> 
> For Emacs, I would think:
> 
> a) In header files, use Emacs' INLINE and NO_INLINE macros.
> 
> b) In .c files, use static, EXTERN_INLINE, but never 'inline' since it
> does nothing.
> 
> I'm seeking confirmation (or refutation) of (a) and (b).  I'm not asking
> generally, but for Emacs' C code.

See conf_post.h, around line 395: it explains the issue and the
expected usage of these in our sources.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17  6:10 ` Eli Zaretskii
@ 2022-10-17 19:08   ` Matt Armstrong
  2022-10-17 19:12     ` Eli Zaretskii
  0 siblings, 1 reply; 15+ messages in thread
From: Matt Armstrong @ 2022-10-17 19:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Matt Armstrong <matt@rfc20.org>
>> Date: Sun, 16 Oct 2022 15:08:51 -0700
>> 
>> For Emacs, I would think:
>> 
>> a) In header files, use Emacs' INLINE and NO_INLINE macros.
>> 
>> b) In .c files, use static, EXTERN_INLINE, but never 'inline' since it
>> does nothing.
>> 
>> I'm seeking confirmation (or refutation) of (a) and (b).  I'm not asking
>> generally, but for Emacs' C code.
>
> See conf_post.h, around line 395: it explains the issue and the
> expected usage of these in our sources.

conf_post.h didn't answer my question since it seems to pertain to code
in header files.

I realize now that the conclusion of this thread so far is unclear:

a) "static inline" in .c files is okay.  No need for macros.

b) Criteria for when to use "static inline" is not clear.  Do we do this
   ad hoc as -Og builds are discovered to be slow?  Do it for all static
   functions?  Don't care?  I can see cases for any of these.

c) Neither (a) nor (b) are written down, and as Eli points out,
   conf_post.h suggests that at least sometimes you've got to use
   macros for inline functions in Emacs code, but that header is about
   how to do things in header files.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17 19:08   ` Matt Armstrong
@ 2022-10-17 19:12     ` Eli Zaretskii
  2022-10-17 20:33       ` Matt Armstrong
  0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2022-10-17 19:12 UTC (permalink / raw)
  To: Matt Armstrong; +Cc: emacs-devel

> From: Matt Armstrong <matt@rfc20.org>
> Cc: emacs-devel@gnu.org
> Date: Mon, 17 Oct 2022 12:08:38 -0700
> 
> > See conf_post.h, around line 395: it explains the issue and the
> > expected usage of these in our sources.
> 
> conf_post.h didn't answer my question since it seems to pertain to code
> in header files.

Why would you need 'inline' anywhere else?



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17 19:12     ` Eli Zaretskii
@ 2022-10-17 20:33       ` Matt Armstrong
  2022-10-18  2:30         ` Eli Zaretskii
  0 siblings, 1 reply; 15+ messages in thread
From: Matt Armstrong @ 2022-10-17 20:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Matt Armstrong <matt@rfc20.org>
>> Cc: emacs-devel@gnu.org
>> Date: Mon, 17 Oct 2022 12:08:38 -0700
>>
>> > See conf_post.h, around line 395: it explains the issue and the
>> > expected usage of these in our sources.
>>
>> conf_post.h didn't answer my question since it seems to pertain to code
>> in header files.
>
> Why would you need 'inline' anywhere else?

That is the question I started the thread with, in different words.  If
you grep our sources 'static inline' appears in .c files, and I wondered
why.

Stefan gave an answer in the form of a question (he was concerned about
what gcc did at optimization level -Og).  I investigated and found that
gcc (and clang) will inline a static function at -Og level only if the
function uses the inline keyword.  So a "static inline" function is
useful in the case where you want some key static functions inlined, but
everything else still relatively unoptimized.




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-17 20:33       ` Matt Armstrong
@ 2022-10-18  2:30         ` Eli Zaretskii
  2022-10-18 13:32           ` Stefan Monnier
  0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2022-10-18  2:30 UTC (permalink / raw)
  To: Matt Armstrong; +Cc: emacs-devel

> From: Matt Armstrong <matt@rfc20.org>
> Cc: emacs-devel@gnu.org
> Date: Mon, 17 Oct 2022 13:33:18 -0700
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Matt Armstrong <matt@rfc20.org>
> >> Cc: emacs-devel@gnu.org
> >> Date: Mon, 17 Oct 2022 12:08:38 -0700
> >>
> >> > See conf_post.h, around line 395: it explains the issue and the
> >> > expected usage of these in our sources.
> >>
> >> conf_post.h didn't answer my question since it seems to pertain to code
> >> in header files.
> >
> > Why would you need 'inline' anywhere else?
> 
> That is the question I started the thread with, in different words.  If
> you grep our sources 'static inline' appears in .c files, and I wondered
> why.

Never mind that; it's a historic accident.  Just use 'static' and let
the compiler decide when to inline.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-16 22:08 Emacs' C: static inline considered useless nowadays? Matt Armstrong
  2022-10-17  0:43 ` Stefan Monnier
  2022-10-17  6:10 ` Eli Zaretskii
@ 2022-10-18 11:58 ` Richard Stallman
  2 siblings, 0 replies; 15+ messages in thread
From: Richard Stallman @ 2022-10-18 11:58 UTC (permalink / raw)
  To: Matt Armstrong; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

ISTR that GCC did give some weight to `inline' when deciding whether
to inline a function.  But I don't recall for certain -- when I worked
on GCC was 30 years ago.

-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-18  2:30         ` Eli Zaretskii
@ 2022-10-18 13:32           ` Stefan Monnier
  2022-10-18 15:09             ` Eli Zaretskii
  0 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2022-10-18 13:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Matt Armstrong, emacs-devel

> Never mind that; it's a historic accident.  Just use 'static' and let
> the compiler decide when to inline.

Since both `gcc` and `clang` obey the `inline` attribute in that case
for options like `-Og`, it can still be a good idea to keep them in
those places where we think it makes a significant difference.


        Stefan




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-18 13:32           ` Stefan Monnier
@ 2022-10-18 15:09             ` Eli Zaretskii
  2022-10-18 17:01               ` tomas
  2022-10-18 19:22               ` Stefan Monnier
  0 siblings, 2 replies; 15+ messages in thread
From: Eli Zaretskii @ 2022-10-18 15:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: matt, emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Matt Armstrong <matt@rfc20.org>,  emacs-devel@gnu.org
> Date: Tue, 18 Oct 2022 09:32:32 -0400
> 
> > Never mind that; it's a historic accident.  Just use 'static' and let
> > the compiler decide when to inline.
> 
> Since both `gcc` and `clang` obey the `inline` attribute in that case
> for options like `-Og`, it can still be a good idea to keep them in
> those places where we think it makes a significant difference.

Experience shows that we have no idea where it makes a difference.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-18 15:09             ` Eli Zaretskii
@ 2022-10-18 17:01               ` tomas
  2022-10-18 19:22               ` Stefan Monnier
  1 sibling, 0 replies; 15+ messages in thread
From: tomas @ 2022-10-18 17:01 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 869 bytes --]

On Tue, Oct 18, 2022 at 06:09:13PM +0300, Eli Zaretskii wrote:
> > From: Stefan Monnier <monnier@iro.umontreal.ca>
> > Cc: Matt Armstrong <matt@rfc20.org>,  emacs-devel@gnu.org
> > Date: Tue, 18 Oct 2022 09:32:32 -0400
> > 
> > > Never mind that; it's a historic accident.  Just use 'static' and let
> > > the compiler decide when to inline.
> > 
> > Since both `gcc` and `clang` obey the `inline` attribute in that case
> > for options like `-Og`, it can still be a good idea to keep them in
> > those places where we think it makes a significant difference.
> 
> Experience shows that we have no idea where it makes a difference.

In the case of gcc, it's at least documented [1] (no idea about clang,
but I'd assume it's documented as well).

For proprietary compilers... we don't talk about proprietary compilers,
do we?

;-)

Cheers
-- 
t

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-18 15:09             ` Eli Zaretskii
  2022-10-18 17:01               ` tomas
@ 2022-10-18 19:22               ` Stefan Monnier
  2022-10-18 19:31                 ` Eli Zaretskii
  1 sibling, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2022-10-18 19:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: matt, emacs-devel

Eli Zaretskii [2022-10-18 18:09:13] wrote:
> Experience shows that we have no idea where it makes a difference.

Yet we do go through a fair bit of trouble to force such inlining
in `lisp.h` (under the control of `DEFINE_KEY_OPS_AS_MACROS`).


        Stefan




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Emacs' C: static inline considered useless nowadays?
  2022-10-18 19:22               ` Stefan Monnier
@ 2022-10-18 19:31                 ` Eli Zaretskii
  0 siblings, 0 replies; 15+ messages in thread
From: Eli Zaretskii @ 2022-10-18 19:31 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: matt, emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: matt@rfc20.org,  emacs-devel@gnu.org
> Date: Tue, 18 Oct 2022 15:22:22 -0400
> 
> Eli Zaretskii [2022-10-18 18:09:13] wrote:
> > Experience shows that we have no idea where it makes a difference.
> 
> Yet we do go through a fair bit of trouble to force such inlining
> in `lisp.h` (under the control of `DEFINE_KEY_OPS_AS_MACROS`).

Yes.  I was talking about inline functions in *.c files in the message
to which you replied, not about what we do in *.h files.



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-10-18 19:31 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-16 22:08 Emacs' C: static inline considered useless nowadays? Matt Armstrong
2022-10-17  0:43 ` Stefan Monnier
2022-10-17  3:13   ` Matt Armstrong
2022-10-17  3:33     ` Óscar Fuentes
2022-10-17  6:10 ` Eli Zaretskii
2022-10-17 19:08   ` Matt Armstrong
2022-10-17 19:12     ` Eli Zaretskii
2022-10-17 20:33       ` Matt Armstrong
2022-10-18  2:30         ` Eli Zaretskii
2022-10-18 13:32           ` Stefan Monnier
2022-10-18 15:09             ` Eli Zaretskii
2022-10-18 17:01               ` tomas
2022-10-18 19:22               ` Stefan Monnier
2022-10-18 19:31                 ` Eli Zaretskii
2022-10-18 11:58 ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).