Messages in this thread | | | Date | Tue, 6 Oct 2020 14:49:07 +0200 | From | Willy Tarreau <> | Subject | Re: Control Dependencies vs C Compilers |
| |
On Tue, Oct 06, 2020 at 12:37:06PM +0000, David Laight wrote: > > Our Documentation/memory-barriers.txt has a Control Dependencies section > > (which I shall not replicate here for brevity) which lists a number of > > caveats. But in general the work-around we use is: > > > > x = READ_ONCE(*foo); > > if (x > 42) > > WRITE_ONCE(*bar, 1); > > An alternative is to 'persuade' the compiler that > any 'tracked' value for a local variable is invalid. > Rather like the way that barrier() 'invalidates' memory. > So you generate: > > x = *foo > asm ("" : "+r" (x)); > if (x > 42) > *bar = 1; > > Since the "+r" constraint indicates that the value of 'x' > might have changed it can't optimise based on any > presumed old value. > (Unless it looks inside the asm opcodes...)
I'm using exactly this in userland to prevent the compiler from guessing what I'm doing with a variable, and it's also useful sometimes to shut up certain warnings when I know a condition is satisfied but can hardly be expressed in a way to please the compiler. Overall I find that it's no big deal and forces the developer to think twice before doing it, which is probably a good thing in general.
Willy
| |