1 //===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// AMDGPU Machine Module Info.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
16 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
18 #include "llvm/ADT/None.h"
19 #include "llvm/ADT/Optional.h"
20 #include "llvm/CodeGen/MachineModuleInfo.h"
21 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
22 #include "llvm/IR/LLVMContext.h"
26 class AMDGPUMachineModuleInfo final
: public MachineModuleInfoELF
{
29 // All supported memory/synchronization scopes can be found here:
30 // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
32 /// Agent synchronization scope ID.
33 SyncScope::ID AgentSSID
;
34 /// Workgroup synchronization scope ID.
35 SyncScope::ID WorkgroupSSID
;
36 /// Wavefront synchronization scope ID.
37 SyncScope::ID WavefrontSSID
;
39 /// In AMDGPU target synchronization scopes are inclusive, meaning a
40 /// larger synchronization scope is inclusive of a smaller synchronization
43 /// \returns \p SSID's inclusion ordering, or "None" if \p SSID is not
44 /// supported by the AMDGPU target.
45 Optional
<uint8_t> getSyncScopeInclusionOrdering(SyncScope::ID SSID
) const {
46 if (SSID
== SyncScope::SingleThread
)
48 else if (SSID
== getWavefrontSSID())
50 else if (SSID
== getWorkgroupSSID())
52 else if (SSID
== getAgentSSID())
54 else if (SSID
== SyncScope::System
)
61 AMDGPUMachineModuleInfo(const MachineModuleInfo
&MMI
);
63 /// \returns Agent synchronization scope ID.
64 SyncScope::ID
getAgentSSID() const {
67 /// \returns Workgroup synchronization scope ID.
68 SyncScope::ID
getWorkgroupSSID() const {
71 /// \returns Wavefront synchronization scope ID.
72 SyncScope::ID
getWavefrontSSID() const {
76 /// In AMDGPU target synchronization scopes are inclusive, meaning a
77 /// larger synchronization scope is inclusive of a smaller synchronization
80 /// \returns True if synchronization scope \p A is larger than or equal to
81 /// synchronization scope \p B, false if synchronization scope \p A is smaller
82 /// than synchronization scope \p B, or "None" if either synchronization scope
83 /// \p A or \p B is not supported by the AMDGPU target.
84 Optional
<bool> isSyncScopeInclusion(SyncScope::ID A
, SyncScope::ID B
) const {
85 const auto &AIO
= getSyncScopeInclusionOrdering(A
);
86 const auto &BIO
= getSyncScopeInclusionOrdering(B
);
90 return AIO
.getValue() > BIO
.getValue();
94 } // end namespace llvm
96 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H