From: Douglas Katzman Date: Wed, 9 Nov 2016 15:43:51 +0000 (+0000) Subject: [Sparc] LLONG is not lock-free atomic on v8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a53ee6bfa387972e87b9f89c9cec3339b80ac8a1;p=clang [Sparc] LLONG is not lock-free atomic on v8 Differential Revision: https://reviews.llvm.org/D26286 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@286376 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index ad1e5d9502..d60f892483 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6803,7 +6803,10 @@ public: PtrDiffType = SignedLong; break; } - MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; + // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops + // on up to 64 bits. + MaxAtomicPromoteWidth = 64; + MaxAtomicInlineWidth = 32; } void getTargetDefines(const LangOptions &Opts, diff --git a/test/CodeGen/atomics-inlining.c b/test/CodeGen/atomics-inlining.c index 4974f22e3a..907774626c 100644 --- a/test/CodeGen/atomics-inlining.c +++ b/test/CodeGen/atomics-inlining.c @@ -3,7 +3,8 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix=PPC64 // RUN: %clang_cc1 -triple mipsel-linux-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS32 // RUN: %clang_cc1 -triple mips64el-linux-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64 -// RUN: %clang_cc1 -triple sparc-unknown-eabi -emit-llvm %s -o - | FileCheck %s -check-prefix=SPARC +// RUN: %clang_cc1 -triple sparc-unknown-eabi -emit-llvm %s -o - | FileCheck %s -check-prefix=SPARCV8 -check-prefix=SPARC +// RUN: %clang_cc1 -triple sparcv9-unknown-eabi -emit-llvm %s -o - | FileCheck %s -check-prefix=SPARCV9 -check-prefix=SPARC unsigned char c1, c2; unsigned short s1, s2; @@ -99,8 +100,10 @@ void test1(void) { // SPARC: store atomic i16 {{.*}}, i16* @s1 seq_cst // SPARC: = load atomic i32, i32* @i1 seq_cst // SPARC: store atomic i32 {{.*}}, i32* @i1 seq_cst -// SPARC: = load atomic i64, i64* @ll1 seq_cst -// SPARC: store atomic i64 {{.*}}, i64* @ll1 seq_cst -// SPARC: call void @__atomic_load(i32 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) -// SPARC: call void @__atomic_store(i32 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) +// SPARCV8: call i64 @__atomic_load_8(i8* bitcast (i64* @ll1 to i8*) +// SPARCV8: call void @__atomic_store_8(i8* bitcast (i64* @ll1 to i8*), i64 +// SPARCV9: load atomic i64, i64* @ll1 seq_cst, align 8 +// SPARCV9: store atomic i64 %7, i64* @ll1 seq_cst, align 8 +// SPARCV8: call void @__atomic_load(i32 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) +// SPARCV8: call void @__atomic_store(i32 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) } diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index c541faa7cc..1fe239cdae 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -6913,6 +6913,7 @@ // SPARC:#define __FLT_MIN_EXP__ (-125) // SPARC:#define __FLT_MIN__ 1.17549435e-38F // SPARC:#define __FLT_RADIX__ 2 +// SPARC:#define __GCC_ATOMIC_LLONG_LOCK_FREE 1 // SPARC:#define __INT16_C_SUFFIX__ // SPARC:#define __INT16_FMTd__ "hd" // SPARC:#define __INT16_FMTi__ "hi"