Hi, On Thu, 26 May 2011, Andrew Haley wrote:
> >>> +Generates the @code{pause} machine instruction. > >> > >> But that's missing the fact that it generates a compiler memory > >> barrier, which is important. And if you think it's not a compiler > >> memory barrier, please explain > >> > >> a. Why it's not a compiler memory barrier, > > > > It is not a compiler memory barrier because it is a builtin function call > > which is never assumed to be a barrier for local automatic storage > > that does not have its address taken. > > OK. How would you tell the difference between the kind of barrier > that it is and a real compiler memory barrier? First we have to determine if this builtin really does what its users intend to use it for. I believe they _do_ want to use it also with regards to auto variables (it includes also address-takens whose address doesn't escape). A normal builtin call is not a barrier for operations on such entities, hence it might very well be that the implementation of HJ actually doesn't what he wanted. I don't have a good word for what functions calls are in their barrierness part of pre/post conditions. "global memory movement barrier" perhaps, with an appropriate definition of global memory (which funnily include address-taken escaped local storage, ugh). > > To make it a compiler memory barrier you have to "expand" the > > builtin already in the frontend and present the middle-end with > > __asm__ ("...." : : : "memory"). That will serve as a compiler > > memory barrier also covering local non-address taken storage > > (global and practically most of address-taken local storage > > is covered by a builtin function call already). > > Well, the fact that it's also a memory clobber has to be documented > somehow. If the present documentation is to be changed, it should > not be changed by deleting a vital piece of information. It's not only about the docu. As implemented right now it's neither an optimization barrier nor a memory clobber. Ciao, Michael.