1 //===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// AMDGPU Machine Module Info.
11 ///
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
16 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17 
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"
23 
24 namespace llvm {
25 
26 class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {
27 private:
28 
29   // All supported memory/synchronization scopes can be found here:
30   //   http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
31 
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;
38 
39   /// In AMDGPU target synchronization scopes are inclusive, meaning a
40   /// larger synchronization scope is inclusive of a smaller synchronization
41   /// scope.
42   ///
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)
47       return 0;
48     else if (SSID == getWavefrontSSID())
49       return 1;
50     else if (SSID == getWorkgroupSSID())
51       return 2;
52     else if (SSID == getAgentSSID())
53       return 3;
54     else if (SSID == SyncScope::System)
55       return 4;
56 
57     return None;
58   }
59 
60 public:
61   AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);
62 
63   /// \returns Agent synchronization scope ID.
64   SyncScope::ID getAgentSSID() const {
65     return AgentSSID;
66   }
67   /// \returns Workgroup synchronization scope ID.
68   SyncScope::ID getWorkgroupSSID() const {
69     return WorkgroupSSID;
70   }
71   /// \returns Wavefront synchronization scope ID.
72   SyncScope::ID getWavefrontSSID() const {
73     return WavefrontSSID;
74   }
75 
76   /// In AMDGPU target synchronization scopes are inclusive, meaning a
77   /// larger synchronization scope is inclusive of a smaller synchronization
78   /// scope.
79   ///
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);
87     if (!AIO || !BIO)
88       return None;
89 
90     return AIO.getValue() > BIO.getValue();
91   }
92 };
93 
94 } // end namespace llvm
95 
96 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
97