diff options
author | Martin Nowack <martin@se.inf.tu-dresden.de> | 2013-11-14 08:10:07 +0100 |
---|---|---|
committer | Dan Liew <daniel.liew@imperial.ac.uk> | 2013-12-19 15:45:03 +0000 |
commit | 9809e76ec82c7bd70b8cb8b735be294ffb96d7bc (patch) | |
tree | 3763afa9fa03df3d7d16f67e6ce81b0f3fe7e3bd | |
parent | f8a0a98bfdeb3c9bb903a549042c2da322c753b5 (diff) | |
download | klee-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)
-rw-r--r-- | lib/Module/KModule.cpp | 21 |
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) { |