From: Gabor Greif Date: Thu, 8 Apr 2010 16:46:24 +0000 (+0000) Subject: clean up algorithm and remove operand order assumptions X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3;hp=bcf9f00ed5c350d9239e7d5d8c7aca0dfdf4efa8;p=oota-llvm.git clean up algorithm and remove operand order assumptions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100780 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp index 308b9e3f640..bfa3ff1f9e6 100644 --- a/lib/Analysis/AliasAnalysisEvaluator.cpp +++ b/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(V); +} + bool AAEval::runOnFunction(Function &F) { AliasAnalysis &AA = getAnalysis(); @@ -115,21 +120,31 @@ bool AAEval::runOnFunction(Function &F) { SetVector 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(CS.getCalledValue())) - ++OI; // Skip actual functions for direct function calls. - for (; OI != Inst.op_end(); ++OI) - if ((*OI)->getType()->isPointerTy() && !isa(*OI)) - Pointers.insert(*OI); + if (CS) { + Value *Callee = CS.getCalledValue(); + // Skip actual functions for direct function calls. + if (!isa(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); }