159 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file10/// AMDGPU Machine Module Info.11///12//13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H17 18#include "llvm/CodeGen/MachineModuleInfoImpls.h"19#include "llvm/IR/LLVMContext.h"20 21namespace llvm {22 23class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {24private:25 26 // All supported memory/synchronization scopes can be found here:27 // http://llvm.org/docs/AMDGPUUsage.html#memory-scopes28 29 /// Agent synchronization scope ID (cross address space).30 SyncScope::ID AgentSSID;31 /// Workgroup synchronization scope ID (cross address space).32 SyncScope::ID WorkgroupSSID;33 /// Wavefront synchronization scope ID (cross address space).34 SyncScope::ID WavefrontSSID;35 /// Cluster synchronization scope ID (cross address space).36 SyncScope::ID ClusterSSID;37 /// System synchronization scope ID (single address space).38 SyncScope::ID SystemOneAddressSpaceSSID;39 /// Agent synchronization scope ID (single address space).40 SyncScope::ID AgentOneAddressSpaceSSID;41 /// Workgroup synchronization scope ID (single address space).42 SyncScope::ID WorkgroupOneAddressSpaceSSID;43 /// Wavefront synchronization scope ID (single address space).44 SyncScope::ID WavefrontOneAddressSpaceSSID;45 /// Single thread synchronization scope ID (single address space).46 SyncScope::ID SingleThreadOneAddressSpaceSSID;47 /// Cluster synchronization scope ID (single address space).48 SyncScope::ID ClusterOneAddressSpaceSSID;49 50 /// In AMDGPU target synchronization scopes are inclusive, meaning a51 /// larger synchronization scope is inclusive of a smaller synchronization52 /// scope.53 ///54 /// \returns \p SSID's inclusion ordering, or "std::nullopt" if \p SSID is not55 /// supported by the AMDGPU target.56 std::optional<uint8_t>57 getSyncScopeInclusionOrdering(SyncScope::ID SSID) const {58 if (SSID == SyncScope::SingleThread ||59 SSID == getSingleThreadOneAddressSpaceSSID())60 return 0;61 else if (SSID == getWavefrontSSID() ||62 SSID == getWavefrontOneAddressSpaceSSID())63 return 1;64 else if (SSID == getWorkgroupSSID() ||65 SSID == getWorkgroupOneAddressSpaceSSID())66 return 2;67 else if (SSID == getClusterSSID() ||68 SSID == getClusterOneAddressSpaceSSID())69 return 3;70 else if (SSID == getAgentSSID() ||71 SSID == getAgentOneAddressSpaceSSID())72 return 4;73 else if (SSID == SyncScope::System ||74 SSID == getSystemOneAddressSpaceSSID())75 return 5;76 77 return std::nullopt;78 }79 80 /// \returns True if \p SSID is restricted to single address space, false81 /// otherwise82 bool isOneAddressSpace(SyncScope::ID SSID) const {83 return SSID == getClusterOneAddressSpaceSSID() ||84 SSID == getSingleThreadOneAddressSpaceSSID() ||85 SSID == getWavefrontOneAddressSpaceSSID() ||86 SSID == getWorkgroupOneAddressSpaceSSID() ||87 SSID == getAgentOneAddressSpaceSSID() ||88 SSID == getSystemOneAddressSpaceSSID();89 }90 91public:92 AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);93 94 /// \returns Agent synchronization scope ID (cross address space).95 SyncScope::ID getAgentSSID() const {96 return AgentSSID;97 }98 /// \returns Workgroup synchronization scope ID (cross address space).99 SyncScope::ID getWorkgroupSSID() const {100 return WorkgroupSSID;101 }102 /// \returns Wavefront synchronization scope ID (cross address space).103 SyncScope::ID getWavefrontSSID() const {104 return WavefrontSSID;105 }106 /// \returns Cluster synchronization scope ID (cross address space).107 SyncScope::ID getClusterSSID() const { return ClusterSSID; }108 /// \returns System synchronization scope ID (single address space).109 SyncScope::ID getSystemOneAddressSpaceSSID() const {110 return SystemOneAddressSpaceSSID;111 }112 /// \returns Agent synchronization scope ID (single address space).113 SyncScope::ID getAgentOneAddressSpaceSSID() const {114 return AgentOneAddressSpaceSSID;115 }116 /// \returns Workgroup synchronization scope ID (single address space).117 SyncScope::ID getWorkgroupOneAddressSpaceSSID() const {118 return WorkgroupOneAddressSpaceSSID;119 }120 /// \returns Wavefront synchronization scope ID (single address space).121 SyncScope::ID getWavefrontOneAddressSpaceSSID() const {122 return WavefrontOneAddressSpaceSSID;123 }124 /// \returns Single thread synchronization scope ID (single address space).125 SyncScope::ID getSingleThreadOneAddressSpaceSSID() const {126 return SingleThreadOneAddressSpaceSSID;127 }128 /// \returns Single thread synchronization scope ID (single address space).129 SyncScope::ID getClusterOneAddressSpaceSSID() const {130 return ClusterOneAddressSpaceSSID;131 }132 133 /// In AMDGPU target synchronization scopes are inclusive, meaning a134 /// larger synchronization scope is inclusive of a smaller synchronization135 /// scope.136 ///137 /// \returns True if synchronization scope \p A is larger than or equal to138 /// synchronization scope \p B, false if synchronization scope \p A is smaller139 /// than synchronization scope \p B, or "std::nullopt" if either140 /// synchronization scope \p A or \p B is not supported by the AMDGPU target.141 std::optional<bool> isSyncScopeInclusion(SyncScope::ID A,142 SyncScope::ID B) const {143 const auto &AIO = getSyncScopeInclusionOrdering(A);144 const auto &BIO = getSyncScopeInclusionOrdering(B);145 if (!AIO || !BIO)146 return std::nullopt;147 148 bool IsAOneAddressSpace = isOneAddressSpace(A);149 bool IsBOneAddressSpace = isOneAddressSpace(B);150 151 return *AIO >= *BIO &&152 (IsAOneAddressSpace == IsBOneAddressSpace || !IsAOneAddressSpace);153 }154};155 156} // end namespace llvm157 158#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H159