Thread (8 messages) flat view 8 messages, 5 authors, 2011-08-03

Usage of unlikely in RCU code

From: Dave Hylands <hidden>
Date: 2011-08-02 00:33:44

Hi Manish,

On Mon, Aug 1, 2011 at 4:45 PM, Manish Katiyar [off-list ref] wrote:
quoted
C absolutely guarantees that the second will NEVER be evaluated before
the first. Otherwise, things like this:

if ( ptr && ptr->field )

could fail if ptr was NULL.
In your example yes. But is there a problem if the two conditions are
independent ? for eg..
The compiler doesn't care if the two conditions are independent or dependant.
foo() {
....
?a = 0;
?b = my_complex_function_call();
?if (b && a) {
? ? ?/* Do some non-trivial stuff */
?} else {
? ? printf("I'm an intelligent compiler\n");
?}
.....
}

Does C guarantee that even in this case it won't be reordered and not
optimized ?
C guarantees that within the if ( b && a ) statement, a won't be
evaluated if b evaluates to zero.

If you coded if ( 0 && func() ) then func will NEVER be called.
if you coded if ( func() && 0 ) then I think that func will always be
called since it won't evaluate the 0 until after the left hand side of
the && has been evaluated.

I tried the following very simple example (compiled with -O3)

#include <stdio.h>
static inline int func() { printf( "func called\n" ); return 1; }
int main( int argc, char **argv ) { if ( func() && 0 ) printf(
"path1\n" ); else printf( "path2\n" ); return 0; }

The compiler was smart enough to optimize out the printf( "path1\n" )
(i.e. running strings on the executable only showed path2), but it
still calls func().

-- 
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help