aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Module
diff options
context:
space:
mode:
authorMartin Nowack <martin@se.inf.tu-dresden.de>2013-11-14 08:10:07 +0100
committerDan Liew <daniel.liew@imperial.ac.uk>2013-12-19 15:45:03 +0000
commit9809e76ec82c7bd70b8cb8b735be294ffb96d7bc (patch)
tree3763afa9fa03df3d7d16f67e6ce81b0f3fe7e3bd /lib/Module
parentf8a0a98bfdeb3c9bb903a549042c2da322c753b5 (diff)
downloadklee-9809e76ec82c7bd70b8cb8b735be294ffb96d7bc.tar.gz
Optimize inlineChecks function
* Just iterate over the instructions which use the function to be inlined * Handle each callsite (e.g. CallInst and InvokeInst)
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/KModule.cpp21
1 files changed, 9 insertions, 12 deletions
diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp
index 4bc10604..34e5f60c 100644
--- a/lib/Module/KModule.cpp
+++ b/lib/Module/KModule.cpp
@@ -229,7 +229,7 @@ static void forceImport(Module *m, const char *name, LLVM_TYPE_Q Type *retType,
/// It is intended that this function be used for inling calls to
/// check functions like <tt>klee_div_zero_check()</tt>
static void inlineChecks(Module *module, const char * functionName) {
- std::vector<CallInst*> checkCalls;
+ std::vector<CallSite> checkCalls;
Function* runtimeCheckCall = module->getFunction(functionName);
if (runtimeCheckCall == 0)
{
@@ -237,22 +237,19 @@ static void inlineChecks(Module *module, const char * functionName) {
return;
}
- // Iterate through instructions in module and collect all
- // call instructions to "functionName" that we care about.
- for (Module::iterator f = module->begin(), fe = module->end(); f != fe; ++f) {
- for (inst_iterator i=inst_begin(f), ie = inst_end(f); i != ie; ++i) {
- if ( CallInst* ci = dyn_cast<CallInst>(&*i) )
- {
- if ( ci->getCalledFunction() == runtimeCheckCall)
- checkCalls.push_back(ci);
- }
+ for (Value::use_iterator i = runtimeCheckCall->use_begin(),
+ e = runtimeCheckCall->use_end(); i != e; ++i)
+ if (isa<InvokeInst>(*i) || isa<CallInst>(*i)) {
+ CallSite cs(*i);
+ if (!cs.getCalledFunction())
+ continue;
+ checkCalls.push_back(cs);
}
- }
unsigned int successCount=0;
unsigned int failCount=0;
InlineFunctionInfo IFI(0,0);
- for ( std::vector<CallInst*>::iterator ci = checkCalls.begin(),
+ for ( std::vector<CallSite>::iterator ci = checkCalls.begin(),
cie = checkCalls.end();
ci != cie; ++ci)
{