X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FTransforms%2FIPO%2FFunctionAttrs.cpp;h=6c357ed03a805be0b5a8d6c5928417dce7da2a01;hp=7d2b351ae5c569b04dc24bef0d60dd65121cd8df;hb=59991f96f9c522f456d9cb6d2eda4a226806d7ff;hpb=a3e49ea99afc3c9f43953bdc3b3bd77970ed510d diff --git a/lib/Transforms/IPO/FunctionAttrs.cpp b/lib/Transforms/IPO/FunctionAttrs.cpp index 7d2b351ae5c..6c357ed03a8 100644 --- a/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/lib/Transforms/IPO/FunctionAttrs.cpp @@ -130,39 +130,45 @@ checkFunctionMemoryAccess(Function &F, AAResults &AAR, if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction())) continue; FunctionModRefBehavior MRB = AAR.getModRefBehavior(CS); - // If the call doesn't access arbitrary memory, we may be able to - // figure out something. - if (AliasAnalysis::onlyAccessesArgPointees(MRB)) { - // If the call does access argument pointees, check each argument. - if (AliasAnalysis::doesAccessArgPointees(MRB)) - // Check whether all pointer arguments point to local memory, and - // ignore calls that only access local memory. - for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); - CI != CE; ++CI) { - Value *Arg = *CI; - if (Arg->getType()->isPointerTy()) { - AAMDNodes AAInfo; - I->getAAMetadata(AAInfo); - - MemoryLocation Loc(Arg, MemoryLocation::UnknownSize, AAInfo); - if (!AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) { - if (MRB & MRI_Mod) - // Writes non-local memory. Give up. - return MAK_MayWrite; - if (MRB & MRI_Ref) - // Ok, it reads non-local memory. - ReadsMemory = true; - } - } - } + + // If the call doesn't access memory, we're done. + if (!(MRB & MRI_ModRef)) continue; + + if (!AliasAnalysis::onlyAccessesArgPointees(MRB)) { + // The call could access any memory. If that includes writes, give up. + if (MRB & MRI_Mod) + return MAK_MayWrite; + // If it reads, note it. + if (MRB & MRI_Ref) + ReadsMemory = true; + continue; + } + + // Check whether all pointer arguments point to local memory, and + // ignore calls that only access local memory. + for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); + CI != CE; ++CI) { + Value *Arg = *CI; + if (!Arg->getType()->isPointerTy()) + continue; + + AAMDNodes AAInfo; + I->getAAMetadata(AAInfo); + MemoryLocation Loc(Arg, MemoryLocation::UnknownSize, AAInfo); + + // Skip accesses to local or constant memory as they don't impact the + // externally visible mod/ref behavior. + if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) + continue; + + if (MRB & MRI_Mod) + // Writes non-local memory. Give up. + return MAK_MayWrite; + if (MRB & MRI_Ref) + // Ok, it reads non-local memory. + ReadsMemory = true; } - // The call could access any memory. If that includes writes, give up. - if (MRB & MRI_Mod) - return MAK_MayWrite; - // If it reads, note it. - if (MRB & MRI_Ref) - ReadsMemory = true; continue; } else if (LoadInst *LI = dyn_cast(I)) { // Ignore non-volatile loads from local memory. (Atomic is okay here.) @@ -347,7 +353,7 @@ struct ArgumentUsesTracker : public CaptureTracker { return true; } if (PI == U) { - Uses.push_back(AI); + Uses.push_back(&*AI); Found = true; break; } @@ -466,7 +472,7 @@ determinePointerReadAttrs(Argument *A, return Attribute::None; } Captures &= !CS.doesNotCapture(A - B); - if (SCCNodes.count(AI)) + if (SCCNodes.count(&*AI)) continue; if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(A - B)) return Attribute::None; @@ -551,7 +557,7 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) { bool HasNonLocalUses = false; if (!A->hasNoCaptureAttr()) { ArgumentUsesTracker Tracker(SCCNodes); - PointerMayBeCaptured(A, &Tracker); + PointerMayBeCaptured(&*A, &Tracker); if (!Tracker.Captured) { if (Tracker.Uses.empty()) { // If it's trivially not captured, mark it nocapture now. @@ -563,7 +569,7 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) { // If it's not trivially captured and not trivially not captured, // then it must be calling into another function in our SCC. Save // its particulars for Argument-SCC analysis later. - ArgumentGraphNode *Node = AG[A]; + ArgumentGraphNode *Node = AG[&*A]; for (SmallVectorImpl::iterator UI = Tracker.Uses.begin(), UE = Tracker.Uses.end(); @@ -582,8 +588,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) { // will be dependent on the iteration order through the functions in the // SCC. SmallPtrSet Self; - Self.insert(A); - Attribute::AttrKind R = determinePointerReadAttrs(A, Self); + Self.insert(&*A); + Attribute::AttrKind R = determinePointerReadAttrs(&*A, Self); if (R != Attribute::None) { AttrBuilder B; B.addAttribute(R);