From 09e469bb95e43671457af4f55d39e2b409a9c650 Mon Sep 17 00:00:00 2001 From: Chris Dewhurst <chris.dewhurst@lero.ie> Date: Tue, 28 Jun 2016 12:55:55 +0000 Subject: [PATCH] [SPARC] Allows inlining of atomics for Sparc32 with appropriate store barrier. The final change is required to extend the back-end's AtomicExpandPass that was implemented for Sparc (64 bit) and later extended for Sparc (32 bit). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274012 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 1 + test/CodeGen/atomics-inlining.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 56a19a03248..91cc9867aff 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6601,6 +6601,7 @@ public: PtrDiffType = SignedLong; break; } + MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; } void getTargetDefines(const LangOptions &Opts, diff --git a/test/CodeGen/atomics-inlining.c b/test/CodeGen/atomics-inlining.c index 23a79a2d28f..4974f22e3a4 100644 --- a/test/CodeGen/atomics-inlining.c +++ b/test/CodeGen/atomics-inlining.c @@ -3,6 +3,7 @@ // 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 unsigned char c1, c2; unsigned short s1, s2; @@ -90,4 +91,16 @@ void test1(void) { // MIPS64: store atomic i64 {{.*}}, i64* @ll1 seq_cst // MIPS64: call void @__atomic_load(i64 zeroext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0) // MIPS64: call void @__atomic_store(i64 zeroext 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-LABEL: define void @test1 +// SPARC: = load atomic i8, i8* @c1 seq_cst +// SPARC: store atomic i8 {{.*}}, i8* @c1 seq_cst +// SPARC: = load atomic i16, i16* @s1 seq_cst +// 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) } -- GitLab