blob: 2b0b8b42acfed4410a7cb18a26069f1242f85006 [file] [log] [blame]
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001//===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00006//
7//===----------------------------------------------------------------------===//
8//
9/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000010/// AMDGPU Machine Module Info.
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000011///
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000018#include "llvm/ADT/None.h"
19#include "llvm/ADT/Optional.h"
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000020#include "llvm/CodeGen/MachineModuleInfo.h"
21#include "llvm/CodeGen/MachineModuleInfoImpls.h"
22#include "llvm/IR/LLVMContext.h"
23
24namespace llvm {
25
26class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {
27private:
28
29 // All supported memory/synchronization scopes can be found here:
30 // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
31
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000032 /// Agent synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000033 SyncScope::ID AgentSSID;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000034 /// Workgroup synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000035 SyncScope::ID WorkgroupSSID;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000036 /// Wavefront synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000037 SyncScope::ID WavefrontSSID;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000038 /// System synchronization scope ID (single address space).
39 SyncScope::ID SystemOneAddressSpaceSSID;
40 /// Agent synchronization scope ID (single address space).
41 SyncScope::ID AgentOneAddressSpaceSSID;
42 /// Workgroup synchronization scope ID (single address space).
43 SyncScope::ID WorkgroupOneAddressSpaceSSID;
44 /// Wavefront synchronization scope ID (single address space).
45 SyncScope::ID WavefrontOneAddressSpaceSSID;
46 /// Single thread synchronization scope ID (single address space).
47 SyncScope::ID SingleThreadOneAddressSpaceSSID;
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000048
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000049 /// In AMDGPU target synchronization scopes are inclusive, meaning a
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000050 /// larger synchronization scope is inclusive of a smaller synchronization
51 /// scope.
52 ///
53 /// \returns \p SSID's inclusion ordering, or "None" if \p SSID is not
54 /// supported by the AMDGPU target.
55 Optional<uint8_t> getSyncScopeInclusionOrdering(SyncScope::ID SSID) const {
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000056 if (SSID == SyncScope::SingleThread ||
57 SSID == getSingleThreadOneAddressSpaceSSID())
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000058 return 0;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000059 else if (SSID == getWavefrontSSID() ||
60 SSID == getWavefrontOneAddressSpaceSSID())
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000061 return 1;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000062 else if (SSID == getWorkgroupSSID() ||
63 SSID == getWorkgroupOneAddressSpaceSSID())
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000064 return 2;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000065 else if (SSID == getAgentSSID() ||
66 SSID == getAgentOneAddressSpaceSSID())
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000067 return 3;
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000068 else if (SSID == SyncScope::System ||
69 SSID == getSystemOneAddressSpaceSSID())
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000070 return 4;
71
72 return None;
73 }
74
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000075 /// \returns True if \p SSID is restricted to single address space, false
76 /// otherwise
77 bool isOneAddressSpace(SyncScope::ID SSID) const {
78 return SSID == getSingleThreadOneAddressSpaceSSID() ||
79 SSID == getWavefrontOneAddressSpaceSSID() ||
80 SSID == getWorkgroupOneAddressSpaceSSID() ||
81 SSID == getAgentOneAddressSpaceSSID() ||
82 SSID == getSystemOneAddressSpaceSSID();
83 }
84
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000085public:
86 AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);
87
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000088 /// \returns Agent synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000089 SyncScope::ID getAgentSSID() const {
90 return AgentSSID;
91 }
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000092 /// \returns Workgroup synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000093 SyncScope::ID getWorkgroupSSID() const {
94 return WorkgroupSSID;
95 }
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +000096 /// \returns Wavefront synchronization scope ID (cross address space).
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000097 SyncScope::ID getWavefrontSSID() const {
98 return WavefrontSSID;
99 }
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +0000100 /// \returns System synchronization scope ID (single address space).
101 SyncScope::ID getSystemOneAddressSpaceSSID() const {
102 return SystemOneAddressSpaceSSID;
103 }
104 /// \returns Agent synchronization scope ID (single address space).
105 SyncScope::ID getAgentOneAddressSpaceSSID() const {
106 return AgentOneAddressSpaceSSID;
107 }
108 /// \returns Workgroup synchronization scope ID (single address space).
109 SyncScope::ID getWorkgroupOneAddressSpaceSSID() const {
110 return WorkgroupOneAddressSpaceSSID;
111 }
112 /// \returns Wavefront synchronization scope ID (single address space).
113 SyncScope::ID getWavefrontOneAddressSpaceSSID() const {
114 return WavefrontOneAddressSpaceSSID;
115 }
116 /// \returns Single thread synchronization scope ID (single address space).
117 SyncScope::ID getSingleThreadOneAddressSpaceSSID() const {
118 return SingleThreadOneAddressSpaceSSID;
119 }
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +0000120
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000121 /// In AMDGPU target synchronization scopes are inclusive, meaning a
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +0000122 /// larger synchronization scope is inclusive of a smaller synchronization
123 /// scope.
124 ///
125 /// \returns True if synchronization scope \p A is larger than or equal to
126 /// synchronization scope \p B, false if synchronization scope \p A is smaller
127 /// than synchronization scope \p B, or "None" if either synchronization scope
128 /// \p A or \p B is not supported by the AMDGPU target.
129 Optional<bool> isSyncScopeInclusion(SyncScope::ID A, SyncScope::ID B) const {
130 const auto &AIO = getSyncScopeInclusionOrdering(A);
131 const auto &BIO = getSyncScopeInclusionOrdering(B);
132 if (!AIO || !BIO)
133 return None;
134
Konstantin Zhuravlyov51809cb2019-03-25 20:50:21 +0000135 bool IsAOneAddressSpace = isOneAddressSpace(A);
136 bool IsBOneAddressSpace = isOneAddressSpace(B);
137
138 return AIO.getValue() >= BIO.getValue() &&
139 (IsAOneAddressSpace == IsBOneAddressSpace || !IsAOneAddressSpace);
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +0000140 }
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +0000141};
142
143} // end namespace llvm
144
145#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H