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