Author: wmi Date: Fri Sep 22 09:30:00 2017 New Revision: 313992 URL: http://llvm.org/viewvc/llvm-project?rev=313992&view=rev Log: [Atomic][X8664] set max atomic inline width according to the target
This is to fix PR31620. MaxAtomicInlineWidth is set to 128 for x86_64. However for target without cx16 support, 128 atomic operation will generate __sync_* libcalls. The patch set MaxAtomicInlineWidth to 64 if the target doesn't support cx16. Differential Revision: https://reviews.llvm.org/D38046 Added: cfe/trunk/test/CodeGenCXX/atomic-inline.cpp Modified: cfe/trunk/include/clang/Basic/TargetInfo.h cfe/trunk/lib/Basic/Targets.cpp cfe/trunk/lib/Basic/Targets/X86.h cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp cfe/trunk/test/OpenMP/atomic_read_codegen.c cfe/trunk/test/OpenMP/atomic_update_codegen.cpp cfe/trunk/test/OpenMP/atomic_write_codegen.c Modified: cfe/trunk/include/clang/Basic/TargetInfo.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TargetInfo.h?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/TargetInfo.h (original) +++ cfe/trunk/include/clang/Basic/TargetInfo.h Fri Sep 22 09:30:00 2017 @@ -448,6 +448,9 @@ public: /// \brief Return the maximum width lock-free atomic operation which can be /// inlined given the supported features of the given target. unsigned getMaxAtomicInlineWidth() const { return MaxAtomicInlineWidth; } + /// \brief Set the maximum inline or promote width lock-free atomic operation + /// for the given target. + virtual void setMaxAtomicWidth() {} /// \brief Returns true if the given target supports lock-free atomic /// operations at the specified width and alignment. virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits, Modified: cfe/trunk/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets.cpp (original) +++ cfe/trunk/lib/Basic/Targets.cpp Fri Sep 22 09:30:00 2017 @@ -620,6 +620,7 @@ TargetInfo::CreateTargetInfo(Diagnostics Target->setSupportedOpenCLOpts(); Target->setOpenCLExtensionOpts(); + Target->setMaxAtomicWidth(); if (!Target->validateTarget(Diags)) return nullptr; Modified: cfe/trunk/lib/Basic/Targets/X86.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/X86.h?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets/X86.h (original) +++ cfe/trunk/lib/Basic/Targets/X86.h Fri Sep 22 09:30:00 2017 @@ -814,7 +814,7 @@ public: // x86-64 has atomics up to 16 bytes. MaxAtomicPromoteWidth = 128; - MaxAtomicInlineWidth = 128; + MaxAtomicInlineWidth = 64; } BuiltinVaListKind getBuiltinVaListKind() const override { @@ -872,6 +872,12 @@ public: HasSizeMismatch); } + void setMaxAtomicWidth() override { + if (hasFeature("cx16")) + MaxAtomicInlineWidth = 128; + return; + } + ArrayRef<Builtin::Info> getTargetBuiltins() const override; }; Added: cfe/trunk/test/CodeGenCXX/atomic-inline.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/atomic-inline.cpp?rev=313992&view=auto ============================================================================== --- cfe/trunk/test/CodeGenCXX/atomic-inline.cpp (added) +++ cfe/trunk/test/CodeGenCXX/atomic-inline.cpp Fri Sep 22 09:30:00 2017 @@ -0,0 +1,69 @@ +// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s +// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu -target-cpu core2 | FileCheck %s --check-prefix=CORE2 +// Check the atomic code generation for cpu targets w/wo cx16 support. + +struct alignas(8) AM8 { + int f1, f2; +}; +AM8 m8; +AM8 load8() { + AM8 am; + // CHECK-LABEL: @_Z5load8v + // CHECK: load atomic i64, {{.*}} monotonic + // CORE2-LABEL: @_Z5load8v + // CORE2: load atomic i64, {{.*}} monotonic + __atomic_load(&m8, &am, 0); + return am; +} + +AM8 s8; +void store8() { + // CHECK-LABEL: @_Z6store8v + // CHECK: store atomic i64 {{.*}} monotonic + // CORE2-LABEL: @_Z6store8v + // CORE2: store atomic i64 {{.*}} monotonic + __atomic_store(&m8, &s8, 0); +} + +bool cmpxchg8() { + AM8 am; + // CHECK-LABEL: @_Z8cmpxchg8v + // CHECK: cmpxchg i64* {{.*}} monotonic + // CORE2-LABEL: @_Z8cmpxchg8v + // CORE2: cmpxchg i64* {{.*}} monotonic + return __atomic_compare_exchange(&m8, &s8, &am, 0, 0, 0); +} + +struct alignas(16) AM16 { + long f1, f2; +}; + +AM16 m16; +AM16 load16() { + AM16 am; + // CHECK-LABEL: @_Z6load16v + // CHECK: call void @__atomic_load + // CORE2-LABEL: @_Z6load16v + // CORE2: load atomic i128, {{.*}} monotonic + __atomic_load(&m16, &am, 0); + return am; +} + +AM16 s16; +void store16() { + // CHECK-LABEL: @_Z7store16v + // CHECK: call void @__atomic_store + // CORE2-LABEL: @_Z7store16v + // CORE2: store atomic i128 {{.*}} monotonic + __atomic_store(&m16, &s16, 0); +} + +bool cmpxchg16() { + AM16 am; + // CHECK-LABEL: @_Z9cmpxchg16v + // CHECK: call zeroext i1 @__atomic_compare_exchange + // CORE2-LABEL: @_Z9cmpxchg16v + // CORE2: cmpxchg i128* {{.*}} monotonic + return __atomic_compare_exchange(&m16, &s16, &am, 0, 0, 0); +} + Modified: cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp Fri Sep 22 09:30:00 2017 @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -target-cpu core2 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s // expected-no-diagnostics #ifndef HEADER #define HEADER Modified: cfe/trunk/test/OpenMP/atomic_read_codegen.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_read_codegen.c?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/atomic_read_codegen.c (original) +++ cfe/trunk/test/OpenMP/atomic_read_codegen.c Fri Sep 22 09:30:00 2017 @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -target-cpu core2 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s // expected-no-diagnostics // REQUIRES: x86-registered-target #ifndef HEADER Modified: cfe/trunk/test/OpenMP/atomic_update_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_update_codegen.cpp?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/atomic_update_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/atomic_update_codegen.cpp Fri Sep 22 09:30:00 2017 @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -target-cpu core2 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s // expected-no-diagnostics #ifndef HEADER #define HEADER Modified: cfe/trunk/test/OpenMP/atomic_write_codegen.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_write_codegen.c?rev=313992&r1=313991&r2=313992&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/atomic_write_codegen.c (original) +++ cfe/trunk/test/OpenMP/atomic_write_codegen.c Fri Sep 22 09:30:00 2017 @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -target-cpu core2 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -target-cpu core2 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s // expected-no-diagnostics // REQUIRES: x86-registered-target #ifndef HEADER _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits