summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
b216356)
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247524
91177308-0d34-0410-b5e6-
96231b3b80d8
bool AddArgumentAttrs(const CallGraphSCC &SCC);
bool IsFunctionMallocLike(Function *F, SmallPtrSet<Function *, 8> &) const;
bool AddNoAliasAttrs(const CallGraphSCC &SCC);
bool AddArgumentAttrs(const CallGraphSCC &SCC);
bool IsFunctionMallocLike(Function *F, SmallPtrSet<Function *, 8> &) const;
bool AddNoAliasAttrs(const CallGraphSCC &SCC);
- bool ReturnsNonNull(Function *F, SmallPtrSet<Function *, 8> &,
- bool &Speculative) const;
bool AddNonNullAttrs(const CallGraphSCC &SCC);
bool annotateLibraryCalls(const CallGraphSCC &SCC);
};
bool AddNonNullAttrs(const CallGraphSCC &SCC);
bool annotateLibraryCalls(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,
- bool &Speculative) const {
+///
+/// Requires that the function returns a pointer.
+///
+/// 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() &&
"nonnull only meaningful on pointer types");
Speculative = false;
assert(F->getReturnType()->isPointerTy() &&
"nonnull only meaningful on pointer types");
Speculative = false;
Value *RetVal = FlowsToReturn[i];
// If this value is locally known to be non-null, we're good
Value *RetVal = FlowsToReturn[i];
// If this value is locally known to be non-null, we're good
- if (isKnownNonNull(RetVal, TLI))
+ if (isKnownNonNull(RetVal, &TLI))
continue;
// Otherwise, we need to look upwards since we can't make any local
continue;
// Otherwise, we need to look upwards since we can't make any local
continue;
bool Speculative = false;
continue;
bool Speculative = false;
- if (ReturnsNonNull(F, SCCNodes, Speculative)) {
+ if (isReturnNonNull(F, SCCNodes, *TLI, Speculative)) {
if (!Speculative) {
// Mark the function eagerly since we may discover a function
// which prevents us from speculating about the entire SCC
if (!Speculative) {
// Mark the function eagerly since we may discover a function
// which prevents us from speculating about the entire SCC