X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FAnalysis%2FLibCallAliasAnalysis.cpp;h=8e839e8ce758899b21c7761d8235037276d05b2c;hp=c9e2585bd6649013a83e74d6eb0444d925fd3eb8;hb=67bd697ef77533a1af0621293eebb3cd51addf65;hpb=329f95975fd886a59e84d80bb82f951202acaa0e diff --git a/lib/Analysis/LibCallAliasAnalysis.cpp b/lib/Analysis/LibCallAliasAnalysis.cpp index c9e2585bd66..8e839e8ce75 100644 --- a/lib/Analysis/LibCallAliasAnalysis.cpp +++ b/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)); }