1 ; RUN: opt < %s | opt -S | FileCheck %s 2 ; Basic smoke test for atomic operations. 3 4 define void @f(i32* %x) { 5 ; CHECK: load atomic i32* %x unordered, align 4 6 load atomic i32* %x unordered, align 4 7 ; CHECK: load atomic volatile i32* %x singlethread acquire, align 4 8 load atomic volatile i32* %x singlethread acquire, align 4 9 ; CHECK: store atomic i32 3, i32* %x release, align 4 10 store atomic i32 3, i32* %x release, align 4 11 ; CHECK: store atomic volatile i32 3, i32* %x singlethread monotonic, align 4 12 store atomic volatile i32 3, i32* %x singlethread monotonic, align 4 13 ; CHECK: cmpxchg i32* %x, i32 1, i32 0 singlethread monotonic monotonic 14 cmpxchg i32* %x, i32 1, i32 0 singlethread monotonic monotonic 15 ; CHECK: cmpxchg volatile i32* %x, i32 0, i32 1 acq_rel acquire 16 cmpxchg volatile i32* %x, i32 0, i32 1 acq_rel acquire 17 ; CHECK: cmpxchg i32* %x, i32 42, i32 0 acq_rel monotonic 18 cmpxchg i32* %x, i32 42, i32 0 acq_rel monotonic 19 ; CHECK: cmpxchg weak i32* %x, i32 13, i32 0 seq_cst monotonic 20 cmpxchg weak i32* %x, i32 13, i32 0 seq_cst monotonic 21 ; CHECK: atomicrmw add i32* %x, i32 10 seq_cst 22 atomicrmw add i32* %x, i32 10 seq_cst 23 ; CHECK: atomicrmw volatile xchg i32* %x, i32 10 monotonic 24 atomicrmw volatile xchg i32* %x, i32 10 monotonic 25 ; CHECK: fence singlethread release 26 fence singlethread release 27 ; CHECK: fence seq_cst 28 fence seq_cst 29 ret void 30 } 31