summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic
diff options
context:
space:
mode:
authorWei Mi <wmi@google.com>2017-09-22 16:30:00 +0000
committerWei Mi <wmi@google.com>2017-09-22 16:30:00 +0000
commitb086289787d62278089502d222135e098171715b (patch)
tree4526d8f35bdefab105c4fcdbb12b33eef0466fd4 /clang/lib/Basic
parentb2eda767fe162173bd611376226ab92d018fec69 (diff)
downloadbcm5719-llvm-b086289787d62278089502d222135e098171715b.tar.gz
bcm5719-llvm-b086289787d62278089502d222135e098171715b.zip
[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 llvm-svn: 313992
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r--clang/lib/Basic/Targets.cpp1
-rw-r--r--clang/lib/Basic/Targets/X86.h8
2 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 3c1c08bb057..a9a5f4ddcfb 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -620,6 +620,7 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Target->setSupportedOpenCLOpts();
Target->setOpenCLExtensionOpts();
+ Target->setMaxAtomicWidth();
if (!Target->validateTarget(Diags))
return nullptr;
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index 21ae4ff4e67..a08eeec59dc 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -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;
};
OpenPOWER on IntegriCloud