1 /*========================== begin_copyright_notice ============================ 2 3 Copyright (C) 2017-2021 Intel Corporation 4 5 SPDX-License-Identifier: MIT 6 7 ============================= end_copyright_notice ===========================*/ 8 9 #pragma once 10 11 #include "common/LLVMWarningsPush.hpp" 12 #include <llvm/Pass.h> 13 #include <llvm/ADT/StringRef.h> 14 #include <llvm/ADT/SmallPtrSet.h> 15 #include <llvm/IR/InstVisitor.h> 16 #include "common/LLVMWarningsPop.hpp" 17 #include "Compiler/MetaDataUtilsWrapper.h" 18 19 20 namespace llvm 21 { 22 class Argument; 23 } 24 25 namespace IGC 26 { 27 /// @brief ExtensionArgAnalysis pass used for analyzing if VME extension functions arguments. 28 /// This information needed by ResourceAllocator and helps create the right VME/media patch tokens 29 30 class ExtensionArgAnalysis : public llvm::FunctionPass, public llvm::InstVisitor<ExtensionArgAnalysis> 31 { 32 public: 33 // Pass identification, replacement for typeid 34 static char ID; 35 36 /// @brief Constructor 37 ExtensionArgAnalysis(); 38 39 /// @brief Destructor ~ExtensionArgAnalysis()40 ~ExtensionArgAnalysis() {} 41 42 /// @brief Provides name of pass getPassName() const43 virtual llvm::StringRef getPassName() const override 44 { 45 return "ExtensionArgAnalysis"; 46 } 47 getAnalysisUsage(llvm::AnalysisUsage & AU) const48 void getAnalysisUsage(llvm::AnalysisUsage& AU) const override 49 { 50 AU.addRequired<MetaDataUtilsWrapper>(); 51 } 52 53 /// @brief Function entry point. 54 /// Checks if this is a VME function and analyzes its function arguments (images, samplers) 55 /// @param F The destination function. 56 bool runOnFunction(llvm::Function& F) override; 57 58 /// @brief Returns true if the given argument is a VME image or sampler argument 59 /// @param arg A function argument 60 /// @return true if the given argument is a VME image or sampler argument, false otherwise isMediaArg(const llvm::Argument * arg)61 bool isMediaArg(const llvm::Argument* arg) 62 { 63 return (m_MediaArgs.count(const_cast<llvm::Argument*>(arg)) > 0) ? true : false; 64 } isMediaSamplerArg(const llvm::Argument * arg)65 bool isMediaSamplerArg(const llvm::Argument* arg) 66 { 67 return (m_MediaSamplerArgs.count(const_cast<llvm::Argument*>(arg)) > 0) ? true : false; 68 } isMediaBlockArg(const llvm::Argument * arg)69 bool isMediaBlockArg(const llvm::Argument* arg) 70 { 71 return (m_MediaBlockArgs.count(const_cast<llvm::Argument*>(arg)) > 0) ? true : false; 72 } isVaArg(const llvm::Argument * arg)73 bool isVaArg(const llvm::Argument* arg) 74 { 75 return (m_vaArgs.count(const_cast<llvm::Argument*>(arg)) > 0) ? true : false; 76 } 77 GetExtensionSamplerType()78 ResourceExtensionTypeEnum GetExtensionSamplerType() 79 { 80 return m_extensionType; 81 } 82 83 void visitCallInst(llvm::CallInst& CI); 84 private: 85 86 llvm::DenseMap<llvm::Argument*, ResourceExtensionTypeEnum> m_ExtensionMap; 87 88 89 /// @brief Contains the VME image and sampler arguments of the function 90 llvm::SmallPtrSet<llvm::Argument*, 3> m_MediaArgs; 91 llvm::SmallPtrSet<llvm::Argument*, 3> m_MediaSamplerArgs; 92 llvm::SmallPtrSet<llvm::Argument*, 3> m_MediaBlockArgs; 93 llvm::SmallPtrSet<llvm::Argument*, 2> m_vaArgs; 94 ResourceExtensionTypeEnum m_extensionType; 95 }; 96 97 } // namespace IGC 98