diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-02-10 14:17:30 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-02-10 14:17:30 +0000 |
commit | b8266d2062f203507de2154936fd25d686c303e1 (patch) | |
tree | 0b71086bca2fc7644215363888582bdb19a10f45 | |
parent | a2e0a27d266281dedc244beb956d2483f3bcddf7 (diff) | |
download | bcm5719-llvm-b8266d2062f203507de2154936fd25d686c303e1.tar.gz bcm5719-llvm-b8266d2062f203507de2154936fd25d686c303e1.zip |
GlobalsModRef: Unify and clean up duplicated pointer analysis code.
llvm-svn: 201087
-rw-r--r-- | llvm/lib/Analysis/IPA/GlobalsModRef.cpp | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp index 2a8b96da069..cdae975d845 100644 --- a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp @@ -262,30 +262,21 @@ bool GlobalsModRef::AnalyzeUsesOfPointer(Value *V, } else if (SI->getOperand(1) != OkayStoreDest) { return true; // Storing the pointer } - } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) { - if (AnalyzeUsesOfPointer(GEP, Readers, Writers)) return true; - } else if (BitCastInst *BCI = dyn_cast<BitCastInst>(U)) { - if (AnalyzeUsesOfPointer(BCI, Readers, Writers, OkayStoreDest)) + } else if (Operator::getOpcode(U) == Instruction::GetElementPtr) { + if (AnalyzeUsesOfPointer(U, Readers, Writers)) return true; - } else if (isFreeCall(U, TLI)) { - Writers.push_back(cast<Instruction>(U)->getParent()->getParent()); - } else if (CallInst *CI = dyn_cast<CallInst>(U)) { - // Make sure that this is just the function being called, not that it is - // passing into the function. - for (unsigned i = 0, e = CI->getNumArgOperands(); i != e; ++i) - if (CI->getArgOperand(i) == V) return true; - } else if (InvokeInst *II = dyn_cast<InvokeInst>(U)) { + } else if (Operator::getOpcode(U) == Instruction::BitCast) { + if (AnalyzeUsesOfPointer(U, Readers, Writers, OkayStoreDest)) + return true; + } else if (CallSite CS = U) { // Make sure that this is just the function being called, not that it is // passing into the function. - for (unsigned i = 0, e = II->getNumArgOperands(); i != e; ++i) - if (II->getArgOperand(i) == V) return true; - } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) { - if (CE->getOpcode() == Instruction::GetElementPtr || - CE->getOpcode() == Instruction::BitCast) { - if (AnalyzeUsesOfPointer(CE, Readers, Writers)) - return true; - } else { - return true; + if (!CS.isCallee(UI)) { + // Detect calls to free. + if (isFreeCall(U, TLI)) + Writers.push_back(CS->getParent()->getParent()); + else + return true; // Argument of an unknown call. } } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(U)) { if (!isa<ConstantPointerNull>(ICI->getOperand(1))) |