Re: [PATCH 0/24] make atomic_read() behave consistently across all architectures
From: Satyam Sharma <hidden>
Date: 2007-08-16 01:11:54
Also in:
linux-arch, lkml
From: Satyam Sharma <hidden>
Date: 2007-08-16 01:11:54
Also in:
linux-arch, lkml
On Wed, 15 Aug 2007, Segher Boessenkool wrote:
[...]quoted
BTW: #define atomic_read(a) (*(volatile int *)&(a)) #define atomic_set(a,i) (*(volatile int *)&(a) = (i)) int a; void func(void) { int b; b = atomic_read(a); atomic_set(a, 20); b = atomic_read(a); } gives: func: pushl %ebp movl a, %eax movl %esp, %ebp movl $20, a movl a, %eax popl %ebp ret so the first atomic_read() wasn't optimized away.Of course. It is executed by the abstract machine, so it will be executed by the actual machine. On the other hand, try b = 0; if (b) b = atomic_read(a); or similar.
Yup, obviously. Volatile accesses (or any access to volatile objects), or even "__volatile__ asms" (which gcc normally promises never to elid) can always be optimized for cases such as these where the compiler can trivially determine that the code in question is not reachable.