[llvm] r178714 - Refactored out the helper function FindPredecessorRetainWithSafePath from ObjCARCOpt::OptimizeReturns.

Michael Gottesman mgottesman at apple.com
Wed Apr 3 16:16:05 PDT 2013


Author: mgottesman
Date: Wed Apr  3 18:16:05 2013
New Revision: 178714

URL: http://llvm.org/viewvc/llvm-project?rev=178714&view=rev
Log:
Refactored out the helper function FindPredecessorRetainWithSafePath from ObjCARCOpt::OptimizeReturns.

Modified:
    llvm/trunk/lib/Transforms/ObjCARC/ObjCARCOpts.cpp

Modified: llvm/trunk/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/ObjCARC/ObjCARCOpts.cpp?rev=178714&r1=178713&r2=178714&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/ObjCARC/ObjCARCOpts.cpp (original)
+++ llvm/trunk/lib/Transforms/ObjCARC/ObjCARCOpts.cpp Wed Apr  3 18:16:05 2013
@@ -2807,6 +2807,33 @@ HasSafePathToPredecessorCall(const Value
   return true;
 }
 
+/// Find a dependent retain that precedes the given autorelease for which there
+/// is nothing in between the two instructions that can affect the ref count of
+/// Arg.
+static CallInst *
+FindPredecessorRetainWithSafePath(const Value *Arg, BasicBlock *BB,
+                                  Instruction *Autorelease,
+                                  SmallPtrSet<Instruction *, 4> &DepInsts,
+                                  SmallPtrSet<const BasicBlock *, 4> &Visited,
+                                  ProvenanceAnalysis &PA) {
+  FindDependencies(CanChangeRetainCount, Arg,
+                   BB, Autorelease, DepInsts, Visited, PA);
+  if (DepInsts.size() != 1)
+    return 0;
+  
+  CallInst *Retain =
+    dyn_cast_or_null<CallInst>(*DepInsts.begin());
+  
+  // Check that we found a retain with the same argument.
+  if (!Retain ||
+      !IsRetain(GetBasicInstructionClass(Retain)) ||
+      GetObjCArg(Retain) != Arg) {
+    return 0;
+  }
+  
+  return Retain;
+}
+
 /// Look for this pattern:
 /// \code
 ///    %call = call i8* @something(...)
@@ -2849,26 +2876,13 @@ void ObjCARCOpt::OptimizeReturns(Functio
       DependingInstructions.clear();
       Visited.clear();
 
-      // Check that there is nothing that can affect the reference
-      // count between the autorelease and the retain.
-      FindDependencies(CanChangeRetainCount, Arg,
-                       BB, Autorelease, DependingInstructions, Visited, PA);
-      if (DependingInstructions.size() != 1)
-        goto next_block;
-
-      {
-        CallInst *Retain =
-          dyn_cast_or_null<CallInst>(*DependingInstructions.begin());
-
-        // Check that we found a retain with the same argument.
-        if (!Retain ||
-            !IsRetain(GetBasicInstructionClass(Retain)) ||
-            GetObjCArg(Retain) != Arg)
-          goto next_block;
-
+      CallInst *Retain = 0;
+      if ((Retain = FindPredecessorRetainWithSafePath(Arg, BB, Autorelease,
+                                                      DependingInstructions,
+                                                      Visited, PA))) {
         DependingInstructions.clear();
         Visited.clear();
-
+        
         // Check that there is nothing that can affect the reference count
         // between the retain and the call.  Note that Retain need not be in BB.
         if (HasSafePathToPredecessorCall(Arg, Retain, DependingInstructions,





More information about the llvm-commits mailing list