diff options
author | Gabor Greif <ggreif@gmail.com> | 2010-04-08 16:46:24 +0000 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2010-04-08 16:46:24 +0000 |
commit | 64d8d1a022a22949354eb1fe1f74fa35ff84e035 (patch) | |
tree | 4354edb441834de26061f755a3ef10a42f263108 /llvm/lib/Analysis/AliasAnalysisEvaluator.cpp | |
parent | c76498d4095874895ae91dd404264f10549d94d8 (diff) | |
download | llvm-64d8d1a022a22949354eb1fe1f74fa35ff84e035.zip llvm-64d8d1a022a22949354eb1fe1f74fa35ff84e035.tar.gz llvm-64d8d1a022a22949354eb1fe1f74fa35ff84e035.tar.bz2 |
clean up algorithm and remove operand order assumptions
llvm-svn: 100780
Diffstat (limited to 'llvm/lib/Analysis/AliasAnalysisEvaluator.cpp')
-rw-r--r-- | llvm/lib/Analysis/AliasAnalysisEvaluator.cpp | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/llvm/lib/Analysis/AliasAnalysisEvaluator.cpp b/llvm/lib/Analysis/AliasAnalysisEvaluator.cpp index 308b9e3..bfa3ff1 100644 --- a/llvm/lib/Analysis/AliasAnalysisEvaluator.cpp +++ b/llvm/lib/Analysis/AliasAnalysisEvaluator.cpp @@ -108,6 +108,11 @@ PrintModRefResults(const char *Msg, bool P, Instruction *I, Value *Ptr, } } +static inline bool isInterestingPointer(Value *V) { + return V->getType()->isPointerTy() + && !isa<ConstantPointerNull>(V); +} + bool AAEval::runOnFunction(Function &F) { AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); @@ -115,21 +120,31 @@ bool AAEval::runOnFunction(Function &F) { SetVector<CallSite> CallSites; for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) - if (I->getType()->isPointerTy()) // Add all pointer arguments + if (I->getType()->isPointerTy()) // Add all pointer arguments. Pointers.insert(I); for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) { - if (I->getType()->isPointerTy()) // Add all pointer instructions + if (I->getType()->isPointerTy()) // Add all pointer instructions. Pointers.insert(&*I); Instruction &Inst = *I; - User::op_iterator OI = Inst.op_begin(); CallSite CS = CallSite::get(&Inst); - if (CS.getInstruction() && - isa<Function>(CS.getCalledValue())) - ++OI; // Skip actual functions for direct function calls. - for (; OI != Inst.op_end(); ++OI) - if ((*OI)->getType()->isPointerTy() && !isa<ConstantPointerNull>(*OI)) - Pointers.insert(*OI); + if (CS) { + Value *Callee = CS.getCalledValue(); + // Skip actual functions for direct function calls. + if (!isa<Function>(Callee) && isInterestingPointer(Callee)) + Pointers.insert(Callee); + // Consider formals. + for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); + AI != AE; ++AI) + if (isInterestingPointer(*AI)) + Pointers.insert(*AI); + } else { + // Consider all operands. + for (Instruction::op_iterator OI = Inst.op_begin(), OE = Inst.op_end(); + OI != OE; ++OI) + if (isInterestingPointer(*OI)) + Pointers.insert(*OI); + } if (CS.getInstruction()) CallSites.insert(CS); } |