LLVM  8.0.1
AMDGPUMachineModuleInfo.h
Go to the documentation of this file.
1 //===--- 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
11 /// AMDGPU Machine Module Info.
12 ///
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
17 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
18 
19 #include "llvm/ADT/None.h"
20 #include "llvm/ADT/Optional.h"
23 #include "llvm/IR/LLVMContext.h"
24 
25 namespace llvm {
26 
28 private:
29 
30  // All supported memory/synchronization scopes can be found here:
31  // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
32 
33  /// Agent synchronization scope ID.
34  SyncScope::ID AgentSSID;
35  /// Workgroup synchronization scope ID.
36  SyncScope::ID WorkgroupSSID;
37  /// Wavefront synchronization scope ID.
38  SyncScope::ID WavefrontSSID;
39 
40  /// In AMDGPU target synchronization scopes are inclusive, meaning a
41  /// 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 
61 public:
63 
64  /// \returns Agent synchronization scope ID.
66  return AgentSSID;
67  }
68  /// \returns Workgroup synchronization scope ID.
70  return WorkgroupSSID;
71  }
72  /// \returns Wavefront synchronization scope ID.
74  return WavefrontSSID;
75  }
76 
77  /// In AMDGPU target synchronization scopes are inclusive, meaning a
78  /// 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.
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  }
93 };
94 
95 } // end namespace llvm
96 
97 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
Optional< bool > isSyncScopeInclusion(SyncScope::ID A, SyncScope::ID B) const
In AMDGPU target synchronization scopes are inclusive, meaning a larger synchronization scope is incl...
This class represents lattice values for constants.
Definition: AllocatorList.h:24
SyncScope::ID getWavefrontSSID() const
SyncScope::ID getWorkgroupSSID() const
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation for ELF targets.
Synchronized with respect to signal handlers executing in the same thread.
Definition: LLVMContext.h:56
AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI)
Synchronized with respect to all concurrently executing threads.
Definition: LLVMContext.h:59
This class contains meta information specific to a module.