LCOV - code coverage report
Current view: top level - lib/Target/AMDGPU - AMDGPUMachineModuleInfo.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 11 11 100.0 %
Date: 2017-09-14 15:23:50 Functions: 2 3 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : /// \brief 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"
      21             : #include "llvm/CodeGen/MachineModuleInfo.h"
      22             : #include "llvm/CodeGen/MachineModuleInfoImpls.h"
      23             : #include "llvm/IR/LLVMContext.h"
      24             : 
      25             : namespace llvm {
      26             : 
      27        2854 : class AMDGPUMachineModuleInfo final : public MachineModuleInfoELF {
      28             : private:
      29             : 
      30             :   // All supported memory/synchronization scopes can be found here:
      31             :   //   http://llvm.org/docs/AMDGPUUsage.html#memory-scopes
      32             : 
      33             :   /// \brief Agent synchronization scope ID.
      34             :   SyncScope::ID AgentSSID;
      35             :   /// \brief Workgroup synchronization scope ID.
      36             :   SyncScope::ID WorkgroupSSID;
      37             :   /// \brief Wavefront synchronization scope ID.
      38             :   SyncScope::ID WavefrontSSID;
      39             : 
      40             :   /// \brief 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       87644 :     if (SSID == SyncScope::SingleThread)
      48             :       return 0;
      49       43786 :     else if (SSID == getWavefrontSSID())
      50             :       return 1;
      51       43739 :     else if (SSID == getWorkgroupSSID())
      52             :       return 2;
      53       43691 :     else if (SSID == getAgentSSID())
      54             :       return 3;
      55       43642 :     else if (SSID == SyncScope::System)
      56             :       return 4;
      57             : 
      58             :     return None;
      59             :   }
      60             : 
      61             : public:
      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             :   }
      76             : 
      77             :   /// \brief 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.
      85       43822 :   Optional<bool> isSyncScopeInclusion(SyncScope::ID A, SyncScope::ID B) const {
      86      131466 :     const auto &AIO = getSyncScopeInclusionOrdering(A);
      87      131466 :     const auto &BIO = getSyncScopeInclusionOrdering(B);
      88       43822 :     if (!AIO || !BIO)
      89             :       return None;
      90             : 
      91      131430 :     return AIO.getValue() > BIO.getValue();
      92             :   }
      93             : };
      94             : 
      95             : } // end namespace llvm
      96             : 
      97             : #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H

Generated by: LCOV version 1.13