@@ -151,44 +151,71 @@ ScalarArgAsPointerAnalysis::findArgs(llvm::Instruction* inst)
151
151
if (!findStoredArgs (*LI, *result))
152
152
return nullptr ; // (1) Found indirect access, fail search
153
153
}
154
+ else if (SelectInst* SI = dyn_cast<SelectInst>(inst))
155
+ {
156
+ auto args1 = analyzeOperand (inst->getOperand (1 ));
157
+ auto args2 = analyzeOperand (inst->getOperand (2 ));
158
+
159
+ if (!args1 && !args2)
160
+ return nullptr ; // propagate fail only if both paths fails
161
+
162
+ if (args1)
163
+ result->insert (args1->begin (), args1->end ());
164
+
165
+ if (args2)
166
+ result->insert (args2->begin (), args2->end ());
167
+ }
154
168
else
155
169
{
156
170
// For any other type of instruction trace back operands.
157
171
unsigned int numOperands = isa<GetElementPtrInst>(inst) ? 1 : inst->getNumOperands ();
158
172
159
173
for (unsigned int i = 0 ; i < numOperands; ++i)
160
174
{
161
- Value* op = inst->getOperand (i);
175
+ auto args = analyzeOperand ( inst->getOperand (i) );
162
176
163
- if (Argument* arg = dyn_cast<Argument>(op))
164
- {
165
- // Consider only integer arguments
166
- if (arg->getType ()->getScalarType ()->isIntegerTy ())
167
- {
168
- result->insert (arg);
169
- }
170
- else
171
- {
172
- // (2) Found non-compatible argument, fail
173
- return nullptr ;
174
- }
175
- }
176
- else if (Instruction* opInst = dyn_cast<Instruction>(op))
177
- {
178
- auto args = findArgs (opInst);
179
-
180
- if (!args)
181
- return nullptr ; // propagate fail
177
+ if (!args)
178
+ return nullptr ; // propagate fail
182
179
183
- result->insert (args->begin (), args->end ());
184
- }
180
+ result->insert (args->begin (), args->end ());
185
181
}
186
182
}
187
183
188
184
m_visitedInst[inst] = result;
189
185
return result;
190
186
}
191
187
188
+ const std::shared_ptr<ScalarArgAsPointerAnalysis::ArgSet>
189
+ ScalarArgAsPointerAnalysis::analyzeOperand (llvm::Value* op)
190
+ {
191
+ auto result = std::make_shared<ScalarArgAsPointerAnalysis::ArgSet>();
192
+
193
+ if (Argument* arg = dyn_cast<Argument>(op))
194
+ {
195
+ // Consider only integer arguments
196
+ if (arg->getType ()->getScalarType ()->isIntegerTy ())
197
+ {
198
+ result->insert (arg);
199
+ }
200
+ else
201
+ {
202
+ // (2) Found non-compatible argument, fail
203
+ return nullptr ;
204
+ }
205
+ }
206
+ else if (Instruction* opInst = dyn_cast<Instruction>(op))
207
+ {
208
+ auto args = findArgs (opInst);
209
+
210
+ if (!args)
211
+ return nullptr ; // propagate fail
212
+
213
+ result->insert (args->begin (), args->end ());
214
+ }
215
+
216
+ return result;
217
+ }
218
+
192
219
void ScalarArgAsPointerAnalysis::analyzeStoredArg (llvm::StoreInst& SI)
193
220
{
194
221
// Only track stores of kernel arguments.
0 commit comments