From a32938b03f26cc510f262a2ad4600578b1df8cd1 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Mon, 5 Apr 2021 17:17:23 +0000 Subject: [PATCH] [aarch64] add target feature outline-atomics Enable outline-atomics by default as enabled in clang by the following commit https://reviews.llvm.org/rGc5e7e649d537067dec7111f3de1430d0fc8a4d11 Performance improves by several orders of magnitude when using the LSE instructions instead of the ARMv8.0 compatible load/store exclusive instructions. Tested on Graviton2 aarch64-linux with x.py build && x.py install && x.py test --- .../src/spec/aarch64_unknown_linux_gnu.rs | 1 + .../src/spec/aarch64_unknown_linux_musl.rs | 1 + src/test/assembly/asm/aarch64-outline-atomics.rs | 15 +++++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 src/test/assembly/asm/aarch64-outline-atomics.rs diff --git a/compiler/rustc_target/src/spec/aarch64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/aarch64_unknown_linux_gnu.rs index a07cd7db8897d..b2adefe2b3389 100644 --- a/compiler/rustc_target/src/spec/aarch64_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/aarch64_unknown_linux_gnu.rs @@ -8,6 +8,7 @@ pub fn target() -> Target { | SanitizerSet::MEMORY | SanitizerSet::THREAD | SanitizerSet::HWADDRESS; + base.features = "+outline-atomics".to_string(); Target { llvm_target: "aarch64-unknown-linux-gnu".to_string(), diff --git a/compiler/rustc_target/src/spec/aarch64_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/aarch64_unknown_linux_musl.rs index 7bbfc8ec0f7b0..f3682cbf6ebba 100644 --- a/compiler/rustc_target/src/spec/aarch64_unknown_linux_musl.rs +++ b/compiler/rustc_target/src/spec/aarch64_unknown_linux_musl.rs @@ -3,6 +3,7 @@ use crate::spec::{Target, TargetOptions}; pub fn target() -> Target { let mut base = super::linux_musl_base::opts(); base.max_atomic_width = Some(128); + base.features = "+outline-atomics".to_string(); Target { llvm_target: "aarch64-unknown-linux-musl".to_string(), diff --git a/src/test/assembly/asm/aarch64-outline-atomics.rs b/src/test/assembly/asm/aarch64-outline-atomics.rs new file mode 100644 index 0000000000000..a679f001960c6 --- /dev/null +++ b/src/test/assembly/asm/aarch64-outline-atomics.rs @@ -0,0 +1,15 @@ +// min-llvm-version: 12.0 +// assembly-output: emit-asm +// compile-flags: -O +// compile-flags: --target aarch64-unknown-linux-gnu +// needs-llvm-components: aarch64 + +#![crate_type = "rlib"] + +use std::sync::atomic::{AtomicI32, Ordering::*}; + +pub fn compare_exchange(a: &AtomicI32) { + // On AArch64 LLVM should outline atomic operations. + // CHECK: __aarch64_cas4_relax + let _ = a.compare_exchange(0, 10, Relaxed, Relaxed); +}