public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Hans-Peter Nilsson <hans-peter.nilsson@axis.com>
To: gcc@gcc.gnu.org
Subject: How to stop gcc from not calling noinline functions
Date: Sat, 12 Jan 2008 08:26:00 -0000	[thread overview]
Message-ID: <200801120620.m0C6K3p1013168@ignucius.se.axis.com> (raw)

Also known as "nooo, it's not *inlined*, it's just the call
being removed because the called function was found to be
pure/const". :)

This happens when you try to synthesize executable test-cases
and you need e.g. a call with such-and-such parameters, but the
called function doesn't do anything; it's the caller you care
about.  You need the call, and can't just leave the called
function undefined.  But such a stub function called in the same
compilation unit, may surprisingly not be called, *even if you
declare it __attribute ((__noinline__))*, and when you look at
*just* the call site, the cause is not just that the call is
dead as-is.  It's a bit confusing until you remember or are
being told that all functions are analyzed for pure-or-constness
and the noinline attribute doesn't have say in what happens
next.  The remedy is -fno-ipa-pure-const or sticking a naked
asm ("") in the stub function.  At least, that works for now.

I'm testing the waters for a more well-defined solution.  IMHO a
construct is needed for e.g. such test-cases to stand more of a
chance to not turn into NOPs with the next smart
not-inlined-but-you-can't-tell-the-difference optimization.
There appears to be a use for this in the Linux kernel too
(kprobe?), and there's a (timing) use case in PR 16922 too.  If
you agree, how should it be done?

Redefine the noinline attribute to also stop gcc from analyzing
such functions and "keep them called" (my favorite, because as a
user, you can't really tell the call-removed effect apart from
being-inlined).

Or, another attribute.  Name?  Maybe "always_extern", but I'm
not sure that's as intuitive and obvious as "noinline".  I don't
like the perhaps immediately obvious "always_call", because I
think the calls should be deleted if the call-site is dead, just
not for reasons found out from analysis of the called function,
and the name suggests otherwise (alternatively, an implementation
to stop dead-code elimination would be troublesome and useless. :)

Or, just make "noinline" functions that are also "extern" stay
extern and called.

(Yeah, new attributes "impure" and/or "nonconst" would solve
this, but only for IPA and there's already the existing option
and asm I mentioned.  And if you say different files/compilation
units, I say LTO.)

brgds, H-P

             reply	other threads:[~2008-01-12  6:20 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-12  8:26 Hans-Peter Nilsson [this message]
2008-01-12  9:34 ` kai-gcc
2008-01-12 10:24 ` Paolo Bonzini
2008-01-14 11:26   ` Hans-Peter Nilsson
2008-01-14 11:36     ` Dave Korn
2008-01-14 11:43       ` Jan Hubicka
2008-01-14 12:18       ` Hans-Peter Nilsson
2008-01-14 15:01         ` Dave Korn
2008-01-12 11:34 ` Richard Guenther
2008-02-06 23:59   ` Mark Mitchell
2008-02-07  1:19     ` Hans-Peter Nilsson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200801120620.m0C6K3p1013168@ignucius.se.axis.com \
    --to=hans-peter.nilsson@axis.com \
    --cc=gcc@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).