forked from OSchip/llvm-project
[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:
parent
8671fcbbd6
commit
8874b78697
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue