diff options
Diffstat (limited to 'clang/test/CodeGen')
-rw-r--r-- | clang/test/CodeGen/atomic_init.c | 14 | ||||
-rw-r--r-- | clang/test/CodeGen/atomic_ops.c | 14 |
2 files changed, 28 insertions, 0 deletions
diff --git a/clang/test/CodeGen/atomic_init.c b/clang/test/CodeGen/atomic_init.c new file mode 100644 index 00000000000..243eb602cb1 --- /dev/null +++ b/clang/test/CodeGen/atomic_init.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s + +// Check that no atomic operations are used in any initialisation of _Atomic +// types. + +_Atomic(int) i = 42; + +void foo() +{ + _Atomic(int) j = 12; // CHECK: store + // CHECK-NOT: atomic + __atomic_init(&j, 42); // CHECK: store + // CHECK-NOT: atomic +} diff --git a/clang/test/CodeGen/atomic_ops.c b/clang/test/CodeGen/atomic_ops.c new file mode 100644 index 00000000000..9a18c9e9449 --- /dev/null +++ b/clang/test/CodeGen/atomic_ops.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s + +void foo(void) +{ + _Atomic(int) i = 0; + // Check that multiply / divides on atomics produce a cmpxchg loop + i *= 2; // CHECK: cmpxchg + i /= 2; // CHECK: cmpxchg + // These should be emitting atomicrmw instructions, but they aren't yet + i += 2; // CHECK: cmpxchg + i -= 2; // CHECK: cmpxchg + i++; // CHECK: cmpxchg + i--; // CHECK: cmpxchg +} |