On Sun, 2007-10-28 at 22:41 +0100, Richard Guenther wrote: > > OK .. hmm .. well this is the idea, but a more formal proof > > would be cool. > > Doesn't work:
Of course it works. > you cannot do such analysis without seeing the whole program. There's no need. A mutex is assumed at each function call. That is, registers are dumped to variables at each * call * function entry * function return This means you cannot merely, say, push caller save registers when calling a function, and you cannot leave values in callee save registers, if the variable aliased is sharable. In your example: int a; void foo(bool locked) { if (locked) a++; } I see no problem, a is in memory, you can safely do if(!locked) goto end; r0 <- a; r0++; a <- r0; end: return; Since 'a' here is sharable, the function can assume it is not aliased in a register, load and increment it and store it back. It doesn't matter then, whether there is a mutex or not. In fact, it doesn't matter if locked is true or false. I also can't see anything at all is lost here. -- John Skaller <skaller at users dot sf dot net> Felix, successor to C++: http://felix.sf.net