diff options
Diffstat (limited to 'llvm/lib/Analysis/LibCallAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LibCallAliasAnalysis.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/llvm/lib/Analysis/LibCallAliasAnalysis.cpp b/llvm/lib/Analysis/LibCallAliasAnalysis.cpp index c9e2585bd66..8e839e8ce75 100644 --- a/llvm/lib/Analysis/LibCallAliasAnalysis.cpp +++ b/llvm/lib/Analysis/LibCallAliasAnalysis.cpp @@ -27,13 +27,11 @@ FunctionPass *llvm::createLibCallAliasAnalysisPass(LibCallInfo *LCI) { return new LibCallAliasAnalysis(LCI); } -LibCallAliasAnalysis::~LibCallAliasAnalysis() { - delete LCI; -} +LibCallAliasAnalysis::~LibCallAliasAnalysis() { delete LCI; } void LibCallAliasAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { AliasAnalysis::getAnalysisUsage(AU); - AU.setPreservesAll(); // Does not transform code + AU.setPreservesAll(); // Does not transform code } bool LibCallAliasAnalysis::runOnFunction(Function &F) { @@ -61,52 +59,54 @@ LibCallAliasAnalysis::AnalyzeLibCallDetails(const LibCallFunctionInfo *FI, const LibCallFunctionInfo::LocationMRInfo *Details = FI->LocationDetails; if (Details == nullptr) return MRInfo; - + // If the details array is of the 'DoesNot' kind, we only know something if // the pointer is a match for one of the locations in 'Details'. If we find a // match, we can prove some interactions cannot happen. - // + // if (FI->DetailsType == LibCallFunctionInfo::DoesNot) { // Find out if the pointer refers to a known location. for (unsigned i = 0; Details[i].LocationID != ~0U; ++i) { const LibCallLocationInfo &LocInfo = - LCI->getLocationInfo(Details[i].LocationID); + LCI->getLocationInfo(Details[i].LocationID); LibCallLocationInfo::LocResult Res = LocInfo.isLocation(CS, Loc); - if (Res != LibCallLocationInfo::Yes) continue; - + if (Res != LibCallLocationInfo::Yes) + continue; + // If we find a match against a location that we 'do not' interact with, // learn this info into MRInfo. return ModRefInfo(MRInfo & ~Details[i].MRInfo); } return MRInfo; } - + // If the details are of the 'DoesOnly' sort, we know something if the pointer // is a match for one of the locations in 'Details'. Also, if we can prove // that the pointers is *not* one of the locations in 'Details', we know that // the call is MRI_NoModRef. assert(FI->DetailsType == LibCallFunctionInfo::DoesOnly); - + // Find out if the pointer refers to a known location. bool NoneMatch = true; for (unsigned i = 0; Details[i].LocationID != ~0U; ++i) { const LibCallLocationInfo &LocInfo = - LCI->getLocationInfo(Details[i].LocationID); + LCI->getLocationInfo(Details[i].LocationID); LibCallLocationInfo::LocResult Res = LocInfo.isLocation(CS, Loc); - if (Res == LibCallLocationInfo::No) continue; - + if (Res == LibCallLocationInfo::No) + continue; + // If we don't know if this pointer points to the location, then we have to // assume it might alias in some case. if (Res == LibCallLocationInfo::Unknown) { NoneMatch = false; continue; } - + // If we know that this pointer definitely is pointing into the location, // merge in this information. return ModRefInfo(MRInfo & Details[i].MRInfo); } - + // If we found that the pointer is guaranteed to not match any of the // locations in our 'DoesOnly' rule, then we know that the pointer must point // to some other location. Since the libcall doesn't mod/ref any other @@ -136,7 +136,7 @@ ModRefInfo LibCallAliasAnalysis::getModRefInfo(ImmutableCallSite CS, } } } - + // The AliasAnalysis base class has some smarts, lets use them. return (ModRefInfo)(MRInfo | AliasAnalysis::getModRefInfo(CS, Loc)); } |