[llvm-commits] [poolalloc] r136361 - /poolalloc/trunk/lib/AssistDS/TypeChecks.cpp
Arushi Aggarwal
aggarwa4 at illinois.edu
Thu Jul 28 09:42:05 PDT 2011
Author: aggarwa4
Date: Thu Jul 28 11:42:05 2011
New Revision: 136361
URL: http://llvm.org/viewvc/llvm-project?rev=136361&view=rev
Log:
1. Optimize some loop invariant checks.
2. Add support for optind/optarg
Modified:
poolalloc/trunk/lib/AssistDS/TypeChecks.cpp
Modified: poolalloc/trunk/lib/AssistDS/TypeChecks.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/AssistDS/TypeChecks.cpp?rev=136361&r1=136360&r2=136361&view=diff
==============================================================================
--- poolalloc/trunk/lib/AssistDS/TypeChecks.cpp (original)
+++ poolalloc/trunk/lib/AssistDS/TypeChecks.cpp Thu Jul 28 11:42:05 2011
@@ -524,6 +524,43 @@
Worklist.insert(Worklist.end(), Node->begin(), Node->end());
}
}
+ for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI) {
+ Function &F = *MI;
+ if(F.isDeclaration())
+ continue;
+ DominatorTree & DT = getAnalysis<DominatorTree>(F);
+ LoopInfo & LI = getAnalysis<LoopInfo>(F);
+ std::deque<DomTreeNode *> Worklist;
+ Worklist.push_back (DT.getRootNode());
+ while(Worklist.size()) {
+ DomTreeNode * Node = Worklist.front();
+ Worklist.pop_front();
+ Worklist.insert(Worklist.end(), Node->begin(), Node->end());
+ BasicBlock *BB = Node->getBlock();
+ Loop *L = LI.getLoopFor(BB);
+ if(!L)
+ continue;
+ if(!L->getLoopPreheader())
+ continue;
+ for (BasicBlock::iterator bi = BB->begin(); bi != BB->end(); ) {
+ CallInst *CI = dyn_cast<CallInst>(bi++);
+ if(!CI)
+ continue;
+ if(CI->getCalledFunction() != checkTypeInst)
+ continue;
+ bool hoist = true;
+ // The instruction is loop invariant if all of its operands are loop-invariant
+ for (unsigned i = 1, e = CI->getNumOperands(); i != e; ++i)
+ if (!L->isLoopInvariant(CI->getOperand(i)))
+ hoist = false;
+
+ if(hoist) {
+ CI->removeFromParent();
+ L->getLoopPreheader()->getInstList().insert(L->getLoopPreheader()->getTerminator(), CI);
+ }
+ }
+ }
+ }
}
// add a global that has the metadata -> typeString mapping
@@ -1215,7 +1252,9 @@
continue;
if(I->getNameStr() == "stderr" ||
I->getNameStr() == "stdout" ||
- I->getNameStr() == "stdin") {
+ I->getNameStr() == "stdin" ||
+ I->getNameStr() == "optind" ||
+ I->getNameStr() == "optarg") {
// assume initialized
CastInst *BCI = BitCastInst::CreatePointerCast(I, VoidPtrTy, "", InsertPt);
std::vector<Value *> Args;
@@ -1609,6 +1648,16 @@
Constant *F = M.getOrInsertFunction("trackgetpwuid", VoidTy, VoidPtrTy, Int32Ty, NULL);
CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
CI->insertAfter(BCI);
+ } else if(F->getNameStr() == std::string("getopt_long")) {
+ Value *OptArg = M.getNamedGlobal("optarg");
+ LoadInst *LI = new LoadInst(OptArg);
+ LI->insertAfter(I);
+ std::vector<Value *>Args;
+ Args.push_back(LI);
+ Args.push_back(getTagCounter());
+ Constant *F = M.getOrInsertFunction("trackgetcwd", VoidTy, VoidPtrTy, Int32Ty, NULL);
+ CallInst *CI = CallInst::Create(F, Args.begin(), Args.end());
+ CI->insertAfter(LI);
} else if (F->getNameStr() == std::string("getgruid") ||
F->getNameStr() == std::string("getgrnam") ||
F->getNameStr() == std::string("getpwnam") ||
More information about the llvm-commits
mailing list