public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "david at westcontrol dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug middle-end/56888] memcpy implementation optimized as a call to memcpy
Date: Tue, 19 Dec 2023 08:28:25 +0000	[thread overview]
Message-ID: <bug-56888-4-qAwhvNYCDM@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-56888-4@http.gcc.gnu.org/bugzilla/>

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

--- Comment #51 from David Brown <david at westcontrol dot com> ---
(In reply to M Welinder from comment #48)
> It's your (1).  gcc is changing a program that can rely on errno not being
> changed to one where the C library can change it.  (The current C library or
> any future library that the resulting binary may be dynamically linked
> against.)
> 
> Is there any real-world situation that benefits from introducing these
> calls?  It has the feel of optimizing for a benchmark.

There are several real-world benefits from transforming back and forth between
library calls for this kind of small standard library function.  One is that
turning explicit code into library calls can give smaller code - often of
importance in small embedded targets.  Sometimes it can also result in run-time
improvements, especially for larger data sizes - user-written code might just
copy byte by byte, while the library implementation uses more efficient larger
blocks.

Another is that turning library calls into inlined code can speed up code by
using additional knowledge of sizes, alignment, etc., to get faster results. 
This is most obvious for calls to memcpy() or memmove(), which can sometimes be
required to get the semantics correct for type manipulation, but may generate
no actual code at all.

A "C implementation" consists of a compiler and a standard library in tandem. 
The C library can make use of its knowledge of the C compiler, and any special
features, in its implementation.  (This is, in fact, required - some things in
the standard library cannot be implemented in "pure" C.)  The C compiler can
make use of its knowledge of the library implementation in its code generation
or analysis.  For the most part, compilers only make use of their knowledge of
the specifications of standard library functions, but they might also use
implementation details.

This means it is quite legitimate for the GCC team to say that gcc requires a C
library that does not set errno except for functions that explicitly say so in
their specifications.  Users don't get to mix and match random compilers and
random standard libraries and assume they form a conforming C implementation -
the pair must always be checked for compatibility.

The question then is if this would be an onerous requirement for standard
library implementations - do common existing libraries set errno in functions
that don't require it?  I cannot say, but I would be very surprised if they
did.  Modern thought, AFAIUI, considers errno to be a bad idea which should be
avoided whenever possible - it is a hinder to optimisation, analysis, and
parallelisation of code, as well as severely limiting C++ constexpr and other
compile-time calculations.

My thoughts here are that GCC should make this library requirement explicit and
public, after first confirming with some "big name" libraries like glibc,
newlib and muslc.  They could also add a flag "-funknown-stdlib" to disable any
transforms back or forth between standard library calls, and assume nothing
about the calls (not even what is given in the standards specifications).


(As a note - the paragraph 7.5p3 allowing standard library functions to set
errno is still in the current draft of C23.)

      parent reply	other threads:[~2023-12-19  8:28 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-08 23:40 [Bug middle-end/56888] New: " xanclic at gmail dot com
2013-04-09  9:59 ` [Bug middle-end/56888] " mikpe at it dot uu.se
2013-04-09 10:01 ` jakub at gcc dot gnu.org
2013-04-09 10:01 ` rguenth at gcc dot gnu.org
2013-04-09 13:02 ` xanclic at gmail dot com
2013-04-09 13:17 ` rguenther at suse dot de
2013-04-09 13:20 ` xanclic at gmail dot com
2013-04-11 11:29 ` rguenth at gcc dot gnu.org
2013-06-23  0:01 ` jeff@deseret-tech.com
2013-07-17  7:52 ` paulo@matos-sorge.com
2013-07-17 17:10 ` brooks at gcc dot gnu.org
2013-07-17 17:28 ` xanclic at gmail dot com
2013-07-17 20:36 ` schwab@linux-m68k.org
2013-07-17 20:59 ` xanclic at gmail dot com
2013-07-17 22:31 ` schwab@linux-m68k.org
2013-07-18  0:26 ` xanclic at gmail dot com
2013-07-18 10:35 ` paulo@matos-sorge.com
2013-07-28  3:30 ` bugdal at aerifal dot cx
2013-10-02  7:59 ` bernd.edlinger at hotmail dot de
2013-10-02  8:17 ` rguenth at gcc dot gnu.org
2013-10-02  8:49 ` bernd.edlinger at hotmail dot de
2013-10-02  8:59 ` rguenther at suse dot de
2014-02-17  3:48 ` janosch.rux at web dot de
2014-04-29 13:50 ` rguenth at gcc dot gnu.org
2014-04-29 13:57 ` rguenth at gcc dot gnu.org
2014-04-29 14:47 ` bugdal at aerifal dot cx
2014-05-06 10:51 ` rguenth at gcc dot gnu.org
2014-05-06 10:52 ` rguenth at gcc dot gnu.org
2014-06-06 10:40 ` terra at gnome dot org
2014-06-06 11:54 ` rguenther at suse dot de
2014-11-03  7:09 ` fd935653 at opayq dot com
2020-08-16 22:51 ` pinskia at gcc dot gnu.org
2022-06-03  6:55 ` pinskia at gcc dot gnu.org
2022-10-26 17:06 ` pinskia at gcc dot gnu.org
2023-12-18 20:59 ` terra at gnome dot org
2023-12-18 21:32 ` david at westcontrol dot com
2023-12-19  2:07 ` terra at gnome dot org
2023-12-19  8:03 ` rguenth at gcc dot gnu.org
2023-12-19  8:06 ` rguenth at gcc dot gnu.org
2023-12-19  8:28 ` david at westcontrol dot com [this message]

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=bug-56888-4-qAwhvNYCDM@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@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).