[FunctionAttrs] Factor the logic to test for a known non-null return out

of a method and into a re-usable static helper. We can potentially use
this function from the implementation of a new pass manager oriented
version of the pass. Also add some better documentation of exactly what
the semantic model of this routine is (it isn't trivial) and use a more
modern naming convention for it.

llvm-svn: 247524
This commit is contained in:
Chandler Carruth 2015-09-13 08:17:14 +00:00
parent 8671fcbbd6
commit 8874b78697
1 changed files with 10 additions and 7 deletions

View File

@ -74,8 +74,6 @@ private:
bool AddArgumentAttrs(const CallGraphSCC &SCC); bool AddArgumentAttrs(const CallGraphSCC &SCC);
bool IsFunctionMallocLike(Function *F, SmallPtrSet<Function *, 8> &) const; bool IsFunctionMallocLike(Function *F, SmallPtrSet<Function *, 8> &) const;
bool AddNoAliasAttrs(const CallGraphSCC &SCC); bool AddNoAliasAttrs(const CallGraphSCC &SCC);
bool ReturnsNonNull(Function *F, SmallPtrSet<Function *, 8> &,
bool &Speculative) const;
bool AddNonNullAttrs(const CallGraphSCC &SCC); bool AddNonNullAttrs(const CallGraphSCC &SCC);
bool annotateLibraryCalls(const CallGraphSCC &SCC); bool annotateLibraryCalls(const CallGraphSCC &SCC);
}; };
@ -798,9 +796,14 @@ bool FunctionAttrs::AddNoAliasAttrs(const CallGraphSCC &SCC) {
} }
/// Tests whether this function is known to not return null. /// Tests whether this function is known to not return null.
bool FunctionAttrs::ReturnsNonNull(Function *F, ///
SmallPtrSet<Function *, 8> &SCCNodes, /// Requires that the function returns a pointer.
bool &Speculative) const { ///
/// Returns true if it believes the function will not return a null, and sets
/// \p Speculative based on whether the returned conclusion is a speculative
/// conclusion due to SCC calls.
static bool isReturnNonNull(Function *F, SmallPtrSet<Function *, 8> &SCCNodes,
const TargetLibraryInfo &TLI, bool &Speculative) {
assert(F->getReturnType()->isPointerTy() && assert(F->getReturnType()->isPointerTy() &&
"nonnull only meaningful on pointer types"); "nonnull only meaningful on pointer types");
Speculative = false; Speculative = false;
@ -814,7 +817,7 @@ bool FunctionAttrs::ReturnsNonNull(Function *F,
Value *RetVal = FlowsToReturn[i]; Value *RetVal = FlowsToReturn[i];
// If this value is locally known to be non-null, we're good // If this value is locally known to be non-null, we're good
if (isKnownNonNull(RetVal, TLI)) if (isKnownNonNull(RetVal, &TLI))
continue; continue;
// Otherwise, we need to look upwards since we can't make any local // Otherwise, we need to look upwards since we can't make any local
@ -902,7 +905,7 @@ bool FunctionAttrs::AddNonNullAttrs(const CallGraphSCC &SCC) {
continue; continue;
bool Speculative = false; bool Speculative = false;
if (ReturnsNonNull(F, SCCNodes, Speculative)) { if (isReturnNonNull(F, SCCNodes, *TLI, Speculative)) {
if (!Speculative) { if (!Speculative) {
// Mark the function eagerly since we may discover a function // Mark the function eagerly since we may discover a function
// which prevents us from speculating about the entire SCC // which prevents us from speculating about the entire SCC