[LLVMdev] memory scopes in atomic instructions

Sahasrabuddhe, Sameer sameer.sahasrabuddhe at amd.com
Mon Dec 1 03:03:59 PST 2014


On 11/19/2014 6:11 AM, Owen Anderson wrote:
>> On Nov 18, 2014, at 2:35 PM, Chandler Carruth <chandlerc at google.com 
>> <mailto:chandlerc at google.com>> wrote:
>>
>> I think this should be an arbitrary bit width integer. I think baking 
>> any size into this is a mistake unless that size is "1”.
> ...
>> If we go with your proposed constraint below, I think it is essential 
>> to model single-thread-scope as the maximum integer. It should be a 
>> strict subset of all inter-thread scopes.
>
> These seem mutually contradictory.

I managed to implement wider synchronization scopes in the IR as 
follows. Would like to put the changes up for review, but I still need 
some high-level inputs.

 1. The synchronization scope is already implemented as an unsigned
    integer in the bitcode, as far as I can tell (but I am still new at
    understanding BitcodeWriter). Only BitcodeReader needs to change so
    that it is aware that CrossThread and SingleThread are not the only
    two values possible.

 2. My change redefines CrossThread to be "0" from the current "1", and
    SingleThread to "~0U" from the current "0".

 3. The LLVM assembly language needs a way to specify all the scopes.
    The proposed syntax is:
     1. singlethread: This represents "the largest integer representable
        in the underlying implementation" and hence "the smallest
        scope". LLParser will interpret this "~0U".
     2. synchscope(n): Used to specify any synchronization scope that is
        larger than a single thread. The notation is similar to that
        used for address spaces.
     3. The default scope is the same as specifying "synchscope(0)".

 4. But the above encoding is actually incompatible with the current
    encoding; I had got this wrong in my original post. In particular,
    the following tests failed because the meaning of 0/1 changed:

    LLVM :: Bitcode/cmpxchg-upgrade.ll
    LLVM :: Bitcode/memInstructions.3.2.ll
    LLVM :: Bitcode/weak-cmpxchg-upgrade.ll

    All three tests contain comments on making sure that older bitcode
    files can be read correctly.

    The simplest approach is to invert the new encoding and say that "0"
    remains as SingleThread, and CrossThread is now the largest integer.
    This will need a new token "crossthread" in the assembly, and point
    (3) above will change accordingly. This breaks away from the general
    tradition of "zero as default", but this was not true with
    synchronization scopes anyway.

 5. And yes, "crossthread" needs to be renamed to something better, like
    "allthreads", or "systemscope", or "addressspacescope". The last one
    is accurate but takes a small effort to see why. I would go for
    "allthreads".

Sameer.






More information about the llvm-dev mailing list