diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2020-07-17 18:13:48 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-17 18:13:48 -0700 |
| commit | 18e8089303952034ccf8a9e993770022eaf6dd53 (patch) | |
| tree | 967c0edf527b7074a54fb048480890c05cfbb118 /src/test | |
| parent | f276dd4f284c158fff60ca6beffacdcf1eac48f7 (diff) | |
| parent | b26ecd261b827837df8bb01c8fd5bf80dced8909 (diff) | |
| download | rust-18e8089303952034ccf8a9e993770022eaf6dd53.tar.gz rust-18e8089303952034ccf8a9e993770022eaf6dd53.zip | |
Rollup merge of #74449 - tmiasko:cmpxchg-test, r=nikomatsakis
Test codegen of compare_exchange operations Add a codegen test for compare_exchange to verify that rustc emits expected LLVM IR.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/codegen/atomic-operations.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/test/codegen/atomic-operations.rs b/src/test/codegen/atomic-operations.rs new file mode 100644 index 00000000000..ff94ac8543f --- /dev/null +++ b/src/test/codegen/atomic-operations.rs @@ -0,0 +1,60 @@ +// Code generation of atomic operations. +// +// compile-flags: -O +#![crate_type = "lib"] + +use std::sync::atomic::{AtomicI32, Ordering::*}; + +// CHECK-LABEL: @compare_exchange +#[no_mangle] +pub fn compare_exchange(a: &AtomicI32) { + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 10 monotonic monotonic + let _ = a.compare_exchange(0, 10, Relaxed, Relaxed); + + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 20 release monotonic + let _ = a.compare_exchange(0, 20, Release, Relaxed); + + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 30 acquire monotonic + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 31 acquire acquire + let _ = a.compare_exchange(0, 30, Acquire, Relaxed); + let _ = a.compare_exchange(0, 31, Acquire, Acquire); + + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 40 acq_rel monotonic + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 41 acq_rel acquire + let _ = a.compare_exchange(0, 40, AcqRel, Relaxed); + let _ = a.compare_exchange(0, 41, AcqRel, Acquire); + + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 50 seq_cst monotonic + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 51 seq_cst acquire + // CHECK: cmpxchg i32* %{{.*}}, i32 0, i32 52 seq_cst seq_cst + let _ = a.compare_exchange(0, 50, SeqCst, Relaxed); + let _ = a.compare_exchange(0, 51, SeqCst, Acquire); + let _ = a.compare_exchange(0, 52, SeqCst, SeqCst); +} + +// CHECK-LABEL: @compare_exchange_weak +#[no_mangle] +pub fn compare_exchange_weak(w: &AtomicI32) { + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 10 monotonic monotonic + let _ = w.compare_exchange_weak(1, 10, Relaxed, Relaxed); + + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 20 release monotonic + let _ = w.compare_exchange_weak(1, 20, Release, Relaxed); + + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 30 acquire monotonic + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 31 acquire acquire + let _ = w.compare_exchange_weak(1, 30, Acquire, Relaxed); + let _ = w.compare_exchange_weak(1, 31, Acquire, Acquire); + + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 40 acq_rel monotonic + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 41 acq_rel acquire + let _ = w.compare_exchange_weak(1, 40, AcqRel, Relaxed); + let _ = w.compare_exchange_weak(1, 41, AcqRel, Acquire); + + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 50 seq_cst monotonic + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 51 seq_cst acquire + // CHECK: cmpxchg weak i32* %{{.*}}, i32 1, i32 52 seq_cst seq_cst + let _ = w.compare_exchange_weak(1, 50, SeqCst, Relaxed); + let _ = w.compare_exchange_weak(1, 51, SeqCst, Acquire); + let _ = w.compare_exchange_weak(1, 52, SeqCst, SeqCst); +} |
