[llvm-dev] Meaning of loads/stores marked both atomic and volatile (original) (raw)
Tim Northover via llvm-dev llvm-dev at lists.llvm.org
Mon Nov 20 23:53:55 PST 2017
- Previous message: [llvm-dev] Meaning of loads/stores marked both atomic and volatile
- Next message: [llvm-dev] Meaning of loads/stores marked both atomic and volatile
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 20 November 2017 at 21:17, Paweł Batko <pawel.batko at gmail.com> wrote:
> There are only a couple of valid uses for volatile these days Do you mean volatile used alone or also the combination 'atomic volatile'?
Volatile alone.
Example 1.
// shared variable int i = 0; // call this method from 10 threads void foo(){ int i = rand() % 2; int j = i; while(i == j){ printf("In the loop\n"); } } I claim that the loop can be optimized to an infinite loop by a compiler, because apparently j == i at all times in a single threaded program.
The global variable i is shadowed by the local there and I can't be sure exactly what you intended so I won't comment on it directly.
But in general terms atomic LLVM operations with at least "monotonic" ordering forbid unrestricted store-forwarding within a thread (which I think would be the first step in eliminating the loop). See https://llvm.org/docs/LangRef.html#atomic-memory-ordering-constraints where it's explicitly called out: "If an address is written monotonic-ally by one thread, and other threads monotonic-ally read that address repeatedly, the other threads must eventually see the write."
Example 2.
// shared variable int i = 0; void signalHandler(){ i = 1; } void main(){ while(i == 0){ printf("In the loop\n"); } } Here I also claim that the loop can be optimized into an infinite loop if volatile is not used.
This is an interesting one. Monotonic atomic is again sufficient to synchronize with another thread (or signal handler I'd argue). But if this is a signal handler within a thread then that is actually one of the other valid uses of volatile in C (nearly, it has to be a sig_atomic_t too). In LLVM IR I think you'd use an atomic with synchscope("singlethread") for that instead.
Cheers.
Tim.
- Previous message: [llvm-dev] Meaning of loads/stores marked both atomic and volatile
- Next message: [llvm-dev] Meaning of loads/stores marked both atomic and volatile
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]