public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jamie Lokier <egcs@tantalophile.demon.co.uk>
To: Toon Moene <toon@moene.indiv.nluug.nl>
Cc: Andi Kleen <ak@muc.de>,
	law@cygnus.com, Joe Buck <jbuck@Synopsys.COM>,
	Linus Torvalds <torvalds@transmeta.com>,
	craig@jcb-sc.com, mark@codesourcery.com, davem@redhat.com,
	chip@perlsupport.com, egcs@egcs.cygnus.com
Subject: Re: Linux and aliasing?
Date: Wed, 30 Jun 1999 15:43:00 -0000	[thread overview]
Message-ID: <19990605222555.B15508@pcep-jamie.cern.ch> (raw)
Message-ID: <19990630154300.aA_3Dzi_lWwhXjGRdjd_jW9yjq5TUE2ZYIuKNqBft9M@z> (raw)
In-Reply-To: <37595D34.D86966B4@moene.indiv.nluug.nl>

Jamie's suggestion de jour.

First let me cover the bases.

  Linus wants non-union (ie. non-ugly) casts to do the sensible thing.
  What that is isn't quite clear -- after thinking it through.
  If it's just aesthetics, I don't see why a macro wouldn't do ;-)

  Dave Miller notes that Linux does want to take advantage of full alias
  analysis, alongside code that does hacks to minimise loads and stores
  on current architectures.  I think Dave's trying to eat two cakes at
  once, but since I hack network hardware for profit, I know exactly
  where he's coming from.

  Other folks whose names (I must apologise) seem to have blended
  together in my head right now, have to write compilers.  Good
  compilers that produce the best possible code for standards-conforming
  programs.  And then degrade gracefully for non-conforming programs ;-)

  In particlar, a cast may be conforming, in which case the compiler
  should strive the generate the best allowed code (unless it's
  pathological).  A serious of non-conforming looking casts might be
  conforming too -- cast to void * and back was pointed out as
  conforming _and_ commonplace.

  Issues raised: 

  - Lots of legacy code uses casts, assuming nothing weird will happen.
  - Weird things now happen.

  - "non-conforming cast implies pointer may alias all" + "full flow
    analysis" got proposed.  No one likes it.  Bin.

  - "non-... all" + "*no* flow analysis" got proposed by Linus.  It's a
    simple special case, arguably syntactic.  But it has semantic warts:
       *(foo_t*) &bar = foo; 
    now means something different than:
       { foo_t* p = (foo_t*) &bar; *p = foo; }

    I submit that those two forms ought to be "trivially equivalent" --
    we think in terms of data flow when we write code.  We also think
    that way when we think about how compilers expand expressions, how
    common subexpressions are combined and so on.  A fine distinction
    would, IMO, be a major language misfeature and a cause of many
    subtle bugs in future.

  - "type attribute" got proposed by Linus too.  This I like.

    Type attribute means you can write:
       *(foo_t __alias*)(&bar) = foo;
    and the equivalent:
       { foo_t __alias* p = (foo_t __alias*) &bar; *p = foo; }

    See how the these _are_ trivially equivalent?
    The problem with this is that there are 2 times 10^30 ugly casts
    in the C cosmos that don't have such an attribute, of with 2 times
    10^29 are in Linux kernel.

Jamie's thought of the day
--------------------------

    It looks like the compiler could spot the dodgy casts, including
    some standard-conforming ones, based solely on the types of the
    casts (with attributes).  It could warn that you may be getting
    non-alias optimisations you weren't expecting.  The word access
    casts in the Linux kernel (and lots of other code) would be prime
    candidates.  Hard-core fortran coders have this warning switched
    off.  The compiler proceeds to optimise anyway (you were warned).

    But if you include a suitable type attribute, possible aliasing is
    implied and you don't get the warning.  You get sensible code out.

    There's an alternative attribute, for programs that mix and match,
    where possible aliasing is _not_ implied but it you still don't get
    the warning.  (A bit like __attribute__((unused)) is used solely to
    suppress warnings).

    Thus your thoroughly non-conforming kernel code starts with lots of
    warnings.  You add the __mayalias (or whatever) keyword into all the
    structure manipulation casts -- which the compiler helpfully pointed
    you to.  You add the __doesntalias keyword (is it the same as
    __restrict?) to all those places where you wrote conforming code and
    really do want it fully optimised.  So you get the best of all
    worlds and the compiler helps you get there.

    This way we get:

       - Full optimisation of conforming code.
       - Best optimisation of mostly-conforming code with dodgy casts.
       - No dubious alias flow analysis -- keeps things simple.
       - Code transformations such as rearranging intermediate
         values between expressions, extracting intermediates or merging
         then, continue to be valid transformations.  (IMO v.important).
       - The compiler tells us where to think about aliasing issues.
       - When all the warnings have gone away, then you _know_ it's safe to
         actually use the output of -fstrict-aliasing.
       - If your confident the code is conformant anyway, turn off
         the warning.

    Does this seem (a) implementable, (b) a good, incremental
    maintenance path for the kernel authors?

Enjoy,
-- Jamie

  reply	other threads:[~1999-06-30 15:43 UTC|newest]

Thread overview: 218+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-06-03 10:23 Chip Salzenberg
1999-06-03 10:37 ` mark
1999-06-03 11:26   ` David S. Miller
1999-06-03 12:03     ` mark
1999-06-03 12:25       ` David S. Miller
1999-06-03 20:06         ` craig
1999-06-03 23:03           ` Linus Torvalds
1999-06-03 23:45             ` mark
1999-06-04  0:04               ` Linus Torvalds
1999-06-04  1:08                 ` Branko Cibej
1999-06-30 15:43                   ` Branko Cibej
1999-06-04  1:24                 ` Joe Buck
1999-06-04  1:50                   ` Linus Torvalds
1999-06-04  5:46                     ` craig
1999-06-04  7:22                       ` burley (was Re: Linux and aliasing?) Mark Hahn
1999-06-04  8:16                         ` craig
1999-06-30 15:43                           ` craig
1999-06-30 15:43                         ` Mark Hahn
1999-06-04  8:35                       ` Linux and aliasing? Linus Torvalds
1999-06-04 10:04                         ` Joe Buck
1999-06-04 10:22                           ` Jeffrey A Law
1999-06-04 10:31                             ` Joe Buck
1999-06-04 10:53                               ` Jeffrey A Law
1999-06-30 15:43                                 ` Jeffrey A Law
1999-06-30 15:43                               ` Joe Buck
1999-07-11 10:55                               ` Jeffrey A Law
1999-07-31 23:33                                 ` Jeffrey A Law
1999-06-04 11:11                             ` Toon Moene
1999-06-04 12:20                               ` Jeffrey A Law
1999-06-05  5:45                                 ` Toon Moene
1999-06-05  6:23                                   ` Andi Kleen
1999-06-05 10:32                                     ` Toon Moene
1999-06-05 13:26                                       ` Jamie Lokier [this message]
1999-06-05 19:35                                         ` Linus Torvalds
1999-06-06  1:18                                           ` Martin v. Loewis
1999-06-06 10:46                                             ` Linus Torvalds
1999-06-30 15:43                                               ` Linus Torvalds
1999-06-06 17:56                                             ` Jason Merrill
1999-06-06 19:24                                               ` Tim Hollebeek
1999-06-30 15:43                                                 ` Tim Hollebeek
1999-06-06 22:23                                               ` Jeffrey A Law
1999-06-30 15:43                                                 ` Jeffrey A Law
     [not found]                                               ` <199906070645.IAA00615@mira.isdn.cs.tu-berlin.de>
1999-06-07  2:14                                                 ` Jason Merrill
1999-06-07  8:02                                                   ` mark
1999-06-07  8:41                                                     ` David S. Miller
1999-06-07  9:24                                                       ` Jeffrey A Law
1999-06-07  9:29                                                         ` David S. Miller
1999-06-30 15:43                                                           ` David S. Miller
1999-06-30 15:43                                                         ` Jeffrey A Law
1999-06-07  9:32                                                       ` Joe Buck
1999-06-30 15:43                                                         ` Joe Buck
1999-06-30 15:43                                                       ` David S. Miller
1999-06-30 15:43                                                     ` mark
1999-06-07 13:11                                                   ` Jeffrey A Law
1999-06-30 15:43                                                     ` Jeffrey A Law
1999-06-30 15:43                                                   ` Jason Merrill
1999-06-30 15:43                                               ` Jason Merrill
1999-06-30 15:43                                             ` Martin v. Loewis
1999-06-30 15:43                                           ` Linus Torvalds
1999-06-30 15:43                                         ` Jamie Lokier
1999-06-05 18:48                                       ` Linus Torvalds
1999-06-30 15:43                                         ` Linus Torvalds
1999-06-30 15:43                                       ` Toon Moene
1999-06-05 10:37                                     ` mark
1999-06-05 11:09                                       ` David S. Miller
1999-06-05 12:11                                         ` Toon Moene
1999-06-05 12:21                                           ` David S. Miller
1999-06-05 16:51                                             ` mark
1999-06-30 15:43                                               ` mark
1999-06-30 15:43                                             ` David S. Miller
1999-06-30 15:43                                           ` Toon Moene
1999-06-07  6:01                                         ` Joern Rennecke
1999-06-30 15:43                                           ` Joern Rennecke
1999-06-30 15:43                                         ` David S. Miller
1999-06-05 11:35                                       ` Andi Kleen
1999-06-30 15:43                                         ` Andi Kleen
1999-06-05 12:41                                       ` Jamie Lokier
1999-06-05 14:43                                         ` Martin v. Loewis
1999-06-30 15:43                                           ` Martin v. Loewis
1999-06-05 16:53                                         ` mark
1999-06-07  2:36                                           ` Jamie Lokier
1999-06-07  8:04                                             ` mark
1999-06-30 15:43                                               ` mark
1999-06-30 15:43                                             ` Jamie Lokier
1999-06-30 15:43                                           ` mark
1999-06-30 15:43                                         ` Jamie Lokier
1999-06-30 15:43                                       ` mark
1999-06-30 15:43                                     ` Andi Kleen
1999-06-06 23:12                                   ` f77 vs type based alias analysis Jeffrey A Law
1999-06-30 15:43                                     ` Jeffrey A Law
1999-06-06 23:20                                   ` Linux and aliasing? Jeffrey A Law
1999-06-30 15:43                                     ` Jeffrey A Law
1999-06-30 15:43                                   ` Toon Moene
1999-06-30 15:43                                 ` Jeffrey A Law
1999-06-05  4:05                               ` Andi Kleen
1999-06-30 15:43                                 ` Andi Kleen
1999-06-30 15:43                               ` Toon Moene
1999-06-30 15:43                             ` Jeffrey A Law
1999-06-04 11:49                           ` Linus Torvalds
1999-06-04 13:03                             ` Gabriel Dos_Reis
1999-06-04 13:13                               ` Joe Buck
1999-06-30 15:43                                 ` Joe Buck
1999-06-30 15:43                               ` Gabriel Dos_Reis
1999-06-30 15:43                             ` Linus Torvalds
1999-06-04 12:59                           ` Alexandre Oliva
1999-06-04 13:29                             ` Joe Buck
1999-06-04 13:39                               ` Alexandre Oliva
1999-06-30 15:43                                 ` Alexandre Oliva
1999-06-30 15:43                               ` Joe Buck
1999-06-30 15:43                             ` Alexandre Oliva
1999-06-30 15:43                           ` Joe Buck
1999-06-30 15:43                         ` Linus Torvalds
1999-06-30 15:43                       ` craig
1999-06-30 15:43                     ` Linus Torvalds
1999-06-30 15:43                   ` Joe Buck
1999-06-04  5:47                 ` craig
1999-06-30 15:43                   ` craig
1999-06-04  7:11                 ` mark
1999-06-04  8:38                   ` Linus Torvalds
1999-06-30 15:43                     ` Linus Torvalds
1999-06-30 15:43                   ` mark
1999-06-04  8:41                 ` Tim Hollebeek
1999-06-04  8:53                   ` Jeffrey A Law
1999-06-30 15:43                     ` Jeffrey A Law
1999-06-30 15:43                   ` Tim Hollebeek
1999-06-30 15:43                 ` Linus Torvalds
1999-06-30 15:43               ` mark
1999-06-04  5:47             ` craig
1999-06-04  8:17               ` Linus Torvalds
1999-06-04  8:49                 ` craig
1999-06-04  8:57                   ` Linus Torvalds
1999-06-04  9:02                     ` Jean-Pierre Radley
1999-06-30 15:43                       ` Jean-Pierre Radley
1999-06-30 15:43                     ` Linus Torvalds
1999-06-30 15:43                   ` craig
1999-06-30 15:43                 ` Linus Torvalds
1999-06-30 15:43               ` craig
1999-06-04  8:39             ` Tim Hollebeek
1999-06-04  8:55               ` Linus Torvalds
1999-06-04 15:20                 ` Richard Henderson
1999-06-05  9:50                   ` Linus Torvalds
1999-06-05 11:00                     ` mark
1999-06-06 10:30                       ` Linus Torvalds
1999-06-06 10:44                         ` mark
1999-06-06 14:17                           ` Linus Torvalds
1999-06-06 17:41                             ` mark
1999-06-07  8:58                               ` Linus Torvalds
1999-06-07  9:18                                 ` mark
1999-06-07  9:29                                   ` Linus Torvalds
1999-06-07  9:38                                     ` Tim Hollebeek
1999-06-07 10:05                                       ` Jamie Lokier
1999-06-30 15:43                                         ` Jamie Lokier
1999-06-07 10:44                                       ` Linus Torvalds
1999-06-07 11:22                                         ` Jeffrey A Law
1999-06-08  1:34                                           ` Nick Ing-Simmons
1999-06-08  1:48                                             ` Jeffrey A Law
1999-06-30 15:43                                               ` Jeffrey A Law
1999-06-30 15:43                                             ` Nick Ing-Simmons
1999-06-30 15:43                                           ` Jeffrey A Law
1999-06-30 15:43                                         ` Linus Torvalds
1999-06-30 15:43                                       ` Tim Hollebeek
1999-06-30 15:43                                     ` Linus Torvalds
1999-06-30 15:43                                   ` mark
1999-06-07 13:34                                 ` Jamie Lokier
1999-06-30 15:43                                   ` Jamie Lokier
1999-06-30 15:43                                 ` Linus Torvalds
1999-06-30 15:43                               ` mark
1999-06-30 15:43                             ` Linus Torvalds
1999-06-30 15:43                           ` mark
1999-06-30 15:43                         ` Linus Torvalds
1999-06-30 15:43                       ` mark
1999-06-30 15:43                     ` Linus Torvalds
1999-06-30 15:43                   ` Richard Henderson
1999-06-30 15:43                 ` Linus Torvalds
1999-06-30 15:43               ` Tim Hollebeek
1999-06-04 15:02             ` Richard Henderson
1999-06-04 16:50               ` Bernd Schmidt
1999-06-30 15:43                 ` Bernd Schmidt
1999-06-05  9:35               ` Linus Torvalds
1999-06-05 13:34                 ` Richard Henderson
1999-06-05 18:40                   ` Linus Torvalds
1999-06-30 15:43                     ` Linus Torvalds
1999-06-05 21:38                   ` Jakub Jelinek
1999-06-30 15:43                     ` Jakub Jelinek
1999-06-30 15:43                   ` Richard Henderson
1999-06-30 15:43                 ` Linus Torvalds
1999-06-30 15:43               ` Richard Henderson
1999-06-30 15:43             ` Linus Torvalds
1999-06-03 23:53           ` Martin v. Loewis
1999-06-30 15:43             ` Martin v. Loewis
     [not found]           ` <v04205101b37d700fbf8d@[192.168.1.254]>
1999-06-04  7:01             ` craig
1999-06-30 15:43               ` craig
1999-06-30 15:43           ` craig
1999-06-30 15:43         ` David S. Miller
1999-06-03 13:31       ` Andi Kleen
1999-06-30 15:43         ` Andi Kleen
1999-06-30 15:43       ` mark
1999-06-30 15:43     ` David S. Miller
1999-06-03 12:02   ` Andi Kleen
1999-06-03 15:38     ` Martin v. Loewis
1999-06-30 15:43       ` Martin v. Loewis
1999-06-30 15:43     ` Andi Kleen
1999-06-30 15:43   ` mark
1999-06-30 15:43 ` Chip Salzenberg
1999-06-04 11:54 Mike Stump
1999-06-04 12:13 ` Jeffrey A Law
1999-06-04 13:25   ` Sylvain Pion
1999-06-04 13:32     ` Jeffrey A Law
1999-06-30 15:43       ` Jeffrey A Law
1999-06-30 15:43     ` Sylvain Pion
1999-06-30 15:43   ` Jeffrey A Law
1999-06-30 15:43 ` Mike Stump
1999-06-06 15:08 Ross Harvey
1999-06-06 15:46 ` Linus Torvalds
1999-06-30 15:43   ` Linus Torvalds
1999-06-06 17:29 ` David S. Miller
1999-06-30 15:43   ` David S. Miller
1999-06-30 15:43 ` Ross Harvey

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=19990605222555.B15508@pcep-jamie.cern.ch \
    --to=egcs@tantalophile.demon.co.uk \
    --cc=ak@muc.de \
    --cc=chip@perlsupport.com \
    --cc=craig@jcb-sc.com \
    --cc=davem@redhat.com \
    --cc=egcs@egcs.cygnus.com \
    --cc=jbuck@Synopsys.COM \
    --cc=law@cygnus.com \
    --cc=mark@codesourcery.com \
    --cc=toon@moene.indiv.nluug.nl \
    --cc=torvalds@transmeta.com \
    /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).