Optimization of conditional access to globals: thread-unsafe?

Andrew Haley aph-gcc@littlepinkcloud.COM
Sat Oct 27 19:35:00 GMT 2007


Florian Weimer writes:
 > * Samuel Tardieu:
 > 
 > > On 27/10, Florian Weimer wrote:
 > >
 > > | (I can't reproduce the conditional store with my GCC 4.2 installation,
 > > | though.)
 > >
 > > You need "-O -fno-inline" to trigger it on this particular example
 > > (you don't need "-fno-inline" if you put "Lock" in a separate package).
 > 
 > Ah, thanks.  I see it now.
 > 
 > If not for Ada, we need to fix it for Java.  The following snippet shows
 > the same problem:
 > 
 > class C {
 >     static volatile boolean flag;
 >     static int shared;
 >     public void maybe_increment() {
 >         if (flag)
 >             ++shared;
 >     }
 > }
 > 
 > _ZN1C15maybe_incrementEJvv:
 > .LFB3:
 > 	movzbl	_ZN1C4flagE(%rip), %eax
 > 	cmpb	$1, %al
 > 	movl	_ZN1C6sharedE(%rip), %eax
 > 	sbbl	$-1, %eax
 > 	movl	%eax, _ZN1C6sharedE(%rip)
 > 	ret
 > 
 > And the 1.5 memory model should really, really prevent that (if not,
 > it's broken).

The Java 1.5 memory model will prevent that.  I'm hoping Ian Taylor's
patch will fix this problem for Java as well as C.

Andrew.



More information about the Gcc mailing list