1 //===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// AMDGPU Machine Module Info.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
19 #include "llvm/ADT/None.h"
20 #include "llvm/ADT/Optional.h"
21 #include "llvm/CodeGen/MachineModuleInfo.h"
22 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
23 #include "llvm/IR/LLVMContext.h"
27 class AMDGPUMachineModuleInfo final
: public MachineModuleInfoELF
{
30 // All supported memory/synchronization scopes can be found here:
31 // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
33 /// Agent synchronization scope ID.
34 SyncScope::ID AgentSSID
;
35 /// Workgroup synchronization scope ID.
36 SyncScope::ID WorkgroupSSID
;
37 /// Wavefront synchronization scope ID.
38 SyncScope::ID WavefrontSSID
;
40 /// In AMDGPU target synchronization scopes are inclusive, meaning a
41 /// larger synchronization scope is inclusive of a smaller synchronization
44 /// \returns \p SSID's inclusion ordering, or "None" if \p SSID is not
45 /// supported by the AMDGPU target.
46 Optional
<uint8_t> getSyncScopeInclusionOrdering(SyncScope::ID SSID
) const {
47 if (SSID
== SyncScope::SingleThread
)
49 else if (SSID
== getWavefrontSSID())
51 else if (SSID
== getWorkgroupSSID())
53 else if (SSID
== getAgentSSID())
55 else if (SSID
== SyncScope::System
)
62 AMDGPUMachineModuleInfo(const MachineModuleInfo
&MMI
);
64 /// \returns Agent synchronization scope ID.
65 SyncScope::ID
getAgentSSID() const {
68 /// \returns Workgroup synchronization scope ID.
69 SyncScope::ID
getWorkgroupSSID() const {
72 /// \returns Wavefront synchronization scope ID.
73 SyncScope::ID
getWavefrontSSID() const {
77 /// In AMDGPU target synchronization scopes are inclusive, meaning a
78 /// larger synchronization scope is inclusive of a smaller synchronization
81 /// \returns True if synchronization scope \p A is larger than or equal to
82 /// synchronization scope \p B, false if synchronization scope \p A is smaller
83 /// than synchronization scope \p B, or "None" if either synchronization scope
84 /// \p A or \p B is not supported by the AMDGPU target.
85 Optional
<bool> isSyncScopeInclusion(SyncScope::ID A
, SyncScope::ID B
) const {
86 const auto &AIO
= getSyncScopeInclusionOrdering(A
);
87 const auto &BIO
= getSyncScopeInclusionOrdering(B
);
91 return AIO
.getValue() > BIO
.getValue();
95 } // end namespace llvm
97 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H