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 "AdaptorCommon/ImplicitArgs.hpp"
12 #include "Compiler/MetaDataUtilsWrapper.h"
13 
14 #include "common/LLVMWarningsPush.hpp"
15 #include <llvm/Pass.h>
16 #include <llvm/IR/InstVisitor.h>
17 #include "common/LLVMWarningsPop.hpp"
18 
19 namespace IGC
20 {
21 
22     class DeviceEnqueueFuncsAnalysis : public llvm::ModulePass, public llvm::InstVisitor<DeviceEnqueueFuncsAnalysis>
23     {
24     public:
25         static char ID;
26 
27         DeviceEnqueueFuncsAnalysis();
28 
~DeviceEnqueueFuncsAnalysis()29         ~DeviceEnqueueFuncsAnalysis() {}
30 
getPassName() const31         virtual llvm::StringRef getPassName() const override
32         {
33             return "DeviceEnqueueFuncsAnalysis";
34         }
35 
getAnalysisUsage(llvm::AnalysisUsage & AU) const36         virtual void getAnalysisUsage(llvm::AnalysisUsage& AU) const override
37         {
38             AU.setPreservesCFG();
39             AU.addRequired<MetaDataUtilsWrapper>();
40             AU.addRequired<CodeGenContextWrapper>();
41         }
42 
43 
44         virtual bool runOnModule(llvm::Module& M) override;
45 
46 
47         bool runOnFunction(llvm::Function& F);
48 
49 
50         virtual void visitCallInst(llvm::CallInst& CI);
51 
52 
53     private:
54         bool m_hasDeviceEnqueue;
55         llvm::SmallVector< ImplicitArg::ArgType, ImplicitArg::NUM_IMPLICIT_ARGS > m_newImplicitArgs;
56         ImplicitArg::ArgMap m_newNumberedImplicitArgs;
57         IGCMD::MetaDataUtils* m_pMDUtils;
58     };
59 
60 
61 
62 
63     class DeviceEnqueueFuncsResolution : public llvm::FunctionPass, public llvm::InstVisitor<DeviceEnqueueFuncsResolution>
64     {
65     public:
66         static char ID;
67 
68         DeviceEnqueueFuncsResolution();
69 
~DeviceEnqueueFuncsResolution()70         ~DeviceEnqueueFuncsResolution() {}
71 
getPassName() const72         virtual llvm::StringRef getPassName() const override
73         {
74             return "DeviceEnqueueFuncsResolution";
75         }
76 
getAnalysisUsage(llvm::AnalysisUsage & AU) const77         virtual void getAnalysisUsage(llvm::AnalysisUsage& AU) const override
78         {
79             AU.setPreservesCFG();
80             AU.addRequired<MetaDataUtilsWrapper>();
81             AU.addRequired<CodeGenContextWrapper>();
82         }
83 
84         virtual bool runOnFunction(llvm::Function& F) override;
85 
86         virtual void visitCallInst(llvm::CallInst& CI);
87 
88     private:
89         bool        m_Changed;
90         ImplicitArgs m_implicitArgs;
91     };
92 
93 }
94 
95