From: Linus Torvalds <torvalds@osdl.org>
To: Al Viro <viro@ftp.linux.org.uk>
Cc: linux-sparse@vger.kernel.org
Subject: Re: [PATCHSET] fouled-bitwise handling
Date: Sun, 1 Oct 2006 09:21:21 -0700 (PDT) [thread overview]
Message-ID: <Pine.LNX.4.64.0610010906030.3952@g5.osdl.org> (raw)
In-Reply-To: <E1GU1od-0006tu-Oo@ZenIV.linux.org.uk>
On Sun, 1 Oct 2006, Al Viro wrote:
>
> This stuff comes from handling smaller-than-int bitwise types (e.g. __le16).
> The problem is in handling things like
> __be16 x, y;
> ...
> if (x == (x & ~y))
> The code is bitwise-clean, but current sparse can't deduce that.
Al, I understand why you did it the way you did, but I think it's wrong.
Why do I think it's wrong? Let me count the ways.
Umm. Ok, I counted, and there's only one way.
The only reason I think you're doing it wrong is that you're using this
totally new separate mechanism for it (which is not a bad mechanism, but
it's very much a special case), and you should not need to!
The fact is, regardless of any bitwise issues, the
(cast) narrower-type <op> (wider-type "&" (cast) narrower-type)
should _always_ be simplified to a small-type.
See? Even from a purely optimization angle, we're actually better off just
noticing that the whole comparison can be done in the narrower type.
Imagine this piece of code:
int mask;
char c, *p;
if (*p == (mask & c))
where there is no bitwise stuff, a good compiler should notice on its own
that it should just be done in 8 bits rather than having to convert "c"
and "*p" to integers.
And once you do that _generic_ optimization, your whole "fouled" thing is
useless.
Btw, we _already_ do this optimization for a few cases, we just didn't do
it for enough cases. We do it purely for assignment statements, ie notice
how git already does not warn for
__le16 a, b;
a = ~b;
exactly because we have done a simplification of
a = (implicit cast back to __le16)~(implicit cast to int)b;
to just keeping everything in the narrower type..
See commit 4b6c2e63d3423931ac687f113882cec427df9f91 for details.
And I _think_ we should be able to do exactly the same for this one, by
simply noticing that doing a
(widening-cast) a == b & (widening-cast) c
is by definition throwing away the higher bits on both sides, and we can
just turn it into the simpler
a == c & (narrowing-cast) b
instead. Of course, we can only do this with ops that don't have overflow
from the narrower type (but comparisons and bitops are ok).
No?
Linus
next prev parent reply other threads:[~2006-10-01 16:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-01 13:57 [PATCHSET] fouled-bitwise handling Al Viro
2006-10-01 14:09 ` Al Viro
2006-10-01 16:21 ` Linus Torvalds [this message]
2006-10-01 16:45 ` Al Viro
2006-10-01 16:52 ` Linus Torvalds
2006-10-01 17:22 ` Al Viro
2006-10-01 17:29 ` Al Viro
2006-10-01 17:58 ` Linus Torvalds
2006-10-01 17:33 ` Linus Torvalds
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=Pine.LNX.4.64.0610010906030.3952@g5.osdl.org \
--to=torvalds@osdl.org \
--cc=linux-sparse@vger.kernel.org \
--cc=viro@ftp.linux.org.uk \
/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 NNTP newsgroup(s).