[lkml]   [2003]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
SubjectRe: [PATCH] Multiple & vs. && and | vs. || bugs in 2.4.20
Hash: SHA1

Norbert Kiesel wrote:

> --- linux-2.4.20/drivers/usb/acm.c~ 2002-12-03 00:17:50.000000000 -0800
> +++ linux-2.4.20/drivers/usb/acm.c 2003-03-02 03:03:34.000000000 -0800
> @@ -240,7 +240,7 @@
> if (urb->status)
> dbg("nonzero read bulk status received: %d", urb->status);
> - if (!urb->status & !acm->throttle) {
> + if (!urb->status && !acm->throttle) {
> for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
> /* if we insert more than TTY_FLIPBUF_SIZE characters,
> * we drop them. */

Have you really looked at detail at all these cases? The problem is
that you have made the code less efficient on some platforms. The use
of && requires shortcut evaluation. I.e., the compiler is forced to not
evaluate !acm->throttle if !urb->status is true. The causes, unless the
architecture has condition bits, a conditional jump.

The original code didn't need and normally has no jump and thi specific
case was certainly fine before since the result of the ! operator is
either 0 or 1 and therefore the & operator has no strange side effects.

As an example, here is how the code for x86 could have looked before

movl status(%edx), %edx
testl %edx, %edx
movl throttle(%eax), %eax
sete %dl
testl %eax, %eax
sete %al
andb %dl, %al
jne ...
[if code]
After the change the code must look something like this:

movl status(%edx), %edx
testl %edx, %edx
jne ...
movl throttle(%eax), %eax
testl %eax, %eax
jne ...
[if code]

Observe the extra 'jne' and the fact that the value of 'throttle'
element cannot be loaded until after the conditional jump. Not even
out of order execution can arrange that.

To summarize, I'd probably not be amused if you would change any of my
code which takes advantage of such programming finess. I would probably
have added appropriate comments to explain the code but nevertheless,
replacing the more efficient code with some which is easier to
understand should probably be considered on a case by case basis.
Incorrect branch prediction is costly.

- --
- --------------. ,-. 444 Castro Street
Ulrich Drepper \ ,-----------------' \ Mountain View, CA 94041 USA
Red Hat `--' drepper at `---------------------------
Version: GnuPG v1.2.1 (GNU/Linux)
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at
Please read the FAQ at

 \ /
  Last update: 2005-03-22 13:33    [W:0.074 / U:5.976 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site