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

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 13 01:17:14 PDT 2015

Author: chandlerc
Date: Sun Sep 13 03:17:14 2015
New Revision: 247524

URL: http://llvm.org/viewvc/llvm-project?rev=247524&view=rev
[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.


Modified: llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp?rev=247524&r1=247523&r2=247524&view=diff
--- llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp Sun Sep 13 03:17:14 2015
@@ -74,8 +74,6 @@ private:
   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);
@@ -798,9 +796,14 @@ bool FunctionAttrs::AddNoAliasAttrs(cons
 /// 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;
@@ -814,7 +817,7 @@ bool FunctionAttrs::ReturnsNonNull(Funct
     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))
     // Otherwise, we need to look upwards since we can't make any local
@@ -902,7 +905,7 @@ bool FunctionAttrs::AddNonNullAttrs(cons
     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

More information about the llvm-commits mailing list