blob: 1219ab26fb69ed025bad1d4eb895c19a8d3428f3 [file] [log] [blame]
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001//===--- AMDGPUMachineModuleInfo.h ------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// AMDGPU Machine Module Info.
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000012///
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
18
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000019#include "llvm/ADT/None.h"
20#include "llvm/ADT/Optional.h"
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000021#include "llvm/CodeGen/MachineModuleInfo.h"
22#include "llvm/CodeGen/MachineModuleInfoImpls.h"
23#include "llvm/IR/LLVMContext.h"
24
25namespace llvm {
26
27class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {
28private:
29
30 // All supported memory/synchronization scopes can be found here:
31 // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
32
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000033 /// Agent synchronization scope ID.
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000034 SyncScope::ID AgentSSID;
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000035 /// Workgroup synchronization scope ID.
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000036 SyncScope::ID WorkgroupSSID;
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000037 /// Wavefront synchronization scope ID.
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000038 SyncScope::ID WavefrontSSID;
39
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000040 /// In AMDGPU target synchronization scopes are inclusive, meaning a
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000041 /// larger synchronization scope is inclusive of a smaller synchronization
42 /// scope.
43 ///
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)
48 return 0;
49 else if (SSID == getWavefrontSSID())
50 return 1;
51 else if (SSID == getWorkgroupSSID())
52 return 2;
53 else if (SSID == getAgentSSID())
54 return 3;
55 else if (SSID == SyncScope::System)
56 return 4;
57
58 return None;
59 }
60
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000061public:
62 AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);
63
64 /// \returns Agent synchronization scope ID.
65 SyncScope::ID getAgentSSID() const {
66 return AgentSSID;
67 }
68 /// \returns Workgroup synchronization scope ID.
69 SyncScope::ID getWorkgroupSSID() const {
70 return WorkgroupSSID;
71 }
72 /// \returns Wavefront synchronization scope ID.
73 SyncScope::ID getWavefrontSSID() const {
74 return WavefrontSSID;
75 }
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000076
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000077 /// In AMDGPU target synchronization scopes are inclusive, meaning a
Konstantin Zhuravlyovc8c9d4a2017-09-07 16:14:21 +000078 /// larger synchronization scope is inclusive of a smaller synchronization
79 /// scope.
80 ///
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);
88 if (!AIO || !BIO)
89 return None;
90
91 return AIO.getValue() > BIO.getValue();
92 }
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +000093};
94
95} // end namespace llvm
96
97#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H