@@ -19,131 +19,116 @@ SPDX-License-Identifier: MIT
19
19
#include < set>
20
20
#include < map>
21
21
22
- namespace IGC
23
- {
24
- class CodeGenContext ;
22
+ namespace IGC {
23
+ class CodeGenContext ;
25
24
}
26
25
27
- namespace IGC
28
- {
29
- // struct
30
- typedef std::map<unsigned int , llvm::Argument*> InfoToImpArgMap;
31
- typedef std::map<llvm::Function*, InfoToImpArgMap> FuncInfoToImpArgMap;
32
-
33
-
34
- typedef std::map<llvm::Argument*, unsigned int > ImpArgToExpNum;
35
- typedef std::map<llvm::Function*, ImpArgToExpNum> FuncImpToExpNumMap;
36
-
37
- // / @brief AddImplicitArgs pass used for changing the function signatures and calls to represent
38
- // / the implicit arguments needed by each function and passed from the OpenCL runtime
39
- // / This pass depdends on the WIFuncAnalysis pass runing before it
40
- // / @Author Marina Yatsina
41
- class AddImplicitArgs : public llvm ::ModulePass
42
- {
43
- public:
44
- // Pass identification, replacement for typeid
45
- static char ID;
46
-
47
- // / @brief Constructor
48
- AddImplicitArgs ();
49
-
50
- // / @brief Destructor
51
- ~AddImplicitArgs () {}
52
-
53
- // / @brief Provides name of pass
54
- virtual llvm::StringRef getPassName () const override
55
- {
56
- return " AddImplicitArgs" ;
57
- }
58
-
59
- virtual void getAnalysisUsage (llvm::AnalysisUsage &AU) const override
60
- {
61
- AU.addRequired <CodeGenContextWrapper>();
62
- AU.addRequired <MetaDataUtilsWrapper>();
63
- }
64
-
65
- // / @brief Main entry point.
66
- // / Goes over all functions and changes their signature to contain the implicit arguments
67
- // / needed by each function, goes over all function calls and adds the implicit arguments
68
- // / to the function calls
69
- // / @param M The destination module.
70
- virtual bool runOnModule (llvm::Module &M) override ;
71
-
72
- // / @brief Check if a function has a stackcall in its call path to
73
- // / decide whether implicit args should be added
74
- // / @param pFunc Source function
75
- static bool hasStackCallInCG (const llvm::Function* pFunc);
76
- private:
77
-
78
- // / @brief Create the type of the new function,
79
- // / including all explicit and needed impliict parameters
80
- // / @param pFunc The old function
81
- // / @param pImplicitArgs The implicit arguments needed by this function
82
- // / @returns The new function type
83
- static llvm::FunctionType* getNewFuncType (const llvm::Function* pFunc, const ImplicitArgs& implicitArgs);
84
-
85
- // / @brief Transfers uses of old arguments to new arguments, sets names of all arguments
86
- // / @param pFunc The old function
87
- // / @param pNewFunc The new function
88
- // / @param pImplicitArgs The implicit arguments needed by this function
89
- void updateNewFuncArgs (llvm::Function* pFunc, llvm::Function* pNewFunc, const ImplicitArgs& implicitArgs);
90
-
91
- // / @brief Replace old CallInst with new CallInst
92
- void replaceAllUsesWithNewOCLBuiltinFunction (llvm::Function* old_func, llvm::Function* new_func);
93
-
94
- static llvm::Value* coerce (llvm::Value* arg, llvm::Type* type, llvm::Instruction* insertBefore);
95
-
96
- // / @brief Metadata API object.
97
- IGC::IGCMD::MetaDataUtils *m_pMdUtils;
98
-
99
- FuncInfoToImpArgMap m_FuncInfoToImpArgMap;
100
- FuncImpToExpNumMap m_FuncImpToExpNumMap;
101
- };
26
+ namespace IGC {
27
+ // struct
28
+ typedef std::map<unsigned int , llvm::Argument *> InfoToImpArgMap;
29
+ typedef std::map<llvm::Function *, InfoToImpArgMap> FuncInfoToImpArgMap;
30
+
31
+ typedef std::map<llvm::Argument *, unsigned int > ImpArgToExpNum;
32
+ typedef std::map<llvm::Function *, ImpArgToExpNum> FuncImpToExpNumMap;
33
+
34
+ // / @brief AddImplicitArgs pass used for changing the function signatures and calls to represent
35
+ // / the implicit arguments needed by each function and passed from the OpenCL runtime
36
+ // / This pass depdends on the WIFuncAnalysis pass runing before it
37
+ // / @Author Marina Yatsina
38
+ class AddImplicitArgs : public llvm ::ModulePass {
39
+ public:
40
+ // Pass identification, replacement for typeid
41
+ static char ID;
42
+
43
+ // / @brief Constructor
44
+ AddImplicitArgs ();
45
+
46
+ // / @brief Destructor
47
+ ~AddImplicitArgs () {}
48
+
49
+ // / @brief Provides name of pass
50
+ virtual llvm::StringRef getPassName () const override { return " AddImplicitArgs" ; }
51
+
52
+ virtual void getAnalysisUsage (llvm::AnalysisUsage &AU) const override {
53
+ AU.addRequired <CodeGenContextWrapper>();
54
+ AU.addRequired <MetaDataUtilsWrapper>();
55
+ }
56
+
57
+ // / @brief Main entry point.
58
+ // / Goes over all functions and changes their signature to contain the implicit arguments
59
+ // / needed by each function, goes over all function calls and adds the implicit arguments
60
+ // / to the function calls
61
+ // / @param M The destination module.
62
+ virtual bool runOnModule (llvm::Module &M) override ;
63
+
64
+ // / @brief Check if a function has a stackcall in its call path to
65
+ // / decide whether implicit args should be added
66
+ // / @param pFunc Source function
67
+ static bool hasStackCallInCG (const llvm::Function *pFunc);
68
+
69
+ private:
70
+ // / @brief Create the type of the new function,
71
+ // / including all explicit and needed impliict parameters
72
+ // / @param pFunc The old function
73
+ // / @param pImplicitArgs The implicit arguments needed by this function
74
+ // / @returns The new function type
75
+ static llvm::FunctionType *getNewFuncType (const llvm::Function *pFunc, const ImplicitArgs &implicitArgs);
76
+
77
+ // / @brief Transfers uses of old arguments to new arguments, sets names of all arguments
78
+ // / @param pFunc The old function
79
+ // / @param pNewFunc The new function
80
+ // / @param pImplicitArgs The implicit arguments needed by this function
81
+ void updateNewFuncArgs (llvm::Function *pFunc, llvm::Function *pNewFunc, const ImplicitArgs &implicitArgs);
82
+
83
+ // / @brief Replace old CallInst with new CallInst
84
+ void replaceAllUsesWithNewOCLBuiltinFunction (llvm::Function *old_func, llvm::Function *new_func);
85
+
86
+ static llvm::Value *coerce (llvm::Value *arg, llvm::Type *type, llvm::Instruction *insertBefore);
87
+
88
+ // / @brief Metadata API object.
89
+ IGC::IGCMD::MetaDataUtils *m_pMdUtils;
90
+
91
+ FuncInfoToImpArgMap m_FuncInfoToImpArgMap;
92
+ FuncImpToExpNumMap m_FuncImpToExpNumMap;
93
+ };
102
94
103
95
} // namespace IGC
104
96
105
97
// Builtin CallGraph Analysis Class
106
- namespace IGC
107
- {
108
-
109
- struct ImplicitArgumentDetail
110
- {
111
- ImplicitArg::ArgMap ArgsMaps;
112
- std::set<unsigned int > StructArgSet;
113
- };
114
-
115
- class BuiltinCallGraphAnalysis : public llvm ::ModulePass
116
- {
117
- public:
118
- static char ID;
119
-
120
- BuiltinCallGraphAnalysis ();
121
- ~BuiltinCallGraphAnalysis () {}
122
-
123
- virtual llvm::StringRef getPassName () const override
124
- {
125
- return " BuiltinCallGraphAnalysis" ;
126
- }
127
-
128
- void getAnalysisUsage (llvm::AnalysisUsage &AU) const override
129
- {
130
- AU.addRequired <MetaDataUtilsWrapper>();
131
- AU.addRequired <CodeGenContextWrapper>();
132
- AU.addRequired <llvm::CallGraphWrapperPass>();
133
- }
134
-
135
- virtual bool runOnModule (llvm::Module &M) override ;
136
-
137
- void traverseCallGraphSCC (const std::vector<llvm::CallGraphNode *> &SCCNodes);
138
- void combineTwoArgDetail (ImplicitArgumentDetail&, const ImplicitArgumentDetail&, llvm::Value*) const ;
139
- void writeBackAllIntoMetaData (const ImplicitArgumentDetail&, llvm::Function*);
140
-
141
- bool pruneCallGraphForStackCalls (llvm::CallGraph& CG);
142
-
143
- private:
144
- IGC::IGCMD::MetaDataUtils *m_pMdUtils;
145
- llvm::SmallDenseMap<llvm::Function*, ImplicitArgumentDetail *> argMap;
146
- llvm::SmallVector<std::unique_ptr<ImplicitArgumentDetail>, 4 > argDetails;
147
- };
98
+ namespace IGC {
99
+
100
+ struct ImplicitArgumentDetail {
101
+ ImplicitArg::ArgMap ArgsMaps;
102
+ std::set<unsigned int > StructArgSet;
103
+ };
104
+
105
+ class BuiltinCallGraphAnalysis : public llvm ::ModulePass {
106
+ public:
107
+ static char ID;
108
+
109
+ BuiltinCallGraphAnalysis ();
110
+ ~BuiltinCallGraphAnalysis () {}
111
+
112
+ virtual llvm::StringRef getPassName () const override { return " BuiltinCallGraphAnalysis" ; }
113
+
114
+ void getAnalysisUsage (llvm::AnalysisUsage &AU) const override {
115
+ AU.addRequired <MetaDataUtilsWrapper>();
116
+ AU.addRequired <CodeGenContextWrapper>();
117
+ AU.addRequired <llvm::CallGraphWrapperPass>();
118
+ }
119
+
120
+ virtual bool runOnModule (llvm::Module &M) override ;
121
+
122
+ void traverseCallGraphSCC (const std::vector<llvm::CallGraphNode *> &SCCNodes);
123
+ void combineTwoArgDetail (ImplicitArgumentDetail &, const ImplicitArgumentDetail &, llvm::Value *) const ;
124
+ void writeBackAllIntoMetaData (const ImplicitArgumentDetail &, llvm::Function *);
125
+
126
+ bool pruneCallGraphForStackCalls (llvm::CallGraph &CG);
127
+
128
+ private:
129
+ IGC::IGCMD::MetaDataUtils *m_pMdUtils;
130
+ llvm::SmallDenseMap<llvm::Function *, ImplicitArgumentDetail *> argMap;
131
+ llvm::SmallVector<std::unique_ptr<ImplicitArgumentDetail>, 4 > argDetails;
132
+ };
148
133
149
134
} // namespace IGC
0 commit comments