/* * Build information about functions that store on pointer arguments * For simplification, we only consider a function to store on an argument * if it has exactly one StoreInst to that argument and the arg has no other use. */ int DeadStoreEliminationPass::getFnThatStoreOnArgs(Module &M) { int numStores = 0; DEBUG(errs() << "Getting functions that store on arguments...\n"); for (Module::iterator F = M.begin(); F != M.end(); ++F) { if (F->arg_empty() || F->isDeclaration()) continue; // Get args std::set<Value*> args; for (Function::arg_iterator formalArgIter = F->arg_begin(); formalArgIter != F->arg_end(); ++formalArgIter) { Value *formalArg = formalArgIter; if (formalArg->getType()->isPointerTy()) { args.insert(formalArg); } } // Find stores on arguments for (Function::iterator BB = F->begin(); BB != F->end(); ++BB) { for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) { Instruction *inst = I; if (!isa<StoreInst>(inst)) continue; StoreInst *SI = dyn_cast<StoreInst>(inst); Value *ptrOp = SI->getPointerOperand(); if (args.count(ptrOp) && ptrOp->hasNUses(1)) { fnThatStoreOnArgs[F].insert(ptrOp); numStores++; DEBUG(errs() << " " << F->getName() << " stores on argument " << ptrOp->getName() << "\n"); } } } } DEBUG(errs() << "\n"); return numStores; }