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
next prev parent 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).