1e9a5a77eSKonstantin Zhuravlyov //===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
2e9a5a77eSKonstantin Zhuravlyov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e9a5a77eSKonstantin Zhuravlyov //
7e9a5a77eSKonstantin Zhuravlyov //===----------------------------------------------------------------------===//
8e9a5a77eSKonstantin Zhuravlyov //
9e9a5a77eSKonstantin Zhuravlyov /// \file
105f8f34e4SAdrian Prantl /// AMDGPU Machine Module Info.
11e9a5a77eSKonstantin Zhuravlyov ///
12e9a5a77eSKonstantin Zhuravlyov //
13e9a5a77eSKonstantin Zhuravlyov //===----------------------------------------------------------------------===//
14e9a5a77eSKonstantin Zhuravlyov 
15e9a5a77eSKonstantin Zhuravlyov #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
16e9a5a77eSKonstantin Zhuravlyov #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17e9a5a77eSKonstantin Zhuravlyov 
18e9a5a77eSKonstantin Zhuravlyov #include "llvm/CodeGen/MachineModuleInfoImpls.h"
19e9a5a77eSKonstantin Zhuravlyov 
20e9a5a77eSKonstantin Zhuravlyov namespace llvm {
21e9a5a77eSKonstantin Zhuravlyov 
22e9a5a77eSKonstantin Zhuravlyov class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {
23e9a5a77eSKonstantin Zhuravlyov private:
24e9a5a77eSKonstantin Zhuravlyov 
25e9a5a77eSKonstantin Zhuravlyov   // All supported memory/synchronization scopes can be found here:
26e9a5a77eSKonstantin Zhuravlyov   //   http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
27e9a5a77eSKonstantin Zhuravlyov 
2851809cbcSKonstantin Zhuravlyov   /// Agent synchronization scope ID (cross address space).
29e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID AgentSSID;
3051809cbcSKonstantin Zhuravlyov   /// Workgroup synchronization scope ID (cross address space).
31e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID WorkgroupSSID;
3251809cbcSKonstantin Zhuravlyov   /// Wavefront synchronization scope ID (cross address space).
33e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID WavefrontSSID;
3451809cbcSKonstantin Zhuravlyov   /// System synchronization scope ID (single address space).
3551809cbcSKonstantin Zhuravlyov   SyncScope::ID SystemOneAddressSpaceSSID;
3651809cbcSKonstantin Zhuravlyov   /// Agent synchronization scope ID (single address space).
3751809cbcSKonstantin Zhuravlyov   SyncScope::ID AgentOneAddressSpaceSSID;
3851809cbcSKonstantin Zhuravlyov   /// Workgroup synchronization scope ID (single address space).
3951809cbcSKonstantin Zhuravlyov   SyncScope::ID WorkgroupOneAddressSpaceSSID;
4051809cbcSKonstantin Zhuravlyov   /// Wavefront synchronization scope ID (single address space).
4151809cbcSKonstantin Zhuravlyov   SyncScope::ID WavefrontOneAddressSpaceSSID;
4251809cbcSKonstantin Zhuravlyov   /// Single thread synchronization scope ID (single address space).
4351809cbcSKonstantin Zhuravlyov   SyncScope::ID SingleThreadOneAddressSpaceSSID;
44e9a5a77eSKonstantin Zhuravlyov 
455f8f34e4SAdrian Prantl   /// In AMDGPU target synchronization scopes are inclusive, meaning a
46c8c9d4a0SKonstantin Zhuravlyov   /// larger synchronization scope is inclusive of a smaller synchronization
47c8c9d4a0SKonstantin Zhuravlyov   /// scope.
48c8c9d4a0SKonstantin Zhuravlyov   ///
49c8c9d4a0SKonstantin Zhuravlyov   /// \returns \p SSID's inclusion ordering, or "None" if \p SSID is not
50c8c9d4a0SKonstantin Zhuravlyov   /// supported by the AMDGPU target.
getSyncScopeInclusionOrdering(SyncScope::ID SSID)51c8c9d4a0SKonstantin Zhuravlyov   Optional<uint8_t> getSyncScopeInclusionOrdering(SyncScope::ID SSID) const {
5251809cbcSKonstantin Zhuravlyov     if (SSID == SyncScope::SingleThread ||
5351809cbcSKonstantin Zhuravlyov         SSID == getSingleThreadOneAddressSpaceSSID())
54c8c9d4a0SKonstantin Zhuravlyov       return 0;
5551809cbcSKonstantin Zhuravlyov     else if (SSID == getWavefrontSSID() ||
5651809cbcSKonstantin Zhuravlyov              SSID == getWavefrontOneAddressSpaceSSID())
57c8c9d4a0SKonstantin Zhuravlyov       return 1;
5851809cbcSKonstantin Zhuravlyov     else if (SSID == getWorkgroupSSID() ||
5951809cbcSKonstantin Zhuravlyov              SSID == getWorkgroupOneAddressSpaceSSID())
60c8c9d4a0SKonstantin Zhuravlyov       return 2;
6151809cbcSKonstantin Zhuravlyov     else if (SSID == getAgentSSID() ||
6251809cbcSKonstantin Zhuravlyov              SSID == getAgentOneAddressSpaceSSID())
63c8c9d4a0SKonstantin Zhuravlyov       return 3;
6451809cbcSKonstantin Zhuravlyov     else if (SSID == SyncScope::System ||
6551809cbcSKonstantin Zhuravlyov              SSID == getSystemOneAddressSpaceSSID())
66c8c9d4a0SKonstantin Zhuravlyov       return 4;
67c8c9d4a0SKonstantin Zhuravlyov 
68c8c9d4a0SKonstantin Zhuravlyov     return None;
69c8c9d4a0SKonstantin Zhuravlyov   }
70c8c9d4a0SKonstantin Zhuravlyov 
7151809cbcSKonstantin Zhuravlyov   /// \returns True if \p SSID is restricted to single address space, false
7251809cbcSKonstantin Zhuravlyov   /// otherwise
isOneAddressSpace(SyncScope::ID SSID)7351809cbcSKonstantin Zhuravlyov   bool isOneAddressSpace(SyncScope::ID SSID) const {
7451809cbcSKonstantin Zhuravlyov     return SSID == getSingleThreadOneAddressSpaceSSID() ||
7551809cbcSKonstantin Zhuravlyov         SSID == getWavefrontOneAddressSpaceSSID() ||
7651809cbcSKonstantin Zhuravlyov         SSID == getWorkgroupOneAddressSpaceSSID() ||
7751809cbcSKonstantin Zhuravlyov         SSID == getAgentOneAddressSpaceSSID() ||
7851809cbcSKonstantin Zhuravlyov         SSID == getSystemOneAddressSpaceSSID();
7951809cbcSKonstantin Zhuravlyov   }
8051809cbcSKonstantin Zhuravlyov 
81e9a5a77eSKonstantin Zhuravlyov public:
82e9a5a77eSKonstantin Zhuravlyov   AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);
83e9a5a77eSKonstantin Zhuravlyov 
8451809cbcSKonstantin Zhuravlyov   /// \returns Agent synchronization scope ID (cross address space).
getAgentSSID()85e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID getAgentSSID() const {
86e9a5a77eSKonstantin Zhuravlyov     return AgentSSID;
87e9a5a77eSKonstantin Zhuravlyov   }
8851809cbcSKonstantin Zhuravlyov   /// \returns Workgroup synchronization scope ID (cross address space).
getWorkgroupSSID()89e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID getWorkgroupSSID() const {
90e9a5a77eSKonstantin Zhuravlyov     return WorkgroupSSID;
91e9a5a77eSKonstantin Zhuravlyov   }
9251809cbcSKonstantin Zhuravlyov   /// \returns Wavefront synchronization scope ID (cross address space).
getWavefrontSSID()93e9a5a77eSKonstantin Zhuravlyov   SyncScope::ID getWavefrontSSID() const {
94e9a5a77eSKonstantin Zhuravlyov     return WavefrontSSID;
95e9a5a77eSKonstantin Zhuravlyov   }
9651809cbcSKonstantin Zhuravlyov   /// \returns System synchronization scope ID (single address space).
getSystemOneAddressSpaceSSID()9751809cbcSKonstantin Zhuravlyov   SyncScope::ID getSystemOneAddressSpaceSSID() const {
9851809cbcSKonstantin Zhuravlyov     return SystemOneAddressSpaceSSID;
9951809cbcSKonstantin Zhuravlyov   }
10051809cbcSKonstantin Zhuravlyov   /// \returns Agent synchronization scope ID (single address space).
getAgentOneAddressSpaceSSID()10151809cbcSKonstantin Zhuravlyov   SyncScope::ID getAgentOneAddressSpaceSSID() const {
10251809cbcSKonstantin Zhuravlyov     return AgentOneAddressSpaceSSID;
10351809cbcSKonstantin Zhuravlyov   }
10451809cbcSKonstantin Zhuravlyov   /// \returns Workgroup synchronization scope ID (single address space).
getWorkgroupOneAddressSpaceSSID()10551809cbcSKonstantin Zhuravlyov   SyncScope::ID getWorkgroupOneAddressSpaceSSID() const {
10651809cbcSKonstantin Zhuravlyov     return WorkgroupOneAddressSpaceSSID;
10751809cbcSKonstantin Zhuravlyov   }
10851809cbcSKonstantin Zhuravlyov   /// \returns Wavefront synchronization scope ID (single address space).
getWavefrontOneAddressSpaceSSID()10951809cbcSKonstantin Zhuravlyov   SyncScope::ID getWavefrontOneAddressSpaceSSID() const {
11051809cbcSKonstantin Zhuravlyov     return WavefrontOneAddressSpaceSSID;
11151809cbcSKonstantin Zhuravlyov   }
11251809cbcSKonstantin Zhuravlyov   /// \returns Single thread synchronization scope ID (single address space).
getSingleThreadOneAddressSpaceSSID()11351809cbcSKonstantin Zhuravlyov   SyncScope::ID getSingleThreadOneAddressSpaceSSID() const {
11451809cbcSKonstantin Zhuravlyov     return SingleThreadOneAddressSpaceSSID;
11551809cbcSKonstantin Zhuravlyov   }
116c8c9d4a0SKonstantin Zhuravlyov 
1175f8f34e4SAdrian Prantl   /// In AMDGPU target synchronization scopes are inclusive, meaning a
118c8c9d4a0SKonstantin Zhuravlyov   /// larger synchronization scope is inclusive of a smaller synchronization
119c8c9d4a0SKonstantin Zhuravlyov   /// scope.
120c8c9d4a0SKonstantin Zhuravlyov   ///
121c8c9d4a0SKonstantin Zhuravlyov   /// \returns True if synchronization scope \p A is larger than or equal to
122c8c9d4a0SKonstantin Zhuravlyov   /// synchronization scope \p B, false if synchronization scope \p A is smaller
123c8c9d4a0SKonstantin Zhuravlyov   /// than synchronization scope \p B, or "None" if either synchronization scope
124c8c9d4a0SKonstantin Zhuravlyov   /// \p A or \p B is not supported by the AMDGPU target.
isSyncScopeInclusion(SyncScope::ID A,SyncScope::ID B)125c8c9d4a0SKonstantin Zhuravlyov   Optional<bool> isSyncScopeInclusion(SyncScope::ID A, SyncScope::ID B) const {
126c8c9d4a0SKonstantin Zhuravlyov     const auto &AIO = getSyncScopeInclusionOrdering(A);
127c8c9d4a0SKonstantin Zhuravlyov     const auto &BIO = getSyncScopeInclusionOrdering(B);
128c8c9d4a0SKonstantin Zhuravlyov     if (!AIO || !BIO)
129c8c9d4a0SKonstantin Zhuravlyov       return None;
130c8c9d4a0SKonstantin Zhuravlyov 
13151809cbcSKonstantin Zhuravlyov     bool IsAOneAddressSpace = isOneAddressSpace(A);
13251809cbcSKonstantin Zhuravlyov     bool IsBOneAddressSpace = isOneAddressSpace(B);
13351809cbcSKonstantin Zhuravlyov 
134*611ffcf4SKazu Hirata     return AIO.value() >= BIO.value() &&
13551809cbcSKonstantin Zhuravlyov            (IsAOneAddressSpace == IsBOneAddressSpace || !IsAOneAddressSpace);
136c8c9d4a0SKonstantin Zhuravlyov   }
137e9a5a77eSKonstantin Zhuravlyov };
138e9a5a77eSKonstantin Zhuravlyov 
139e9a5a77eSKonstantin Zhuravlyov } // end namespace llvm
140e9a5a77eSKonstantin Zhuravlyov 
141e9a5a77eSKonstantin Zhuravlyov #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
142