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