1 //===- ObjCARCOpts.cpp - ObjC ARC Optimization ----------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// This file defines ObjC ARC optimizations. ARC stands for Automatic
12 /// Reference Counting and is a system for managing reference counts for objects
13 /// in Objective C.
14 ///
15 /// The optimizations performed include elimination of redundant, partially
16 /// redundant, and inconsequential reference count operations, elimination of
17 /// redundant weak pointer operations, and numerous minor simplifications.
18 ///
19 /// WARNING: This file knows about certain library functions. It recognizes them
20 /// by name, and hardwires knowledge of their semantics.
21 ///
22 /// WARNING: This file knows about how certain Objective-C library functions are
23 /// used. Naive LLVM IR transformations which would otherwise be
24 /// behavior-preserving may break these assumptions.
25 //
26 //===----------------------------------------------------------------------===//
27 
28 #include "ARCRuntimeEntryPoints.h"
29 #include "BlotMapVector.h"
30 #include "DependencyAnalysis.h"
31 #include "ObjCARC.h"
32 #include "ProvenanceAnalysis.h"
33 #include "PtrState.h"
34 #include "llvm/ADT/DenseMap.h"
35 #include "llvm/ADT/None.h"
36 #include "llvm/ADT/STLExtras.h"
37 #include "llvm/ADT/SmallPtrSet.h"
38 #include "llvm/ADT/SmallVector.h"
39 #include "llvm/ADT/Statistic.h"
40 #include "llvm/Analysis/AliasAnalysis.h"
41 #include "llvm/Analysis/EHPersonalities.h"
42 #include "llvm/Analysis/ObjCARCAliasAnalysis.h"
43 #include "llvm/Analysis/ObjCARCAnalysisUtils.h"
44 #include "llvm/Analysis/ObjCARCInstKind.h"
45 #include "llvm/IR/BasicBlock.h"
46 #include "llvm/IR/CFG.h"
47 #include "llvm/IR/CallSite.h"
48 #include "llvm/IR/Constant.h"
49 #include "llvm/IR/Constants.h"
50 #include "llvm/IR/DerivedTypes.h"
51 #include "llvm/IR/Function.h"
52 #include "llvm/IR/GlobalVariable.h"
53 #include "llvm/IR/InstIterator.h"
54 #include "llvm/IR/InstrTypes.h"
55 #include "llvm/IR/Instruction.h"
56 #include "llvm/IR/Instructions.h"
57 #include "llvm/IR/LLVMContext.h"
58 #include "llvm/IR/Metadata.h"
59 #include "llvm/IR/Type.h"
60 #include "llvm/IR/User.h"
61 #include "llvm/IR/Value.h"
62 #include "llvm/Pass.h"
63 #include "llvm/Support/Casting.h"
64 #include "llvm/Support/Compiler.h"
65 #include "llvm/Support/Debug.h"
66 #include "llvm/Support/ErrorHandling.h"
67 #include "llvm/Support/raw_ostream.h"
68 #include <cassert>
69 #include <iterator>
70 #include <utility>
71 
72 using namespace llvm;
73 using namespace llvm::objcarc;
74 
75 #define DEBUG_TYPE "objc-arc-opts"
76 
77 /// \defgroup ARCUtilities Utility declarations/definitions specific to ARC.
78 /// @{
79 
80 /// This is similar to GetRCIdentityRoot but it stops as soon
81 /// as it finds a value with multiple uses.
FindSingleUseIdentifiedObject(const Value * Arg)82 static const Value *FindSingleUseIdentifiedObject(const Value *Arg) {
83   // ConstantData (like ConstantPointerNull and UndefValue) is used across
84   // modules.  It's never a single-use value.
85   if (isa<ConstantData>(Arg))
86     return nullptr;
87 
88   if (Arg->hasOneUse()) {
89     if (const BitCastInst *BC = dyn_cast<BitCastInst>(Arg))
90       return FindSingleUseIdentifiedObject(BC->getOperand(0));
91     if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Arg))
92       if (GEP->hasAllZeroIndices())
93         return FindSingleUseIdentifiedObject(GEP->getPointerOperand());
94     if (IsForwarding(GetBasicARCInstKind(Arg)))
95       return FindSingleUseIdentifiedObject(
96                cast<CallInst>(Arg)->getArgOperand(0));
97     if (!IsObjCIdentifiedObject(Arg))
98       return nullptr;
99     return Arg;
100   }
101 
102   // If we found an identifiable object but it has multiple uses, but they are
103   // trivial uses, we can still consider this to be a single-use value.
104   if (IsObjCIdentifiedObject(Arg)) {
105     for (const User *U : Arg->users())
106       if (!U->use_empty() || GetRCIdentityRoot(U) != Arg)
107          return nullptr;
108 
109     return Arg;
110   }
111 
112   return nullptr;
113 }
114 
115 /// @}
116 ///
117 /// \defgroup ARCOpt ARC Optimization.
118 /// @{
119 
120 // TODO: On code like this:
121 //
122 // objc_retain(%x)
123 // stuff_that_cannot_release()
124 // objc_autorelease(%x)
125 // stuff_that_cannot_release()
126 // objc_retain(%x)
127 // stuff_that_cannot_release()
128 // objc_autorelease(%x)
129 //
130 // The second retain and autorelease can be deleted.
131 
132 // TODO: It should be possible to delete
133 // objc_autoreleasePoolPush and objc_autoreleasePoolPop
134 // pairs if nothing is actually autoreleased between them. Also, autorelease
135 // calls followed by objc_autoreleasePoolPop calls (perhaps in ObjC++ code
136 // after inlining) can be turned into plain release calls.
137 
138 // TODO: Critical-edge splitting. If the optimial insertion point is
139 // a critical edge, the current algorithm has to fail, because it doesn't
140 // know how to split edges. It should be possible to make the optimizer
141 // think in terms of edges, rather than blocks, and then split critical
142 // edges on demand.
143 
144 // TODO: OptimizeSequences could generalized to be Interprocedural.
145 
146 // TODO: Recognize that a bunch of other objc runtime calls have
147 // non-escaping arguments and non-releasing arguments, and may be
148 // non-autoreleasing.
149 
150 // TODO: Sink autorelease calls as far as possible. Unfortunately we
151 // usually can't sink them past other calls, which would be the main
152 // case where it would be useful.
153 
154 // TODO: The pointer returned from objc_loadWeakRetained is retained.
155 
156 // TODO: Delete release+retain pairs (rare).
157 
158 STATISTIC(NumNoops,       "Number of no-op objc calls eliminated");
159 STATISTIC(NumPartialNoops, "Number of partially no-op objc calls eliminated");
160 STATISTIC(NumAutoreleases,"Number of autoreleases converted to releases");
161 STATISTIC(NumRets,        "Number of return value forwarding "
162                           "retain+autoreleases eliminated");
163 STATISTIC(NumRRs,         "Number of retain+release paths eliminated");
164 STATISTIC(NumPeeps,       "Number of calls peephole-optimized");
165 #ifndef NDEBUG
166 STATISTIC(NumRetainsBeforeOpt,
167           "Number of retains before optimization");
168 STATISTIC(NumReleasesBeforeOpt,
169           "Number of releases before optimization");
170 STATISTIC(NumRetainsAfterOpt,
171           "Number of retains after optimization");
172 STATISTIC(NumReleasesAfterOpt,
173           "Number of releases after optimization");
174 #endif
175 
176 namespace {
177 
178   /// Per-BasicBlock state.
179   class BBState {
180     /// The number of unique control paths from the entry which can reach this
181     /// block.
182     unsigned TopDownPathCount = 0;
183 
184     /// The number of unique control paths to exits from this block.
185     unsigned BottomUpPathCount = 0;
186 
187     /// The top-down traversal uses this to record information known about a
188     /// pointer at the bottom of each block.
189     BlotMapVector<const Value *, TopDownPtrState> PerPtrTopDown;
190 
191     /// The bottom-up traversal uses this to record information known about a
192     /// pointer at the top of each block.
193     BlotMapVector<const Value *, BottomUpPtrState> PerPtrBottomUp;
194 
195     /// Effective predecessors of the current block ignoring ignorable edges and
196     /// ignored backedges.
197     SmallVector<BasicBlock *, 2> Preds;
198 
199     /// Effective successors of the current block ignoring ignorable edges and
200     /// ignored backedges.
201     SmallVector<BasicBlock *, 2> Succs;
202 
203   public:
204     static const unsigned OverflowOccurredValue;
205 
206     BBState() = default;
207 
208     using top_down_ptr_iterator = decltype(PerPtrTopDown)::iterator;
209     using const_top_down_ptr_iterator = decltype(PerPtrTopDown)::const_iterator;
210 
top_down_ptr_begin()211     top_down_ptr_iterator top_down_ptr_begin() { return PerPtrTopDown.begin(); }
top_down_ptr_end()212     top_down_ptr_iterator top_down_ptr_end() { return PerPtrTopDown.end(); }
top_down_ptr_begin() const213     const_top_down_ptr_iterator top_down_ptr_begin() const {
214       return PerPtrTopDown.begin();
215     }
top_down_ptr_end() const216     const_top_down_ptr_iterator top_down_ptr_end() const {
217       return PerPtrTopDown.end();
218     }
hasTopDownPtrs() const219     bool hasTopDownPtrs() const {
220       return !PerPtrTopDown.empty();
221     }
222 
223     using bottom_up_ptr_iterator = decltype(PerPtrBottomUp)::iterator;
224     using const_bottom_up_ptr_iterator =
225         decltype(PerPtrBottomUp)::const_iterator;
226 
bottom_up_ptr_begin()227     bottom_up_ptr_iterator bottom_up_ptr_begin() {
228       return PerPtrBottomUp.begin();
229     }
bottom_up_ptr_end()230     bottom_up_ptr_iterator bottom_up_ptr_end() { return PerPtrBottomUp.end(); }
bottom_up_ptr_begin() const231     const_bottom_up_ptr_iterator bottom_up_ptr_begin() const {
232       return PerPtrBottomUp.begin();
233     }
bottom_up_ptr_end() const234     const_bottom_up_ptr_iterator bottom_up_ptr_end() const {
235       return PerPtrBottomUp.end();
236     }
hasBottomUpPtrs() const237     bool hasBottomUpPtrs() const {
238       return !PerPtrBottomUp.empty();
239     }
240 
241     /// Mark this block as being an entry block, which has one path from the
242     /// entry by definition.
SetAsEntry()243     void SetAsEntry() { TopDownPathCount = 1; }
244 
245     /// Mark this block as being an exit block, which has one path to an exit by
246     /// definition.
SetAsExit()247     void SetAsExit()  { BottomUpPathCount = 1; }
248 
249     /// Attempt to find the PtrState object describing the top down state for
250     /// pointer Arg. Return a new initialized PtrState describing the top down
251     /// state for Arg if we do not find one.
getPtrTopDownState(const Value * Arg)252     TopDownPtrState &getPtrTopDownState(const Value *Arg) {
253       return PerPtrTopDown[Arg];
254     }
255 
256     /// Attempt to find the PtrState object describing the bottom up state for
257     /// pointer Arg. Return a new initialized PtrState describing the bottom up
258     /// state for Arg if we do not find one.
getPtrBottomUpState(const Value * Arg)259     BottomUpPtrState &getPtrBottomUpState(const Value *Arg) {
260       return PerPtrBottomUp[Arg];
261     }
262 
263     /// Attempt to find the PtrState object describing the bottom up state for
264     /// pointer Arg.
findPtrBottomUpState(const Value * Arg)265     bottom_up_ptr_iterator findPtrBottomUpState(const Value *Arg) {
266       return PerPtrBottomUp.find(Arg);
267     }
268 
clearBottomUpPointers()269     void clearBottomUpPointers() {
270       PerPtrBottomUp.clear();
271     }
272 
clearTopDownPointers()273     void clearTopDownPointers() {
274       PerPtrTopDown.clear();
275     }
276 
277     void InitFromPred(const BBState &Other);
278     void InitFromSucc(const BBState &Other);
279     void MergePred(const BBState &Other);
280     void MergeSucc(const BBState &Other);
281 
282     /// Compute the number of possible unique paths from an entry to an exit
283     /// which pass through this block. This is only valid after both the
284     /// top-down and bottom-up traversals are complete.
285     ///
286     /// Returns true if overflow occurred. Returns false if overflow did not
287     /// occur.
GetAllPathCountWithOverflow(unsigned & PathCount) const288     bool GetAllPathCountWithOverflow(unsigned &PathCount) const {
289       if (TopDownPathCount == OverflowOccurredValue ||
290           BottomUpPathCount == OverflowOccurredValue)
291         return true;
292       unsigned long long Product =
293         (unsigned long long)TopDownPathCount*BottomUpPathCount;
294       // Overflow occurred if any of the upper bits of Product are set or if all
295       // the lower bits of Product are all set.
296       return (Product >> 32) ||
297              ((PathCount = Product) == OverflowOccurredValue);
298     }
299 
300     // Specialized CFG utilities.
301     using edge_iterator = SmallVectorImpl<BasicBlock *>::const_iterator;
302 
pred_begin() const303     edge_iterator pred_begin() const { return Preds.begin(); }
pred_end() const304     edge_iterator pred_end() const { return Preds.end(); }
succ_begin() const305     edge_iterator succ_begin() const { return Succs.begin(); }
succ_end() const306     edge_iterator succ_end() const { return Succs.end(); }
307 
addSucc(BasicBlock * Succ)308     void addSucc(BasicBlock *Succ) { Succs.push_back(Succ); }
addPred(BasicBlock * Pred)309     void addPred(BasicBlock *Pred) { Preds.push_back(Pred); }
310 
isExit() const311     bool isExit() const { return Succs.empty(); }
312   };
313 
314 } // end anonymous namespace
315 
316 const unsigned BBState::OverflowOccurredValue = 0xffffffff;
317 
318 namespace llvm {
319 
320 raw_ostream &operator<<(raw_ostream &OS,
321                         BBState &BBState) LLVM_ATTRIBUTE_UNUSED;
322 
323 } // end namespace llvm
324 
InitFromPred(const BBState & Other)325 void BBState::InitFromPred(const BBState &Other) {
326   PerPtrTopDown = Other.PerPtrTopDown;
327   TopDownPathCount = Other.TopDownPathCount;
328 }
329 
InitFromSucc(const BBState & Other)330 void BBState::InitFromSucc(const BBState &Other) {
331   PerPtrBottomUp = Other.PerPtrBottomUp;
332   BottomUpPathCount = Other.BottomUpPathCount;
333 }
334 
335 /// The top-down traversal uses this to merge information about predecessors to
336 /// form the initial state for a new block.
MergePred(const BBState & Other)337 void BBState::MergePred(const BBState &Other) {
338   if (TopDownPathCount == OverflowOccurredValue)
339     return;
340 
341   // Other.TopDownPathCount can be 0, in which case it is either dead or a
342   // loop backedge. Loop backedges are special.
343   TopDownPathCount += Other.TopDownPathCount;
344 
345   // In order to be consistent, we clear the top down pointers when by adding
346   // TopDownPathCount becomes OverflowOccurredValue even though "true" overflow
347   // has not occurred.
348   if (TopDownPathCount == OverflowOccurredValue) {
349     clearTopDownPointers();
350     return;
351   }
352 
353   // Check for overflow. If we have overflow, fall back to conservative
354   // behavior.
355   if (TopDownPathCount < Other.TopDownPathCount) {
356     TopDownPathCount = OverflowOccurredValue;
357     clearTopDownPointers();
358     return;
359   }
360 
361   // For each entry in the other set, if our set has an entry with the same key,
362   // merge the entries. Otherwise, copy the entry and merge it with an empty
363   // entry.
364   for (auto MI = Other.top_down_ptr_begin(), ME = Other.top_down_ptr_end();
365        MI != ME; ++MI) {
366     auto Pair = PerPtrTopDown.insert(*MI);
367     Pair.first->second.Merge(Pair.second ? TopDownPtrState() : MI->second,
368                              /*TopDown=*/true);
369   }
370 
371   // For each entry in our set, if the other set doesn't have an entry with the
372   // same key, force it to merge with an empty entry.
373   for (auto MI = top_down_ptr_begin(), ME = top_down_ptr_end(); MI != ME; ++MI)
374     if (Other.PerPtrTopDown.find(MI->first) == Other.PerPtrTopDown.end())
375       MI->second.Merge(TopDownPtrState(), /*TopDown=*/true);
376 }
377 
378 /// The bottom-up traversal uses this to merge information about successors to
379 /// form the initial state for a new block.
MergeSucc(const BBState & Other)380 void BBState::MergeSucc(const BBState &Other) {
381   if (BottomUpPathCount == OverflowOccurredValue)
382     return;
383 
384   // Other.BottomUpPathCount can be 0, in which case it is either dead or a
385   // loop backedge. Loop backedges are special.
386   BottomUpPathCount += Other.BottomUpPathCount;
387 
388   // In order to be consistent, we clear the top down pointers when by adding
389   // BottomUpPathCount becomes OverflowOccurredValue even though "true" overflow
390   // has not occurred.
391   if (BottomUpPathCount == OverflowOccurredValue) {
392     clearBottomUpPointers();
393     return;
394   }
395 
396   // Check for overflow. If we have overflow, fall back to conservative
397   // behavior.
398   if (BottomUpPathCount < Other.BottomUpPathCount) {
399     BottomUpPathCount = OverflowOccurredValue;
400     clearBottomUpPointers();
401     return;
402   }
403 
404   // For each entry in the other set, if our set has an entry with the
405   // same key, merge the entries. Otherwise, copy the entry and merge
406   // it with an empty entry.
407   for (auto MI = Other.bottom_up_ptr_begin(), ME = Other.bottom_up_ptr_end();
408        MI != ME; ++MI) {
409     auto Pair = PerPtrBottomUp.insert(*MI);
410     Pair.first->second.Merge(Pair.second ? BottomUpPtrState() : MI->second,
411                              /*TopDown=*/false);
412   }
413 
414   // For each entry in our set, if the other set doesn't have an entry
415   // with the same key, force it to merge with an empty entry.
416   for (auto MI = bottom_up_ptr_begin(), ME = bottom_up_ptr_end(); MI != ME;
417        ++MI)
418     if (Other.PerPtrBottomUp.find(MI->first) == Other.PerPtrBottomUp.end())
419       MI->second.Merge(BottomUpPtrState(), /*TopDown=*/false);
420 }
421 
operator <<(raw_ostream & OS,BBState & BBInfo)422 raw_ostream &llvm::operator<<(raw_ostream &OS, BBState &BBInfo) {
423   // Dump the pointers we are tracking.
424   OS << "    TopDown State:\n";
425   if (!BBInfo.hasTopDownPtrs()) {
426     LLVM_DEBUG(dbgs() << "        NONE!\n");
427   } else {
428     for (auto I = BBInfo.top_down_ptr_begin(), E = BBInfo.top_down_ptr_end();
429          I != E; ++I) {
430       const PtrState &P = I->second;
431       OS << "        Ptr: " << *I->first
432          << "\n            KnownSafe:        " << (P.IsKnownSafe()?"true":"false")
433          << "\n            ImpreciseRelease: "
434            << (P.IsTrackingImpreciseReleases()?"true":"false") << "\n"
435          << "            HasCFGHazards:    "
436            << (P.IsCFGHazardAfflicted()?"true":"false") << "\n"
437          << "            KnownPositive:    "
438            << (P.HasKnownPositiveRefCount()?"true":"false") << "\n"
439          << "            Seq:              "
440          << P.GetSeq() << "\n";
441     }
442   }
443 
444   OS << "    BottomUp State:\n";
445   if (!BBInfo.hasBottomUpPtrs()) {
446     LLVM_DEBUG(dbgs() << "        NONE!\n");
447   } else {
448     for (auto I = BBInfo.bottom_up_ptr_begin(), E = BBInfo.bottom_up_ptr_end();
449          I != E; ++I) {
450       const PtrState &P = I->second;
451       OS << "        Ptr: " << *I->first
452          << "\n            KnownSafe:        " << (P.IsKnownSafe()?"true":"false")
453          << "\n            ImpreciseRelease: "
454            << (P.IsTrackingImpreciseReleases()?"true":"false") << "\n"
455          << "            HasCFGHazards:    "
456            << (P.IsCFGHazardAfflicted()?"true":"false") << "\n"
457          << "            KnownPositive:    "
458            << (P.HasKnownPositiveRefCount()?"true":"false") << "\n"
459          << "            Seq:              "
460          << P.GetSeq() << "\n";
461     }
462   }
463 
464   return OS;
465 }
466 
467 namespace {
468 
469   /// The main ARC optimization pass.
470   class ObjCARCOpt : public FunctionPass {
471     bool Changed;
472     ProvenanceAnalysis PA;
473 
474     /// A cache of references to runtime entry point constants.
475     ARCRuntimeEntryPoints EP;
476 
477     /// A cache of MDKinds that can be passed into other functions to propagate
478     /// MDKind identifiers.
479     ARCMDKindCache MDKindCache;
480 
481     /// A flag indicating whether this optimization pass should run.
482     bool Run;
483 
484     /// Flags which determine whether each of the interesting runtime functions
485     /// is in fact used in the current function.
486     unsigned UsedInThisFunction;
487 
488     bool OptimizeRetainRVCall(Function &F, Instruction *RetainRV);
489     void OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV,
490                                    ARCInstKind &Class);
491     void OptimizeIndividualCalls(Function &F);
492 
493     void CheckForCFGHazards(const BasicBlock *BB,
494                             DenseMap<const BasicBlock *, BBState> &BBStates,
495                             BBState &MyStates) const;
496     bool VisitInstructionBottomUp(Instruction *Inst, BasicBlock *BB,
497                                   BlotMapVector<Value *, RRInfo> &Retains,
498                                   BBState &MyStates);
499     bool VisitBottomUp(BasicBlock *BB,
500                        DenseMap<const BasicBlock *, BBState> &BBStates,
501                        BlotMapVector<Value *, RRInfo> &Retains);
502     bool VisitInstructionTopDown(Instruction *Inst,
503                                  DenseMap<Value *, RRInfo> &Releases,
504                                  BBState &MyStates);
505     bool VisitTopDown(BasicBlock *BB,
506                       DenseMap<const BasicBlock *, BBState> &BBStates,
507                       DenseMap<Value *, RRInfo> &Releases);
508     bool Visit(Function &F, DenseMap<const BasicBlock *, BBState> &BBStates,
509                BlotMapVector<Value *, RRInfo> &Retains,
510                DenseMap<Value *, RRInfo> &Releases);
511 
512     void MoveCalls(Value *Arg, RRInfo &RetainsToMove, RRInfo &ReleasesToMove,
513                    BlotMapVector<Value *, RRInfo> &Retains,
514                    DenseMap<Value *, RRInfo> &Releases,
515                    SmallVectorImpl<Instruction *> &DeadInsts, Module *M);
516 
517     bool
518     PairUpRetainsAndReleases(DenseMap<const BasicBlock *, BBState> &BBStates,
519                              BlotMapVector<Value *, RRInfo> &Retains,
520                              DenseMap<Value *, RRInfo> &Releases, Module *M,
521                              Instruction * Retain,
522                              SmallVectorImpl<Instruction *> &DeadInsts,
523                              RRInfo &RetainsToMove, RRInfo &ReleasesToMove,
524                              Value *Arg, bool KnownSafe,
525                              bool &AnyPairsCompletelyEliminated);
526 
527     bool PerformCodePlacement(DenseMap<const BasicBlock *, BBState> &BBStates,
528                               BlotMapVector<Value *, RRInfo> &Retains,
529                               DenseMap<Value *, RRInfo> &Releases, Module *M);
530 
531     void OptimizeWeakCalls(Function &F);
532 
533     bool OptimizeSequences(Function &F);
534 
535     void OptimizeReturns(Function &F);
536 
537 #ifndef NDEBUG
538     void GatherStatistics(Function &F, bool AfterOptimization = false);
539 #endif
540 
541     void getAnalysisUsage(AnalysisUsage &AU) const override;
542     bool doInitialization(Module &M) override;
543     bool runOnFunction(Function &F) override;
544     void releaseMemory() override;
545 
546   public:
547     static char ID;
548 
ObjCARCOpt()549     ObjCARCOpt() : FunctionPass(ID) {
550       initializeObjCARCOptPass(*PassRegistry::getPassRegistry());
551     }
552   };
553 
554 } // end anonymous namespace
555 
556 char ObjCARCOpt::ID = 0;
557 
558 INITIALIZE_PASS_BEGIN(ObjCARCOpt,
559                       "objc-arc", "ObjC ARC optimization", false, false)
INITIALIZE_PASS_DEPENDENCY(ObjCARCAAWrapperPass)560 INITIALIZE_PASS_DEPENDENCY(ObjCARCAAWrapperPass)
561 INITIALIZE_PASS_END(ObjCARCOpt,
562                     "objc-arc", "ObjC ARC optimization", false, false)
563 
564 Pass *llvm::createObjCARCOptPass() {
565   return new ObjCARCOpt();
566 }
567 
getAnalysisUsage(AnalysisUsage & AU) const568 void ObjCARCOpt::getAnalysisUsage(AnalysisUsage &AU) const {
569   AU.addRequired<ObjCARCAAWrapperPass>();
570   AU.addRequired<AAResultsWrapperPass>();
571   // ARC optimization doesn't currently split critical edges.
572   AU.setPreservesCFG();
573 }
574 
575 /// Turn objc_retainAutoreleasedReturnValue into objc_retain if the operand is
576 /// not a return value.  Or, if it can be paired with an
577 /// objc_autoreleaseReturnValue, delete the pair and return true.
578 bool
OptimizeRetainRVCall(Function & F,Instruction * RetainRV)579 ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) {
580   // Check for the argument being from an immediately preceding call or invoke.
581   const Value *Arg = GetArgRCIdentityRoot(RetainRV);
582   ImmutableCallSite CS(Arg);
583   if (const Instruction *Call = CS.getInstruction()) {
584     if (Call->getParent() == RetainRV->getParent()) {
585       BasicBlock::const_iterator I(Call);
586       ++I;
587       while (IsNoopInstruction(&*I))
588         ++I;
589       if (&*I == RetainRV)
590         return false;
591     } else if (const InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
592       BasicBlock *RetainRVParent = RetainRV->getParent();
593       if (II->getNormalDest() == RetainRVParent) {
594         BasicBlock::const_iterator I = RetainRVParent->begin();
595         while (IsNoopInstruction(&*I))
596           ++I;
597         if (&*I == RetainRV)
598           return false;
599       }
600     }
601   }
602 
603   // Track PHIs which are equivalent to our Arg.
604   SmallDenseSet<const Value*, 2> EquivalentArgs;
605   EquivalentArgs.insert(Arg);
606 
607   // Add PHIs that are equivalent to Arg to ArgUsers.
608   if (const PHINode *PN = dyn_cast<PHINode>(Arg)) {
609     SmallVector<const Value *, 2> ArgUsers;
610     getEquivalentPHIs(*PN, ArgUsers);
611     EquivalentArgs.insert(ArgUsers.begin(), ArgUsers.end());
612   }
613 
614   // Check for being preceded by an objc_autoreleaseReturnValue on the same
615   // pointer. In this case, we can delete the pair.
616   BasicBlock::iterator I = RetainRV->getIterator(),
617                        Begin = RetainRV->getParent()->begin();
618   if (I != Begin) {
619     do
620       --I;
621     while (I != Begin && IsNoopInstruction(&*I));
622     if (GetBasicARCInstKind(&*I) == ARCInstKind::AutoreleaseRV &&
623         EquivalentArgs.count(GetArgRCIdentityRoot(&*I))) {
624       Changed = true;
625       ++NumPeeps;
626 
627       LLVM_DEBUG(dbgs() << "Erasing autoreleaseRV,retainRV pair: " << *I << "\n"
628                         << "Erasing " << *RetainRV << "\n");
629 
630       EraseInstruction(&*I);
631       EraseInstruction(RetainRV);
632       return true;
633     }
634   }
635 
636   // Turn it to a plain objc_retain.
637   Changed = true;
638   ++NumPeeps;
639 
640   LLVM_DEBUG(dbgs() << "Transforming objc_retainAutoreleasedReturnValue => "
641                        "objc_retain since the operand is not a return value.\n"
642                        "Old = "
643                     << *RetainRV << "\n");
644 
645   Constant *NewDecl = EP.get(ARCRuntimeEntryPointKind::Retain);
646   cast<CallInst>(RetainRV)->setCalledFunction(NewDecl);
647 
648   LLVM_DEBUG(dbgs() << "New = " << *RetainRV << "\n");
649 
650   return false;
651 }
652 
653 /// Turn objc_autoreleaseReturnValue into objc_autorelease if the result is not
654 /// used as a return value.
OptimizeAutoreleaseRVCall(Function & F,Instruction * AutoreleaseRV,ARCInstKind & Class)655 void ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F,
656                                            Instruction *AutoreleaseRV,
657                                            ARCInstKind &Class) {
658   // Check for a return of the pointer value.
659   const Value *Ptr = GetArgRCIdentityRoot(AutoreleaseRV);
660 
661   // If the argument is ConstantPointerNull or UndefValue, its other users
662   // aren't actually interesting to look at.
663   if (isa<ConstantData>(Ptr))
664     return;
665 
666   SmallVector<const Value *, 2> Users;
667   Users.push_back(Ptr);
668 
669   // Add PHIs that are equivalent to Ptr to Users.
670   if (const PHINode *PN = dyn_cast<PHINode>(Ptr))
671     getEquivalentPHIs(*PN, Users);
672 
673   do {
674     Ptr = Users.pop_back_val();
675     for (const User *U : Ptr->users()) {
676       if (isa<ReturnInst>(U) || GetBasicARCInstKind(U) == ARCInstKind::RetainRV)
677         return;
678       if (isa<BitCastInst>(U))
679         Users.push_back(U);
680     }
681   } while (!Users.empty());
682 
683   Changed = true;
684   ++NumPeeps;
685 
686   LLVM_DEBUG(
687       dbgs() << "Transforming objc_autoreleaseReturnValue => "
688                 "objc_autorelease since its operand is not used as a return "
689                 "value.\n"
690                 "Old = "
691              << *AutoreleaseRV << "\n");
692 
693   CallInst *AutoreleaseRVCI = cast<CallInst>(AutoreleaseRV);
694   Constant *NewDecl = EP.get(ARCRuntimeEntryPointKind::Autorelease);
695   AutoreleaseRVCI->setCalledFunction(NewDecl);
696   AutoreleaseRVCI->setTailCall(false); // Never tail call objc_autorelease.
697   Class = ARCInstKind::Autorelease;
698 
699   LLVM_DEBUG(dbgs() << "New: " << *AutoreleaseRV << "\n");
700 }
701 
702 namespace {
703 Instruction *
CloneCallInstForBB(CallInst & CI,BasicBlock & BB,const DenseMap<BasicBlock *,ColorVector> & BlockColors)704 CloneCallInstForBB(CallInst &CI, BasicBlock &BB,
705                    const DenseMap<BasicBlock *, ColorVector> &BlockColors) {
706   SmallVector<OperandBundleDef, 1> OpBundles;
707   for (unsigned I = 0, E = CI.getNumOperandBundles(); I != E; ++I) {
708     auto Bundle = CI.getOperandBundleAt(I);
709     // Funclets will be reassociated in the future.
710     if (Bundle.getTagID() == LLVMContext::OB_funclet)
711       continue;
712     OpBundles.emplace_back(Bundle);
713   }
714 
715   if (!BlockColors.empty()) {
716     const ColorVector &CV = BlockColors.find(&BB)->second;
717     assert(CV.size() == 1 && "non-unique color for block!");
718     Instruction *EHPad = CV.front()->getFirstNonPHI();
719     if (EHPad->isEHPad())
720       OpBundles.emplace_back("funclet", EHPad);
721   }
722 
723   return CallInst::Create(&CI, OpBundles);
724 }
725 }
726 
727 /// Visit each call, one at a time, and make simplifications without doing any
728 /// additional analysis.
OptimizeIndividualCalls(Function & F)729 void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
730   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::OptimizeIndividualCalls ==\n");
731   // Reset all the flags in preparation for recomputing them.
732   UsedInThisFunction = 0;
733 
734   DenseMap<BasicBlock *, ColorVector> BlockColors;
735   if (F.hasPersonalityFn() &&
736       isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
737     BlockColors = colorEHFunclets(F);
738 
739   // Visit all objc_* calls in F.
740   for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
741     Instruction *Inst = &*I++;
742 
743     ARCInstKind Class = GetBasicARCInstKind(Inst);
744 
745     LLVM_DEBUG(dbgs() << "Visiting: Class: " << Class << "; " << *Inst << "\n");
746 
747     switch (Class) {
748     default: break;
749 
750     // Delete no-op casts. These function calls have special semantics, but
751     // the semantics are entirely implemented via lowering in the front-end,
752     // so by the time they reach the optimizer, they are just no-op calls
753     // which return their argument.
754     //
755     // There are gray areas here, as the ability to cast reference-counted
756     // pointers to raw void* and back allows code to break ARC assumptions,
757     // however these are currently considered to be unimportant.
758     case ARCInstKind::NoopCast:
759       Changed = true;
760       ++NumNoops;
761       LLVM_DEBUG(dbgs() << "Erasing no-op cast: " << *Inst << "\n");
762       EraseInstruction(Inst);
763       continue;
764 
765     // If the pointer-to-weak-pointer is null, it's undefined behavior.
766     case ARCInstKind::StoreWeak:
767     case ARCInstKind::LoadWeak:
768     case ARCInstKind::LoadWeakRetained:
769     case ARCInstKind::InitWeak:
770     case ARCInstKind::DestroyWeak: {
771       CallInst *CI = cast<CallInst>(Inst);
772       if (IsNullOrUndef(CI->getArgOperand(0))) {
773         Changed = true;
774         Type *Ty = CI->getArgOperand(0)->getType();
775         new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
776                       Constant::getNullValue(Ty),
777                       CI);
778         Value *NewValue = UndefValue::get(CI->getType());
779         LLVM_DEBUG(
780             dbgs() << "A null pointer-to-weak-pointer is undefined behavior."
781                       "\nOld = "
782                    << *CI << "\nNew = " << *NewValue << "\n");
783         CI->replaceAllUsesWith(NewValue);
784         CI->eraseFromParent();
785         continue;
786       }
787       break;
788     }
789     case ARCInstKind::CopyWeak:
790     case ARCInstKind::MoveWeak: {
791       CallInst *CI = cast<CallInst>(Inst);
792       if (IsNullOrUndef(CI->getArgOperand(0)) ||
793           IsNullOrUndef(CI->getArgOperand(1))) {
794         Changed = true;
795         Type *Ty = CI->getArgOperand(0)->getType();
796         new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
797                       Constant::getNullValue(Ty),
798                       CI);
799 
800         Value *NewValue = UndefValue::get(CI->getType());
801         LLVM_DEBUG(
802             dbgs() << "A null pointer-to-weak-pointer is undefined behavior."
803                       "\nOld = "
804                    << *CI << "\nNew = " << *NewValue << "\n");
805 
806         CI->replaceAllUsesWith(NewValue);
807         CI->eraseFromParent();
808         continue;
809       }
810       break;
811     }
812     case ARCInstKind::RetainRV:
813       if (OptimizeRetainRVCall(F, Inst))
814         continue;
815       break;
816     case ARCInstKind::AutoreleaseRV:
817       OptimizeAutoreleaseRVCall(F, Inst, Class);
818       break;
819     }
820 
821     // objc_autorelease(x) -> objc_release(x) if x is otherwise unused.
822     if (IsAutorelease(Class) && Inst->use_empty()) {
823       CallInst *Call = cast<CallInst>(Inst);
824       const Value *Arg = Call->getArgOperand(0);
825       Arg = FindSingleUseIdentifiedObject(Arg);
826       if (Arg) {
827         Changed = true;
828         ++NumAutoreleases;
829 
830         // Create the declaration lazily.
831         LLVMContext &C = Inst->getContext();
832 
833         Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Release);
834         CallInst *NewCall = CallInst::Create(Decl, Call->getArgOperand(0), "",
835                                              Call);
836         NewCall->setMetadata(MDKindCache.get(ARCMDKindID::ImpreciseRelease),
837                              MDNode::get(C, None));
838 
839         LLVM_DEBUG(
840             dbgs() << "Replacing autorelease{,RV}(x) with objc_release(x) "
841                       "since x is otherwise unused.\nOld: "
842                    << *Call << "\nNew: " << *NewCall << "\n");
843 
844         EraseInstruction(Call);
845         Inst = NewCall;
846         Class = ARCInstKind::Release;
847       }
848     }
849 
850     // For functions which can never be passed stack arguments, add
851     // a tail keyword.
852     if (IsAlwaysTail(Class)) {
853       Changed = true;
854       LLVM_DEBUG(
855           dbgs() << "Adding tail keyword to function since it can never be "
856                     "passed stack args: "
857                  << *Inst << "\n");
858       cast<CallInst>(Inst)->setTailCall();
859     }
860 
861     // Ensure that functions that can never have a "tail" keyword due to the
862     // semantics of ARC truly do not do so.
863     if (IsNeverTail(Class)) {
864       Changed = true;
865       LLVM_DEBUG(dbgs() << "Removing tail keyword from function: " << *Inst
866                         << "\n");
867       cast<CallInst>(Inst)->setTailCall(false);
868     }
869 
870     // Set nounwind as needed.
871     if (IsNoThrow(Class)) {
872       Changed = true;
873       LLVM_DEBUG(dbgs() << "Found no throw class. Setting nounwind on: "
874                         << *Inst << "\n");
875       cast<CallInst>(Inst)->setDoesNotThrow();
876     }
877 
878     if (!IsNoopOnNull(Class)) {
879       UsedInThisFunction |= 1 << unsigned(Class);
880       continue;
881     }
882 
883     const Value *Arg = GetArgRCIdentityRoot(Inst);
884 
885     // ARC calls with null are no-ops. Delete them.
886     if (IsNullOrUndef(Arg)) {
887       Changed = true;
888       ++NumNoops;
889       LLVM_DEBUG(dbgs() << "ARC calls with  null are no-ops. Erasing: " << *Inst
890                         << "\n");
891       EraseInstruction(Inst);
892       continue;
893     }
894 
895     // Keep track of which of retain, release, autorelease, and retain_block
896     // are actually present in this function.
897     UsedInThisFunction |= 1 << unsigned(Class);
898 
899     // If Arg is a PHI, and one or more incoming values to the
900     // PHI are null, and the call is control-equivalent to the PHI, and there
901     // are no relevant side effects between the PHI and the call, and the call
902     // is not a release that doesn't have the clang.imprecise_release tag, the
903     // call could be pushed up to just those paths with non-null incoming
904     // values. For now, don't bother splitting critical edges for this.
905     if (Class == ARCInstKind::Release &&
906         !Inst->getMetadata(MDKindCache.get(ARCMDKindID::ImpreciseRelease)))
907       continue;
908 
909     SmallVector<std::pair<Instruction *, const Value *>, 4> Worklist;
910     Worklist.push_back(std::make_pair(Inst, Arg));
911     do {
912       std::pair<Instruction *, const Value *> Pair = Worklist.pop_back_val();
913       Inst = Pair.first;
914       Arg = Pair.second;
915 
916       const PHINode *PN = dyn_cast<PHINode>(Arg);
917       if (!PN) continue;
918 
919       // Determine if the PHI has any null operands, or any incoming
920       // critical edges.
921       bool HasNull = false;
922       bool HasCriticalEdges = false;
923       for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
924         Value *Incoming =
925           GetRCIdentityRoot(PN->getIncomingValue(i));
926         if (IsNullOrUndef(Incoming))
927           HasNull = true;
928         else if (PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() !=
929                  1) {
930           HasCriticalEdges = true;
931           break;
932         }
933       }
934       // If we have null operands and no critical edges, optimize.
935       if (!HasCriticalEdges && HasNull) {
936         SmallPtrSet<Instruction *, 4> DependingInstructions;
937         SmallPtrSet<const BasicBlock *, 4> Visited;
938 
939         // Check that there is nothing that cares about the reference
940         // count between the call and the phi.
941         switch (Class) {
942         case ARCInstKind::Retain:
943         case ARCInstKind::RetainBlock:
944           // These can always be moved up.
945           break;
946         case ARCInstKind::Release:
947           // These can't be moved across things that care about the retain
948           // count.
949           FindDependencies(NeedsPositiveRetainCount, Arg,
950                            Inst->getParent(), Inst,
951                            DependingInstructions, Visited, PA);
952           break;
953         case ARCInstKind::Autorelease:
954           // These can't be moved across autorelease pool scope boundaries.
955           FindDependencies(AutoreleasePoolBoundary, Arg,
956                            Inst->getParent(), Inst,
957                            DependingInstructions, Visited, PA);
958           break;
959         case ARCInstKind::ClaimRV:
960         case ARCInstKind::RetainRV:
961         case ARCInstKind::AutoreleaseRV:
962           // Don't move these; the RV optimization depends on the autoreleaseRV
963           // being tail called, and the retainRV being immediately after a call
964           // (which might still happen if we get lucky with codegen layout, but
965           // it's not worth taking the chance).
966           continue;
967         default:
968           llvm_unreachable("Invalid dependence flavor");
969         }
970 
971         if (DependingInstructions.size() == 1 &&
972             *DependingInstructions.begin() == PN) {
973           Changed = true;
974           ++NumPartialNoops;
975           // Clone the call into each predecessor that has a non-null value.
976           CallInst *CInst = cast<CallInst>(Inst);
977           Type *ParamTy = CInst->getArgOperand(0)->getType();
978           for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
979             Value *Incoming =
980               GetRCIdentityRoot(PN->getIncomingValue(i));
981             if (!IsNullOrUndef(Incoming)) {
982               Value *Op = PN->getIncomingValue(i);
983               Instruction *InsertPos = &PN->getIncomingBlock(i)->back();
984               CallInst *Clone = cast<CallInst>(CloneCallInstForBB(
985                   *CInst, *InsertPos->getParent(), BlockColors));
986               if (Op->getType() != ParamTy)
987                 Op = new BitCastInst(Op, ParamTy, "", InsertPos);
988               Clone->setArgOperand(0, Op);
989               Clone->insertBefore(InsertPos);
990 
991               LLVM_DEBUG(dbgs() << "Cloning " << *CInst
992                                 << "\n"
993                                    "And inserting clone at "
994                                 << *InsertPos << "\n");
995               Worklist.push_back(std::make_pair(Clone, Incoming));
996             }
997           }
998           // Erase the original call.
999           LLVM_DEBUG(dbgs() << "Erasing: " << *CInst << "\n");
1000           EraseInstruction(CInst);
1001           continue;
1002         }
1003       }
1004     } while (!Worklist.empty());
1005   }
1006 }
1007 
1008 /// If we have a top down pointer in the S_Use state, make sure that there are
1009 /// no CFG hazards by checking the states of various bottom up pointers.
CheckForUseCFGHazard(const Sequence SuccSSeq,const bool SuccSRRIKnownSafe,TopDownPtrState & S,bool & SomeSuccHasSame,bool & AllSuccsHaveSame,bool & NotAllSeqEqualButKnownSafe,bool & ShouldContinue)1010 static void CheckForUseCFGHazard(const Sequence SuccSSeq,
1011                                  const bool SuccSRRIKnownSafe,
1012                                  TopDownPtrState &S,
1013                                  bool &SomeSuccHasSame,
1014                                  bool &AllSuccsHaveSame,
1015                                  bool &NotAllSeqEqualButKnownSafe,
1016                                  bool &ShouldContinue) {
1017   switch (SuccSSeq) {
1018   case S_CanRelease: {
1019     if (!S.IsKnownSafe() && !SuccSRRIKnownSafe) {
1020       S.ClearSequenceProgress();
1021       break;
1022     }
1023     S.SetCFGHazardAfflicted(true);
1024     ShouldContinue = true;
1025     break;
1026   }
1027   case S_Use:
1028     SomeSuccHasSame = true;
1029     break;
1030   case S_Stop:
1031   case S_Release:
1032   case S_MovableRelease:
1033     if (!S.IsKnownSafe() && !SuccSRRIKnownSafe)
1034       AllSuccsHaveSame = false;
1035     else
1036       NotAllSeqEqualButKnownSafe = true;
1037     break;
1038   case S_Retain:
1039     llvm_unreachable("bottom-up pointer in retain state!");
1040   case S_None:
1041     llvm_unreachable("This should have been handled earlier.");
1042   }
1043 }
1044 
1045 /// If we have a Top Down pointer in the S_CanRelease state, make sure that
1046 /// there are no CFG hazards by checking the states of various bottom up
1047 /// pointers.
CheckForCanReleaseCFGHazard(const Sequence SuccSSeq,const bool SuccSRRIKnownSafe,TopDownPtrState & S,bool & SomeSuccHasSame,bool & AllSuccsHaveSame,bool & NotAllSeqEqualButKnownSafe)1048 static void CheckForCanReleaseCFGHazard(const Sequence SuccSSeq,
1049                                         const bool SuccSRRIKnownSafe,
1050                                         TopDownPtrState &S,
1051                                         bool &SomeSuccHasSame,
1052                                         bool &AllSuccsHaveSame,
1053                                         bool &NotAllSeqEqualButKnownSafe) {
1054   switch (SuccSSeq) {
1055   case S_CanRelease:
1056     SomeSuccHasSame = true;
1057     break;
1058   case S_Stop:
1059   case S_Release:
1060   case S_MovableRelease:
1061   case S_Use:
1062     if (!S.IsKnownSafe() && !SuccSRRIKnownSafe)
1063       AllSuccsHaveSame = false;
1064     else
1065       NotAllSeqEqualButKnownSafe = true;
1066     break;
1067   case S_Retain:
1068     llvm_unreachable("bottom-up pointer in retain state!");
1069   case S_None:
1070     llvm_unreachable("This should have been handled earlier.");
1071   }
1072 }
1073 
1074 /// Check for critical edges, loop boundaries, irreducible control flow, or
1075 /// other CFG structures where moving code across the edge would result in it
1076 /// being executed more.
1077 void
CheckForCFGHazards(const BasicBlock * BB,DenseMap<const BasicBlock *,BBState> & BBStates,BBState & MyStates) const1078 ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB,
1079                                DenseMap<const BasicBlock *, BBState> &BBStates,
1080                                BBState &MyStates) const {
1081   // If any top-down local-use or possible-dec has a succ which is earlier in
1082   // the sequence, forget it.
1083   for (auto I = MyStates.top_down_ptr_begin(), E = MyStates.top_down_ptr_end();
1084        I != E; ++I) {
1085     TopDownPtrState &S = I->second;
1086     const Sequence Seq = I->second.GetSeq();
1087 
1088     // We only care about S_Retain, S_CanRelease, and S_Use.
1089     if (Seq == S_None)
1090       continue;
1091 
1092     // Make sure that if extra top down states are added in the future that this
1093     // code is updated to handle it.
1094     assert((Seq == S_Retain || Seq == S_CanRelease || Seq == S_Use) &&
1095            "Unknown top down sequence state.");
1096 
1097     const Value *Arg = I->first;
1098     bool SomeSuccHasSame = false;
1099     bool AllSuccsHaveSame = true;
1100     bool NotAllSeqEqualButKnownSafe = false;
1101 
1102     for (const BasicBlock *Succ : successors(BB)) {
1103       // If VisitBottomUp has pointer information for this successor, take
1104       // what we know about it.
1105       const DenseMap<const BasicBlock *, BBState>::iterator BBI =
1106           BBStates.find(Succ);
1107       assert(BBI != BBStates.end());
1108       const BottomUpPtrState &SuccS = BBI->second.getPtrBottomUpState(Arg);
1109       const Sequence SuccSSeq = SuccS.GetSeq();
1110 
1111       // If bottom up, the pointer is in an S_None state, clear the sequence
1112       // progress since the sequence in the bottom up state finished
1113       // suggesting a mismatch in between retains/releases. This is true for
1114       // all three cases that we are handling here: S_Retain, S_Use, and
1115       // S_CanRelease.
1116       if (SuccSSeq == S_None) {
1117         S.ClearSequenceProgress();
1118         continue;
1119       }
1120 
1121       // If we have S_Use or S_CanRelease, perform our check for cfg hazard
1122       // checks.
1123       const bool SuccSRRIKnownSafe = SuccS.IsKnownSafe();
1124 
1125       // *NOTE* We do not use Seq from above here since we are allowing for
1126       // S.GetSeq() to change while we are visiting basic blocks.
1127       switch(S.GetSeq()) {
1128       case S_Use: {
1129         bool ShouldContinue = false;
1130         CheckForUseCFGHazard(SuccSSeq, SuccSRRIKnownSafe, S, SomeSuccHasSame,
1131                              AllSuccsHaveSame, NotAllSeqEqualButKnownSafe,
1132                              ShouldContinue);
1133         if (ShouldContinue)
1134           continue;
1135         break;
1136       }
1137       case S_CanRelease:
1138         CheckForCanReleaseCFGHazard(SuccSSeq, SuccSRRIKnownSafe, S,
1139                                     SomeSuccHasSame, AllSuccsHaveSame,
1140                                     NotAllSeqEqualButKnownSafe);
1141         break;
1142       case S_Retain:
1143       case S_None:
1144       case S_Stop:
1145       case S_Release:
1146       case S_MovableRelease:
1147         break;
1148       }
1149     }
1150 
1151     // If the state at the other end of any of the successor edges
1152     // matches the current state, require all edges to match. This
1153     // guards against loops in the middle of a sequence.
1154     if (SomeSuccHasSame && !AllSuccsHaveSame) {
1155       S.ClearSequenceProgress();
1156     } else if (NotAllSeqEqualButKnownSafe) {
1157       // If we would have cleared the state foregoing the fact that we are known
1158       // safe, stop code motion. This is because whether or not it is safe to
1159       // remove RR pairs via KnownSafe is an orthogonal concept to whether we
1160       // are allowed to perform code motion.
1161       S.SetCFGHazardAfflicted(true);
1162     }
1163   }
1164 }
1165 
VisitInstructionBottomUp(Instruction * Inst,BasicBlock * BB,BlotMapVector<Value *,RRInfo> & Retains,BBState & MyStates)1166 bool ObjCARCOpt::VisitInstructionBottomUp(
1167     Instruction *Inst, BasicBlock *BB, BlotMapVector<Value *, RRInfo> &Retains,
1168     BBState &MyStates) {
1169   bool NestingDetected = false;
1170   ARCInstKind Class = GetARCInstKind(Inst);
1171   const Value *Arg = nullptr;
1172 
1173   LLVM_DEBUG(dbgs() << "        Class: " << Class << "\n");
1174 
1175   switch (Class) {
1176   case ARCInstKind::Release: {
1177     Arg = GetArgRCIdentityRoot(Inst);
1178 
1179     BottomUpPtrState &S = MyStates.getPtrBottomUpState(Arg);
1180     NestingDetected |= S.InitBottomUp(MDKindCache, Inst);
1181     break;
1182   }
1183   case ARCInstKind::RetainBlock:
1184     // In OptimizeIndividualCalls, we have strength reduced all optimizable
1185     // objc_retainBlocks to objc_retains. Thus at this point any
1186     // objc_retainBlocks that we see are not optimizable.
1187     break;
1188   case ARCInstKind::Retain:
1189   case ARCInstKind::RetainRV: {
1190     Arg = GetArgRCIdentityRoot(Inst);
1191     BottomUpPtrState &S = MyStates.getPtrBottomUpState(Arg);
1192     if (S.MatchWithRetain()) {
1193       // Don't do retain+release tracking for ARCInstKind::RetainRV, because
1194       // it's better to let it remain as the first instruction after a call.
1195       if (Class != ARCInstKind::RetainRV) {
1196         LLVM_DEBUG(dbgs() << "        Matching with: " << *Inst << "\n");
1197         Retains[Inst] = S.GetRRInfo();
1198       }
1199       S.ClearSequenceProgress();
1200     }
1201     // A retain moving bottom up can be a use.
1202     break;
1203   }
1204   case ARCInstKind::AutoreleasepoolPop:
1205     // Conservatively, clear MyStates for all known pointers.
1206     MyStates.clearBottomUpPointers();
1207     return NestingDetected;
1208   case ARCInstKind::AutoreleasepoolPush:
1209   case ARCInstKind::None:
1210     // These are irrelevant.
1211     return NestingDetected;
1212   default:
1213     break;
1214   }
1215 
1216   // Consider any other possible effects of this instruction on each
1217   // pointer being tracked.
1218   for (auto MI = MyStates.bottom_up_ptr_begin(),
1219             ME = MyStates.bottom_up_ptr_end();
1220        MI != ME; ++MI) {
1221     const Value *Ptr = MI->first;
1222     if (Ptr == Arg)
1223       continue; // Handled above.
1224     BottomUpPtrState &S = MI->second;
1225 
1226     if (S.HandlePotentialAlterRefCount(Inst, Ptr, PA, Class))
1227       continue;
1228 
1229     S.HandlePotentialUse(BB, Inst, Ptr, PA, Class);
1230   }
1231 
1232   return NestingDetected;
1233 }
1234 
VisitBottomUp(BasicBlock * BB,DenseMap<const BasicBlock *,BBState> & BBStates,BlotMapVector<Value *,RRInfo> & Retains)1235 bool ObjCARCOpt::VisitBottomUp(BasicBlock *BB,
1236                                DenseMap<const BasicBlock *, BBState> &BBStates,
1237                                BlotMapVector<Value *, RRInfo> &Retains) {
1238   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::VisitBottomUp ==\n");
1239 
1240   bool NestingDetected = false;
1241   BBState &MyStates = BBStates[BB];
1242 
1243   // Merge the states from each successor to compute the initial state
1244   // for the current block.
1245   BBState::edge_iterator SI(MyStates.succ_begin()),
1246                          SE(MyStates.succ_end());
1247   if (SI != SE) {
1248     const BasicBlock *Succ = *SI;
1249     DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Succ);
1250     assert(I != BBStates.end());
1251     MyStates.InitFromSucc(I->second);
1252     ++SI;
1253     for (; SI != SE; ++SI) {
1254       Succ = *SI;
1255       I = BBStates.find(Succ);
1256       assert(I != BBStates.end());
1257       MyStates.MergeSucc(I->second);
1258     }
1259   }
1260 
1261   LLVM_DEBUG(dbgs() << "Before:\n"
1262                     << BBStates[BB] << "\n"
1263                     << "Performing Dataflow:\n");
1264 
1265   // Visit all the instructions, bottom-up.
1266   for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; --I) {
1267     Instruction *Inst = &*std::prev(I);
1268 
1269     // Invoke instructions are visited as part of their successors (below).
1270     if (isa<InvokeInst>(Inst))
1271       continue;
1272 
1273     LLVM_DEBUG(dbgs() << "    Visiting " << *Inst << "\n");
1274 
1275     NestingDetected |= VisitInstructionBottomUp(Inst, BB, Retains, MyStates);
1276   }
1277 
1278   // If there's a predecessor with an invoke, visit the invoke as if it were
1279   // part of this block, since we can't insert code after an invoke in its own
1280   // block, and we don't want to split critical edges.
1281   for (BBState::edge_iterator PI(MyStates.pred_begin()),
1282        PE(MyStates.pred_end()); PI != PE; ++PI) {
1283     BasicBlock *Pred = *PI;
1284     if (InvokeInst *II = dyn_cast<InvokeInst>(&Pred->back()))
1285       NestingDetected |= VisitInstructionBottomUp(II, BB, Retains, MyStates);
1286   }
1287 
1288   LLVM_DEBUG(dbgs() << "\nFinal State:\n" << BBStates[BB] << "\n");
1289 
1290   return NestingDetected;
1291 }
1292 
1293 bool
VisitInstructionTopDown(Instruction * Inst,DenseMap<Value *,RRInfo> & Releases,BBState & MyStates)1294 ObjCARCOpt::VisitInstructionTopDown(Instruction *Inst,
1295                                     DenseMap<Value *, RRInfo> &Releases,
1296                                     BBState &MyStates) {
1297   bool NestingDetected = false;
1298   ARCInstKind Class = GetARCInstKind(Inst);
1299   const Value *Arg = nullptr;
1300 
1301   LLVM_DEBUG(dbgs() << "        Class: " << Class << "\n");
1302 
1303   switch (Class) {
1304   case ARCInstKind::RetainBlock:
1305     // In OptimizeIndividualCalls, we have strength reduced all optimizable
1306     // objc_retainBlocks to objc_retains. Thus at this point any
1307     // objc_retainBlocks that we see are not optimizable. We need to break since
1308     // a retain can be a potential use.
1309     break;
1310   case ARCInstKind::Retain:
1311   case ARCInstKind::RetainRV: {
1312     Arg = GetArgRCIdentityRoot(Inst);
1313     TopDownPtrState &S = MyStates.getPtrTopDownState(Arg);
1314     NestingDetected |= S.InitTopDown(Class, Inst);
1315     // A retain can be a potential use; proceed to the generic checking
1316     // code below.
1317     break;
1318   }
1319   case ARCInstKind::Release: {
1320     Arg = GetArgRCIdentityRoot(Inst);
1321     TopDownPtrState &S = MyStates.getPtrTopDownState(Arg);
1322     // Try to form a tentative pair in between this release instruction and the
1323     // top down pointers that we are tracking.
1324     if (S.MatchWithRelease(MDKindCache, Inst)) {
1325       // If we succeed, copy S's RRInfo into the Release -> {Retain Set
1326       // Map}. Then we clear S.
1327       LLVM_DEBUG(dbgs() << "        Matching with: " << *Inst << "\n");
1328       Releases[Inst] = S.GetRRInfo();
1329       S.ClearSequenceProgress();
1330     }
1331     break;
1332   }
1333   case ARCInstKind::AutoreleasepoolPop:
1334     // Conservatively, clear MyStates for all known pointers.
1335     MyStates.clearTopDownPointers();
1336     return false;
1337   case ARCInstKind::AutoreleasepoolPush:
1338   case ARCInstKind::None:
1339     // These can not be uses of
1340     return false;
1341   default:
1342     break;
1343   }
1344 
1345   // Consider any other possible effects of this instruction on each
1346   // pointer being tracked.
1347   for (auto MI = MyStates.top_down_ptr_begin(),
1348             ME = MyStates.top_down_ptr_end();
1349        MI != ME; ++MI) {
1350     const Value *Ptr = MI->first;
1351     if (Ptr == Arg)
1352       continue; // Handled above.
1353     TopDownPtrState &S = MI->second;
1354     if (S.HandlePotentialAlterRefCount(Inst, Ptr, PA, Class))
1355       continue;
1356 
1357     S.HandlePotentialUse(Inst, Ptr, PA, Class);
1358   }
1359 
1360   return NestingDetected;
1361 }
1362 
1363 bool
VisitTopDown(BasicBlock * BB,DenseMap<const BasicBlock *,BBState> & BBStates,DenseMap<Value *,RRInfo> & Releases)1364 ObjCARCOpt::VisitTopDown(BasicBlock *BB,
1365                          DenseMap<const BasicBlock *, BBState> &BBStates,
1366                          DenseMap<Value *, RRInfo> &Releases) {
1367   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::VisitTopDown ==\n");
1368   bool NestingDetected = false;
1369   BBState &MyStates = BBStates[BB];
1370 
1371   // Merge the states from each predecessor to compute the initial state
1372   // for the current block.
1373   BBState::edge_iterator PI(MyStates.pred_begin()),
1374                          PE(MyStates.pred_end());
1375   if (PI != PE) {
1376     const BasicBlock *Pred = *PI;
1377     DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Pred);
1378     assert(I != BBStates.end());
1379     MyStates.InitFromPred(I->second);
1380     ++PI;
1381     for (; PI != PE; ++PI) {
1382       Pred = *PI;
1383       I = BBStates.find(Pred);
1384       assert(I != BBStates.end());
1385       MyStates.MergePred(I->second);
1386     }
1387   }
1388 
1389   LLVM_DEBUG(dbgs() << "Before:\n"
1390                     << BBStates[BB] << "\n"
1391                     << "Performing Dataflow:\n");
1392 
1393   // Visit all the instructions, top-down.
1394   for (Instruction &Inst : *BB) {
1395     LLVM_DEBUG(dbgs() << "    Visiting " << Inst << "\n");
1396 
1397     NestingDetected |= VisitInstructionTopDown(&Inst, Releases, MyStates);
1398   }
1399 
1400   LLVM_DEBUG(dbgs() << "\nState Before Checking for CFG Hazards:\n"
1401                     << BBStates[BB] << "\n\n");
1402   CheckForCFGHazards(BB, BBStates, MyStates);
1403   LLVM_DEBUG(dbgs() << "Final State:\n" << BBStates[BB] << "\n");
1404   return NestingDetected;
1405 }
1406 
1407 static void
ComputePostOrders(Function & F,SmallVectorImpl<BasicBlock * > & PostOrder,SmallVectorImpl<BasicBlock * > & ReverseCFGPostOrder,unsigned NoObjCARCExceptionsMDKind,DenseMap<const BasicBlock *,BBState> & BBStates)1408 ComputePostOrders(Function &F,
1409                   SmallVectorImpl<BasicBlock *> &PostOrder,
1410                   SmallVectorImpl<BasicBlock *> &ReverseCFGPostOrder,
1411                   unsigned NoObjCARCExceptionsMDKind,
1412                   DenseMap<const BasicBlock *, BBState> &BBStates) {
1413   /// The visited set, for doing DFS walks.
1414   SmallPtrSet<BasicBlock *, 16> Visited;
1415 
1416   // Do DFS, computing the PostOrder.
1417   SmallPtrSet<BasicBlock *, 16> OnStack;
1418   SmallVector<std::pair<BasicBlock *, succ_iterator>, 16> SuccStack;
1419 
1420   // Functions always have exactly one entry block, and we don't have
1421   // any other block that we treat like an entry block.
1422   BasicBlock *EntryBB = &F.getEntryBlock();
1423   BBState &MyStates = BBStates[EntryBB];
1424   MyStates.SetAsEntry();
1425   Instruction *EntryTI = EntryBB->getTerminator();
1426   SuccStack.push_back(std::make_pair(EntryBB, succ_iterator(EntryTI)));
1427   Visited.insert(EntryBB);
1428   OnStack.insert(EntryBB);
1429   do {
1430   dfs_next_succ:
1431     BasicBlock *CurrBB = SuccStack.back().first;
1432     succ_iterator SE(CurrBB->getTerminator(), false);
1433 
1434     while (SuccStack.back().second != SE) {
1435       BasicBlock *SuccBB = *SuccStack.back().second++;
1436       if (Visited.insert(SuccBB).second) {
1437         SuccStack.push_back(
1438             std::make_pair(SuccBB, succ_iterator(SuccBB->getTerminator())));
1439         BBStates[CurrBB].addSucc(SuccBB);
1440         BBState &SuccStates = BBStates[SuccBB];
1441         SuccStates.addPred(CurrBB);
1442         OnStack.insert(SuccBB);
1443         goto dfs_next_succ;
1444       }
1445 
1446       if (!OnStack.count(SuccBB)) {
1447         BBStates[CurrBB].addSucc(SuccBB);
1448         BBStates[SuccBB].addPred(CurrBB);
1449       }
1450     }
1451     OnStack.erase(CurrBB);
1452     PostOrder.push_back(CurrBB);
1453     SuccStack.pop_back();
1454   } while (!SuccStack.empty());
1455 
1456   Visited.clear();
1457 
1458   // Do reverse-CFG DFS, computing the reverse-CFG PostOrder.
1459   // Functions may have many exits, and there also blocks which we treat
1460   // as exits due to ignored edges.
1461   SmallVector<std::pair<BasicBlock *, BBState::edge_iterator>, 16> PredStack;
1462   for (BasicBlock &ExitBB : F) {
1463     BBState &MyStates = BBStates[&ExitBB];
1464     if (!MyStates.isExit())
1465       continue;
1466 
1467     MyStates.SetAsExit();
1468 
1469     PredStack.push_back(std::make_pair(&ExitBB, MyStates.pred_begin()));
1470     Visited.insert(&ExitBB);
1471     while (!PredStack.empty()) {
1472     reverse_dfs_next_succ:
1473       BBState::edge_iterator PE = BBStates[PredStack.back().first].pred_end();
1474       while (PredStack.back().second != PE) {
1475         BasicBlock *BB = *PredStack.back().second++;
1476         if (Visited.insert(BB).second) {
1477           PredStack.push_back(std::make_pair(BB, BBStates[BB].pred_begin()));
1478           goto reverse_dfs_next_succ;
1479         }
1480       }
1481       ReverseCFGPostOrder.push_back(PredStack.pop_back_val().first);
1482     }
1483   }
1484 }
1485 
1486 // Visit the function both top-down and bottom-up.
Visit(Function & F,DenseMap<const BasicBlock *,BBState> & BBStates,BlotMapVector<Value *,RRInfo> & Retains,DenseMap<Value *,RRInfo> & Releases)1487 bool ObjCARCOpt::Visit(Function &F,
1488                        DenseMap<const BasicBlock *, BBState> &BBStates,
1489                        BlotMapVector<Value *, RRInfo> &Retains,
1490                        DenseMap<Value *, RRInfo> &Releases) {
1491   // Use reverse-postorder traversals, because we magically know that loops
1492   // will be well behaved, i.e. they won't repeatedly call retain on a single
1493   // pointer without doing a release. We can't use the ReversePostOrderTraversal
1494   // class here because we want the reverse-CFG postorder to consider each
1495   // function exit point, and we want to ignore selected cycle edges.
1496   SmallVector<BasicBlock *, 16> PostOrder;
1497   SmallVector<BasicBlock *, 16> ReverseCFGPostOrder;
1498   ComputePostOrders(F, PostOrder, ReverseCFGPostOrder,
1499                     MDKindCache.get(ARCMDKindID::NoObjCARCExceptions),
1500                     BBStates);
1501 
1502   // Use reverse-postorder on the reverse CFG for bottom-up.
1503   bool BottomUpNestingDetected = false;
1504   for (BasicBlock *BB : llvm::reverse(ReverseCFGPostOrder))
1505     BottomUpNestingDetected |= VisitBottomUp(BB, BBStates, Retains);
1506 
1507   // Use reverse-postorder for top-down.
1508   bool TopDownNestingDetected = false;
1509   for (BasicBlock *BB : llvm::reverse(PostOrder))
1510     TopDownNestingDetected |= VisitTopDown(BB, BBStates, Releases);
1511 
1512   return TopDownNestingDetected && BottomUpNestingDetected;
1513 }
1514 
1515 /// Move the calls in RetainsToMove and ReleasesToMove.
MoveCalls(Value * Arg,RRInfo & RetainsToMove,RRInfo & ReleasesToMove,BlotMapVector<Value *,RRInfo> & Retains,DenseMap<Value *,RRInfo> & Releases,SmallVectorImpl<Instruction * > & DeadInsts,Module * M)1516 void ObjCARCOpt::MoveCalls(Value *Arg, RRInfo &RetainsToMove,
1517                            RRInfo &ReleasesToMove,
1518                            BlotMapVector<Value *, RRInfo> &Retains,
1519                            DenseMap<Value *, RRInfo> &Releases,
1520                            SmallVectorImpl<Instruction *> &DeadInsts,
1521                            Module *M) {
1522   Type *ArgTy = Arg->getType();
1523   Type *ParamTy = PointerType::getUnqual(Type::getInt8Ty(ArgTy->getContext()));
1524 
1525   LLVM_DEBUG(dbgs() << "== ObjCARCOpt::MoveCalls ==\n");
1526 
1527   // Insert the new retain and release calls.
1528   for (Instruction *InsertPt : ReleasesToMove.ReverseInsertPts) {
1529     Value *MyArg = ArgTy == ParamTy ? Arg :
1530                    new BitCastInst(Arg, ParamTy, "", InsertPt);
1531     Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Retain);
1532     CallInst *Call = CallInst::Create(Decl, MyArg, "", InsertPt);
1533     Call->setDoesNotThrow();
1534     Call->setTailCall();
1535 
1536     LLVM_DEBUG(dbgs() << "Inserting new Retain: " << *Call
1537                       << "\n"
1538                          "At insertion point: "
1539                       << *InsertPt << "\n");
1540   }
1541   for (Instruction *InsertPt : RetainsToMove.ReverseInsertPts) {
1542     Value *MyArg = ArgTy == ParamTy ? Arg :
1543                    new BitCastInst(Arg, ParamTy, "", InsertPt);
1544     Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Release);
1545     CallInst *Call = CallInst::Create(Decl, MyArg, "", InsertPt);
1546     // Attach a clang.imprecise_release metadata tag, if appropriate.
1547     if (MDNode *M = ReleasesToMove.ReleaseMetadata)
1548       Call->setMetadata(MDKindCache.get(ARCMDKindID::ImpreciseRelease), M);
1549     Call->setDoesNotThrow();
1550     if (ReleasesToMove.IsTailCallRelease)
1551       Call->setTailCall();
1552 
1553     LLVM_DEBUG(dbgs() << "Inserting new Release: " << *Call
1554                       << "\n"
1555                          "At insertion point: "
1556                       << *InsertPt << "\n");
1557   }
1558 
1559   // Delete the original retain and release calls.
1560   for (Instruction *OrigRetain : RetainsToMove.Calls) {
1561     Retains.blot(OrigRetain);
1562     DeadInsts.push_back(OrigRetain);
1563     LLVM_DEBUG(dbgs() << "Deleting retain: " << *OrigRetain << "\n");
1564   }
1565   for (Instruction *OrigRelease : ReleasesToMove.Calls) {
1566     Releases.erase(OrigRelease);
1567     DeadInsts.push_back(OrigRelease);
1568     LLVM_DEBUG(dbgs() << "Deleting release: " << *OrigRelease << "\n");
1569   }
1570 }
1571 
PairUpRetainsAndReleases(DenseMap<const BasicBlock *,BBState> & BBStates,BlotMapVector<Value *,RRInfo> & Retains,DenseMap<Value *,RRInfo> & Releases,Module * M,Instruction * Retain,SmallVectorImpl<Instruction * > & DeadInsts,RRInfo & RetainsToMove,RRInfo & ReleasesToMove,Value * Arg,bool KnownSafe,bool & AnyPairsCompletelyEliminated)1572 bool ObjCARCOpt::PairUpRetainsAndReleases(
1573     DenseMap<const BasicBlock *, BBState> &BBStates,
1574     BlotMapVector<Value *, RRInfo> &Retains,
1575     DenseMap<Value *, RRInfo> &Releases, Module *M,
1576     Instruction *Retain,
1577     SmallVectorImpl<Instruction *> &DeadInsts, RRInfo &RetainsToMove,
1578     RRInfo &ReleasesToMove, Value *Arg, bool KnownSafe,
1579     bool &AnyPairsCompletelyEliminated) {
1580   // If a pair happens in a region where it is known that the reference count
1581   // is already incremented, we can similarly ignore possible decrements unless
1582   // we are dealing with a retainable object with multiple provenance sources.
1583   bool KnownSafeTD = true, KnownSafeBU = true;
1584   bool CFGHazardAfflicted = false;
1585 
1586   // Connect the dots between the top-down-collected RetainsToMove and
1587   // bottom-up-collected ReleasesToMove to form sets of related calls.
1588   // This is an iterative process so that we connect multiple releases
1589   // to multiple retains if needed.
1590   unsigned OldDelta = 0;
1591   unsigned NewDelta = 0;
1592   unsigned OldCount = 0;
1593   unsigned NewCount = 0;
1594   bool FirstRelease = true;
1595   for (SmallVector<Instruction *, 4> NewRetains{Retain};;) {
1596     SmallVector<Instruction *, 4> NewReleases;
1597     for (Instruction *NewRetain : NewRetains) {
1598       auto It = Retains.find(NewRetain);
1599       assert(It != Retains.end());
1600       const RRInfo &NewRetainRRI = It->second;
1601       KnownSafeTD &= NewRetainRRI.KnownSafe;
1602       CFGHazardAfflicted |= NewRetainRRI.CFGHazardAfflicted;
1603       for (Instruction *NewRetainRelease : NewRetainRRI.Calls) {
1604         auto Jt = Releases.find(NewRetainRelease);
1605         if (Jt == Releases.end())
1606           return false;
1607         const RRInfo &NewRetainReleaseRRI = Jt->second;
1608 
1609         // If the release does not have a reference to the retain as well,
1610         // something happened which is unaccounted for. Do not do anything.
1611         //
1612         // This can happen if we catch an additive overflow during path count
1613         // merging.
1614         if (!NewRetainReleaseRRI.Calls.count(NewRetain))
1615           return false;
1616 
1617         if (ReleasesToMove.Calls.insert(NewRetainRelease).second) {
1618           // If we overflow when we compute the path count, don't remove/move
1619           // anything.
1620           const BBState &NRRBBState = BBStates[NewRetainRelease->getParent()];
1621           unsigned PathCount = BBState::OverflowOccurredValue;
1622           if (NRRBBState.GetAllPathCountWithOverflow(PathCount))
1623             return false;
1624           assert(PathCount != BBState::OverflowOccurredValue &&
1625                  "PathCount at this point can not be "
1626                  "OverflowOccurredValue.");
1627           OldDelta -= PathCount;
1628 
1629           // Merge the ReleaseMetadata and IsTailCallRelease values.
1630           if (FirstRelease) {
1631             ReleasesToMove.ReleaseMetadata =
1632               NewRetainReleaseRRI.ReleaseMetadata;
1633             ReleasesToMove.IsTailCallRelease =
1634               NewRetainReleaseRRI.IsTailCallRelease;
1635             FirstRelease = false;
1636           } else {
1637             if (ReleasesToMove.ReleaseMetadata !=
1638                 NewRetainReleaseRRI.ReleaseMetadata)
1639               ReleasesToMove.ReleaseMetadata = nullptr;
1640             if (ReleasesToMove.IsTailCallRelease !=
1641                 NewRetainReleaseRRI.IsTailCallRelease)
1642               ReleasesToMove.IsTailCallRelease = false;
1643           }
1644 
1645           // Collect the optimal insertion points.
1646           if (!KnownSafe)
1647             for (Instruction *RIP : NewRetainReleaseRRI.ReverseInsertPts) {
1648               if (ReleasesToMove.ReverseInsertPts.insert(RIP).second) {
1649                 // If we overflow when we compute the path count, don't
1650                 // remove/move anything.
1651                 const BBState &RIPBBState = BBStates[RIP->getParent()];
1652                 PathCount = BBState::OverflowOccurredValue;
1653                 if (RIPBBState.GetAllPathCountWithOverflow(PathCount))
1654                   return false;
1655                 assert(PathCount != BBState::OverflowOccurredValue &&
1656                        "PathCount at this point can not be "
1657                        "OverflowOccurredValue.");
1658                 NewDelta -= PathCount;
1659               }
1660             }
1661           NewReleases.push_back(NewRetainRelease);
1662         }
1663       }
1664     }
1665     NewRetains.clear();
1666     if (NewReleases.empty()) break;
1667 
1668     // Back the other way.
1669     for (Instruction *NewRelease : NewReleases) {
1670       auto It = Releases.find(NewRelease);
1671       assert(It != Releases.end());
1672       const RRInfo &NewReleaseRRI = It->second;
1673       KnownSafeBU &= NewReleaseRRI.KnownSafe;
1674       CFGHazardAfflicted |= NewReleaseRRI.CFGHazardAfflicted;
1675       for (Instruction *NewReleaseRetain : NewReleaseRRI.Calls) {
1676         auto Jt = Retains.find(NewReleaseRetain);
1677         if (Jt == Retains.end())
1678           return false;
1679         const RRInfo &NewReleaseRetainRRI = Jt->second;
1680 
1681         // If the retain does not have a reference to the release as well,
1682         // something happened which is unaccounted for. Do not do anything.
1683         //
1684         // This can happen if we catch an additive overflow during path count
1685         // merging.
1686         if (!NewReleaseRetainRRI.Calls.count(NewRelease))
1687           return false;
1688 
1689         if (RetainsToMove.Calls.insert(NewReleaseRetain).second) {
1690           // If we overflow when we compute the path count, don't remove/move
1691           // anything.
1692           const BBState &NRRBBState = BBStates[NewReleaseRetain->getParent()];
1693           unsigned PathCount = BBState::OverflowOccurredValue;
1694           if (NRRBBState.GetAllPathCountWithOverflow(PathCount))
1695             return false;
1696           assert(PathCount != BBState::OverflowOccurredValue &&
1697                  "PathCount at this point can not be "
1698                  "OverflowOccurredValue.");
1699           OldDelta += PathCount;
1700           OldCount += PathCount;
1701 
1702           // Collect the optimal insertion points.
1703           if (!KnownSafe)
1704             for (Instruction *RIP : NewReleaseRetainRRI.ReverseInsertPts) {
1705               if (RetainsToMove.ReverseInsertPts.insert(RIP).second) {
1706                 // If we overflow when we compute the path count, don't
1707                 // remove/move anything.
1708                 const BBState &RIPBBState = BBStates[RIP->getParent()];
1709 
1710                 PathCount = BBState::OverflowOccurredValue;
1711                 if (RIPBBState.GetAllPathCountWithOverflow(PathCount))
1712                   return false;
1713                 assert(PathCount != BBState::OverflowOccurredValue &&
1714                        "PathCount at this point can not be "
1715                        "OverflowOccurredValue.");
1716                 NewDelta += PathCount;
1717                 NewCount += PathCount;
1718               }
1719             }
1720           NewRetains.push_back(NewReleaseRetain);
1721         }
1722       }
1723     }
1724     if (NewRetains.empty()) break;
1725   }
1726 
1727   // We can only remove pointers if we are known safe in both directions.
1728   bool UnconditionallySafe = KnownSafeTD && KnownSafeBU;
1729   if (UnconditionallySafe) {
1730     RetainsToMove.ReverseInsertPts.clear();
1731     ReleasesToMove.ReverseInsertPts.clear();
1732     NewCount = 0;
1733   } else {
1734     // Determine whether the new insertion points we computed preserve the
1735     // balance of retain and release calls through the program.
1736     // TODO: If the fully aggressive solution isn't valid, try to find a
1737     // less aggressive solution which is.
1738     if (NewDelta != 0)
1739       return false;
1740 
1741     // At this point, we are not going to remove any RR pairs, but we still are
1742     // able to move RR pairs. If one of our pointers is afflicted with
1743     // CFGHazards, we cannot perform such code motion so exit early.
1744     const bool WillPerformCodeMotion =
1745         !RetainsToMove.ReverseInsertPts.empty() ||
1746         !ReleasesToMove.ReverseInsertPts.empty();
1747     if (CFGHazardAfflicted && WillPerformCodeMotion)
1748       return false;
1749   }
1750 
1751   // Determine whether the original call points are balanced in the retain and
1752   // release calls through the program. If not, conservatively don't touch
1753   // them.
1754   // TODO: It's theoretically possible to do code motion in this case, as
1755   // long as the existing imbalances are maintained.
1756   if (OldDelta != 0)
1757     return false;
1758 
1759   Changed = true;
1760   assert(OldCount != 0 && "Unreachable code?");
1761   NumRRs += OldCount - NewCount;
1762   // Set to true if we completely removed any RR pairs.
1763   AnyPairsCompletelyEliminated = NewCount == 0;
1764 
1765   // We can move calls!
1766   return true;
1767 }
1768 
1769 /// Identify pairings between the retains and releases, and delete and/or move
1770 /// them.
PerformCodePlacement(DenseMap<const BasicBlock *,BBState> & BBStates,BlotMapVector<Value *,RRInfo> & Retains,DenseMap<Value *,RRInfo> & Releases,Module * M)1771 bool ObjCARCOpt::PerformCodePlacement(
1772     DenseMap<const BasicBlock *, BBState> &BBStates,
1773     BlotMapVector<Value *, RRInfo> &Retains,
1774     DenseMap<Value *, RRInfo> &Releases, Module *M) {
1775   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::PerformCodePlacement ==\n");
1776 
1777   bool AnyPairsCompletelyEliminated = false;
1778   SmallVector<Instruction *, 8> DeadInsts;
1779 
1780   // Visit each retain.
1781   for (BlotMapVector<Value *, RRInfo>::const_iterator I = Retains.begin(),
1782                                                       E = Retains.end();
1783        I != E; ++I) {
1784     Value *V = I->first;
1785     if (!V) continue; // blotted
1786 
1787     Instruction *Retain = cast<Instruction>(V);
1788 
1789     LLVM_DEBUG(dbgs() << "Visiting: " << *Retain << "\n");
1790 
1791     Value *Arg = GetArgRCIdentityRoot(Retain);
1792 
1793     // If the object being released is in static or stack storage, we know it's
1794     // not being managed by ObjC reference counting, so we can delete pairs
1795     // regardless of what possible decrements or uses lie between them.
1796     bool KnownSafe = isa<Constant>(Arg) || isa<AllocaInst>(Arg);
1797 
1798     // A constant pointer can't be pointing to an object on the heap. It may
1799     // be reference-counted, but it won't be deleted.
1800     if (const LoadInst *LI = dyn_cast<LoadInst>(Arg))
1801       if (const GlobalVariable *GV =
1802             dyn_cast<GlobalVariable>(
1803               GetRCIdentityRoot(LI->getPointerOperand())))
1804         if (GV->isConstant())
1805           KnownSafe = true;
1806 
1807     // Connect the dots between the top-down-collected RetainsToMove and
1808     // bottom-up-collected ReleasesToMove to form sets of related calls.
1809     RRInfo RetainsToMove, ReleasesToMove;
1810 
1811     bool PerformMoveCalls = PairUpRetainsAndReleases(
1812         BBStates, Retains, Releases, M, Retain, DeadInsts,
1813         RetainsToMove, ReleasesToMove, Arg, KnownSafe,
1814         AnyPairsCompletelyEliminated);
1815 
1816     if (PerformMoveCalls) {
1817       // Ok, everything checks out and we're all set. Let's move/delete some
1818       // code!
1819       MoveCalls(Arg, RetainsToMove, ReleasesToMove,
1820                 Retains, Releases, DeadInsts, M);
1821     }
1822   }
1823 
1824   // Now that we're done moving everything, we can delete the newly dead
1825   // instructions, as we no longer need them as insert points.
1826   while (!DeadInsts.empty())
1827     EraseInstruction(DeadInsts.pop_back_val());
1828 
1829   return AnyPairsCompletelyEliminated;
1830 }
1831 
1832 /// Weak pointer optimizations.
OptimizeWeakCalls(Function & F)1833 void ObjCARCOpt::OptimizeWeakCalls(Function &F) {
1834   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::OptimizeWeakCalls ==\n");
1835 
1836   // First, do memdep-style RLE and S2L optimizations. We can't use memdep
1837   // itself because it uses AliasAnalysis and we need to do provenance
1838   // queries instead.
1839   for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
1840     Instruction *Inst = &*I++;
1841 
1842     LLVM_DEBUG(dbgs() << "Visiting: " << *Inst << "\n");
1843 
1844     ARCInstKind Class = GetBasicARCInstKind(Inst);
1845     if (Class != ARCInstKind::LoadWeak &&
1846         Class != ARCInstKind::LoadWeakRetained)
1847       continue;
1848 
1849     // Delete objc_loadWeak calls with no users.
1850     if (Class == ARCInstKind::LoadWeak && Inst->use_empty()) {
1851       Inst->eraseFromParent();
1852       continue;
1853     }
1854 
1855     // TODO: For now, just look for an earlier available version of this value
1856     // within the same block. Theoretically, we could do memdep-style non-local
1857     // analysis too, but that would want caching. A better approach would be to
1858     // use the technique that EarlyCSE uses.
1859     inst_iterator Current = std::prev(I);
1860     BasicBlock *CurrentBB = &*Current.getBasicBlockIterator();
1861     for (BasicBlock::iterator B = CurrentBB->begin(),
1862                               J = Current.getInstructionIterator();
1863          J != B; --J) {
1864       Instruction *EarlierInst = &*std::prev(J);
1865       ARCInstKind EarlierClass = GetARCInstKind(EarlierInst);
1866       switch (EarlierClass) {
1867       case ARCInstKind::LoadWeak:
1868       case ARCInstKind::LoadWeakRetained: {
1869         // If this is loading from the same pointer, replace this load's value
1870         // with that one.
1871         CallInst *Call = cast<CallInst>(Inst);
1872         CallInst *EarlierCall = cast<CallInst>(EarlierInst);
1873         Value *Arg = Call->getArgOperand(0);
1874         Value *EarlierArg = EarlierCall->getArgOperand(0);
1875         switch (PA.getAA()->alias(Arg, EarlierArg)) {
1876         case MustAlias:
1877           Changed = true;
1878           // If the load has a builtin retain, insert a plain retain for it.
1879           if (Class == ARCInstKind::LoadWeakRetained) {
1880             Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Retain);
1881             CallInst *CI = CallInst::Create(Decl, EarlierCall, "", Call);
1882             CI->setTailCall();
1883           }
1884           // Zap the fully redundant load.
1885           Call->replaceAllUsesWith(EarlierCall);
1886           Call->eraseFromParent();
1887           goto clobbered;
1888         case MayAlias:
1889         case PartialAlias:
1890           goto clobbered;
1891         case NoAlias:
1892           break;
1893         }
1894         break;
1895       }
1896       case ARCInstKind::StoreWeak:
1897       case ARCInstKind::InitWeak: {
1898         // If this is storing to the same pointer and has the same size etc.
1899         // replace this load's value with the stored value.
1900         CallInst *Call = cast<CallInst>(Inst);
1901         CallInst *EarlierCall = cast<CallInst>(EarlierInst);
1902         Value *Arg = Call->getArgOperand(0);
1903         Value *EarlierArg = EarlierCall->getArgOperand(0);
1904         switch (PA.getAA()->alias(Arg, EarlierArg)) {
1905         case MustAlias:
1906           Changed = true;
1907           // If the load has a builtin retain, insert a plain retain for it.
1908           if (Class == ARCInstKind::LoadWeakRetained) {
1909             Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Retain);
1910             CallInst *CI = CallInst::Create(Decl, EarlierCall, "", Call);
1911             CI->setTailCall();
1912           }
1913           // Zap the fully redundant load.
1914           Call->replaceAllUsesWith(EarlierCall->getArgOperand(1));
1915           Call->eraseFromParent();
1916           goto clobbered;
1917         case MayAlias:
1918         case PartialAlias:
1919           goto clobbered;
1920         case NoAlias:
1921           break;
1922         }
1923         break;
1924       }
1925       case ARCInstKind::MoveWeak:
1926       case ARCInstKind::CopyWeak:
1927         // TOOD: Grab the copied value.
1928         goto clobbered;
1929       case ARCInstKind::AutoreleasepoolPush:
1930       case ARCInstKind::None:
1931       case ARCInstKind::IntrinsicUser:
1932       case ARCInstKind::User:
1933         // Weak pointers are only modified through the weak entry points
1934         // (and arbitrary calls, which could call the weak entry points).
1935         break;
1936       default:
1937         // Anything else could modify the weak pointer.
1938         goto clobbered;
1939       }
1940     }
1941   clobbered:;
1942   }
1943 
1944   // Then, for each destroyWeak with an alloca operand, check to see if
1945   // the alloca and all its users can be zapped.
1946   for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
1947     Instruction *Inst = &*I++;
1948     ARCInstKind Class = GetBasicARCInstKind(Inst);
1949     if (Class != ARCInstKind::DestroyWeak)
1950       continue;
1951 
1952     CallInst *Call = cast<CallInst>(Inst);
1953     Value *Arg = Call->getArgOperand(0);
1954     if (AllocaInst *Alloca = dyn_cast<AllocaInst>(Arg)) {
1955       for (User *U : Alloca->users()) {
1956         const Instruction *UserInst = cast<Instruction>(U);
1957         switch (GetBasicARCInstKind(UserInst)) {
1958         case ARCInstKind::InitWeak:
1959         case ARCInstKind::StoreWeak:
1960         case ARCInstKind::DestroyWeak:
1961           continue;
1962         default:
1963           goto done;
1964         }
1965       }
1966       Changed = true;
1967       for (auto UI = Alloca->user_begin(), UE = Alloca->user_end(); UI != UE;) {
1968         CallInst *UserInst = cast<CallInst>(*UI++);
1969         switch (GetBasicARCInstKind(UserInst)) {
1970         case ARCInstKind::InitWeak:
1971         case ARCInstKind::StoreWeak:
1972           // These functions return their second argument.
1973           UserInst->replaceAllUsesWith(UserInst->getArgOperand(1));
1974           break;
1975         case ARCInstKind::DestroyWeak:
1976           // No return value.
1977           break;
1978         default:
1979           llvm_unreachable("alloca really is used!");
1980         }
1981         UserInst->eraseFromParent();
1982       }
1983       Alloca->eraseFromParent();
1984     done:;
1985     }
1986   }
1987 }
1988 
1989 /// Identify program paths which execute sequences of retains and releases which
1990 /// can be eliminated.
OptimizeSequences(Function & F)1991 bool ObjCARCOpt::OptimizeSequences(Function &F) {
1992   // Releases, Retains - These are used to store the results of the main flow
1993   // analysis. These use Value* as the key instead of Instruction* so that the
1994   // map stays valid when we get around to rewriting code and calls get
1995   // replaced by arguments.
1996   DenseMap<Value *, RRInfo> Releases;
1997   BlotMapVector<Value *, RRInfo> Retains;
1998 
1999   // This is used during the traversal of the function to track the
2000   // states for each identified object at each block.
2001   DenseMap<const BasicBlock *, BBState> BBStates;
2002 
2003   // Analyze the CFG of the function, and all instructions.
2004   bool NestingDetected = Visit(F, BBStates, Retains, Releases);
2005 
2006   // Transform.
2007   bool AnyPairsCompletelyEliminated = PerformCodePlacement(BBStates, Retains,
2008                                                            Releases,
2009                                                            F.getParent());
2010 
2011   return AnyPairsCompletelyEliminated && NestingDetected;
2012 }
2013 
2014 /// Check if there is a dependent call earlier that does not have anything in
2015 /// between the Retain and the call that can affect the reference count of their
2016 /// shared pointer argument. Note that Retain need not be in BB.
2017 static bool
HasSafePathToPredecessorCall(const Value * Arg,Instruction * Retain,SmallPtrSetImpl<Instruction * > & DepInsts,SmallPtrSetImpl<const BasicBlock * > & Visited,ProvenanceAnalysis & PA)2018 HasSafePathToPredecessorCall(const Value *Arg, Instruction *Retain,
2019                              SmallPtrSetImpl<Instruction *> &DepInsts,
2020                              SmallPtrSetImpl<const BasicBlock *> &Visited,
2021                              ProvenanceAnalysis &PA) {
2022   FindDependencies(CanChangeRetainCount, Arg, Retain->getParent(), Retain,
2023                    DepInsts, Visited, PA);
2024   if (DepInsts.size() != 1)
2025     return false;
2026 
2027   auto *Call = dyn_cast_or_null<CallInst>(*DepInsts.begin());
2028 
2029   // Check that the pointer is the return value of the call.
2030   if (!Call || Arg != Call)
2031     return false;
2032 
2033   // Check that the call is a regular call.
2034   ARCInstKind Class = GetBasicARCInstKind(Call);
2035   return Class == ARCInstKind::CallOrUser || Class == ARCInstKind::Call;
2036 }
2037 
2038 /// Find a dependent retain that precedes the given autorelease for which there
2039 /// is nothing in between the two instructions that can affect the ref count of
2040 /// Arg.
2041 static CallInst *
FindPredecessorRetainWithSafePath(const Value * Arg,BasicBlock * BB,Instruction * Autorelease,SmallPtrSetImpl<Instruction * > & DepInsts,SmallPtrSetImpl<const BasicBlock * > & Visited,ProvenanceAnalysis & PA)2042 FindPredecessorRetainWithSafePath(const Value *Arg, BasicBlock *BB,
2043                                   Instruction *Autorelease,
2044                                   SmallPtrSetImpl<Instruction *> &DepInsts,
2045                                   SmallPtrSetImpl<const BasicBlock *> &Visited,
2046                                   ProvenanceAnalysis &PA) {
2047   FindDependencies(CanChangeRetainCount, Arg,
2048                    BB, Autorelease, DepInsts, Visited, PA);
2049   if (DepInsts.size() != 1)
2050     return nullptr;
2051 
2052   auto *Retain = dyn_cast_or_null<CallInst>(*DepInsts.begin());
2053 
2054   // Check that we found a retain with the same argument.
2055   if (!Retain || !IsRetain(GetBasicARCInstKind(Retain)) ||
2056       GetArgRCIdentityRoot(Retain) != Arg) {
2057     return nullptr;
2058   }
2059 
2060   return Retain;
2061 }
2062 
2063 /// Look for an ``autorelease'' instruction dependent on Arg such that there are
2064 /// no instructions dependent on Arg that need a positive ref count in between
2065 /// the autorelease and the ret.
2066 static CallInst *
FindPredecessorAutoreleaseWithSafePath(const Value * Arg,BasicBlock * BB,ReturnInst * Ret,SmallPtrSetImpl<Instruction * > & DepInsts,SmallPtrSetImpl<const BasicBlock * > & V,ProvenanceAnalysis & PA)2067 FindPredecessorAutoreleaseWithSafePath(const Value *Arg, BasicBlock *BB,
2068                                        ReturnInst *Ret,
2069                                        SmallPtrSetImpl<Instruction *> &DepInsts,
2070                                        SmallPtrSetImpl<const BasicBlock *> &V,
2071                                        ProvenanceAnalysis &PA) {
2072   FindDependencies(NeedsPositiveRetainCount, Arg,
2073                    BB, Ret, DepInsts, V, PA);
2074   if (DepInsts.size() != 1)
2075     return nullptr;
2076 
2077   auto *Autorelease = dyn_cast_or_null<CallInst>(*DepInsts.begin());
2078   if (!Autorelease)
2079     return nullptr;
2080   ARCInstKind AutoreleaseClass = GetBasicARCInstKind(Autorelease);
2081   if (!IsAutorelease(AutoreleaseClass))
2082     return nullptr;
2083   if (GetArgRCIdentityRoot(Autorelease) != Arg)
2084     return nullptr;
2085 
2086   return Autorelease;
2087 }
2088 
2089 /// Look for this pattern:
2090 /// \code
2091 ///    %call = call i8* @something(...)
2092 ///    %2 = call i8* @objc_retain(i8* %call)
2093 ///    %3 = call i8* @objc_autorelease(i8* %2)
2094 ///    ret i8* %3
2095 /// \endcode
2096 /// And delete the retain and autorelease.
OptimizeReturns(Function & F)2097 void ObjCARCOpt::OptimizeReturns(Function &F) {
2098   if (!F.getReturnType()->isPointerTy())
2099     return;
2100 
2101   LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::OptimizeReturns ==\n");
2102 
2103   SmallPtrSet<Instruction *, 4> DependingInstructions;
2104   SmallPtrSet<const BasicBlock *, 4> Visited;
2105   for (BasicBlock &BB: F) {
2106     ReturnInst *Ret = dyn_cast<ReturnInst>(&BB.back());
2107     if (!Ret)
2108       continue;
2109 
2110     LLVM_DEBUG(dbgs() << "Visiting: " << *Ret << "\n");
2111 
2112     const Value *Arg = GetRCIdentityRoot(Ret->getOperand(0));
2113 
2114     // Look for an ``autorelease'' instruction that is a predecessor of Ret and
2115     // dependent on Arg such that there are no instructions dependent on Arg
2116     // that need a positive ref count in between the autorelease and Ret.
2117     CallInst *Autorelease = FindPredecessorAutoreleaseWithSafePath(
2118         Arg, &BB, Ret, DependingInstructions, Visited, PA);
2119     DependingInstructions.clear();
2120     Visited.clear();
2121 
2122     if (!Autorelease)
2123       continue;
2124 
2125     CallInst *Retain = FindPredecessorRetainWithSafePath(
2126         Arg, Autorelease->getParent(), Autorelease, DependingInstructions,
2127         Visited, PA);
2128     DependingInstructions.clear();
2129     Visited.clear();
2130 
2131     if (!Retain)
2132       continue;
2133 
2134     // Check that there is nothing that can affect the reference count
2135     // between the retain and the call.  Note that Retain need not be in BB.
2136     bool HasSafePathToCall = HasSafePathToPredecessorCall(Arg, Retain,
2137                                                           DependingInstructions,
2138                                                           Visited, PA);
2139     DependingInstructions.clear();
2140     Visited.clear();
2141 
2142     if (!HasSafePathToCall)
2143       continue;
2144 
2145     // If so, we can zap the retain and autorelease.
2146     Changed = true;
2147     ++NumRets;
2148     LLVM_DEBUG(dbgs() << "Erasing: " << *Retain << "\nErasing: " << *Autorelease
2149                       << "\n");
2150     EraseInstruction(Retain);
2151     EraseInstruction(Autorelease);
2152   }
2153 }
2154 
2155 #ifndef NDEBUG
2156 void
GatherStatistics(Function & F,bool AfterOptimization)2157 ObjCARCOpt::GatherStatistics(Function &F, bool AfterOptimization) {
2158   Statistic &NumRetains =
2159       AfterOptimization ? NumRetainsAfterOpt : NumRetainsBeforeOpt;
2160   Statistic &NumReleases =
2161       AfterOptimization ? NumReleasesAfterOpt : NumReleasesBeforeOpt;
2162 
2163   for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) {
2164     Instruction *Inst = &*I++;
2165     switch (GetBasicARCInstKind(Inst)) {
2166     default:
2167       break;
2168     case ARCInstKind::Retain:
2169       ++NumRetains;
2170       break;
2171     case ARCInstKind::Release:
2172       ++NumReleases;
2173       break;
2174     }
2175   }
2176 }
2177 #endif
2178 
doInitialization(Module & M)2179 bool ObjCARCOpt::doInitialization(Module &M) {
2180   if (!EnableARCOpts)
2181     return false;
2182 
2183   // If nothing in the Module uses ARC, don't do anything.
2184   Run = ModuleHasARC(M);
2185   if (!Run)
2186     return false;
2187 
2188   // Intuitively, objc_retain and others are nocapture, however in practice
2189   // they are not, because they return their argument value. And objc_release
2190   // calls finalizers which can have arbitrary side effects.
2191   MDKindCache.init(&M);
2192 
2193   // Initialize our runtime entry point cache.
2194   EP.init(&M);
2195 
2196   return false;
2197 }
2198 
runOnFunction(Function & F)2199 bool ObjCARCOpt::runOnFunction(Function &F) {
2200   if (!EnableARCOpts)
2201     return false;
2202 
2203   // If nothing in the Module uses ARC, don't do anything.
2204   if (!Run)
2205     return false;
2206 
2207   Changed = false;
2208 
2209   LLVM_DEBUG(dbgs() << "<<< ObjCARCOpt: Visiting Function: " << F.getName()
2210                     << " >>>"
2211                        "\n");
2212 
2213   PA.setAA(&getAnalysis<AAResultsWrapperPass>().getAAResults());
2214 
2215 #ifndef NDEBUG
2216   if (AreStatisticsEnabled()) {
2217     GatherStatistics(F, false);
2218   }
2219 #endif
2220 
2221   // This pass performs several distinct transformations. As a compile-time aid
2222   // when compiling code that isn't ObjC, skip these if the relevant ObjC
2223   // library functions aren't declared.
2224 
2225   // Preliminary optimizations. This also computes UsedInThisFunction.
2226   OptimizeIndividualCalls(F);
2227 
2228   // Optimizations for weak pointers.
2229   if (UsedInThisFunction & ((1 << unsigned(ARCInstKind::LoadWeak)) |
2230                             (1 << unsigned(ARCInstKind::LoadWeakRetained)) |
2231                             (1 << unsigned(ARCInstKind::StoreWeak)) |
2232                             (1 << unsigned(ARCInstKind::InitWeak)) |
2233                             (1 << unsigned(ARCInstKind::CopyWeak)) |
2234                             (1 << unsigned(ARCInstKind::MoveWeak)) |
2235                             (1 << unsigned(ARCInstKind::DestroyWeak))))
2236     OptimizeWeakCalls(F);
2237 
2238   // Optimizations for retain+release pairs.
2239   if (UsedInThisFunction & ((1 << unsigned(ARCInstKind::Retain)) |
2240                             (1 << unsigned(ARCInstKind::RetainRV)) |
2241                             (1 << unsigned(ARCInstKind::RetainBlock))))
2242     if (UsedInThisFunction & (1 << unsigned(ARCInstKind::Release)))
2243       // Run OptimizeSequences until it either stops making changes or
2244       // no retain+release pair nesting is detected.
2245       while (OptimizeSequences(F)) {}
2246 
2247   // Optimizations if objc_autorelease is used.
2248   if (UsedInThisFunction & ((1 << unsigned(ARCInstKind::Autorelease)) |
2249                             (1 << unsigned(ARCInstKind::AutoreleaseRV))))
2250     OptimizeReturns(F);
2251 
2252   // Gather statistics after optimization.
2253 #ifndef NDEBUG
2254   if (AreStatisticsEnabled()) {
2255     GatherStatistics(F, true);
2256   }
2257 #endif
2258 
2259   LLVM_DEBUG(dbgs() << "\n");
2260 
2261   return Changed;
2262 }
2263 
releaseMemory()2264 void ObjCARCOpt::releaseMemory() {
2265   PA.clear();
2266 }
2267 
2268 /// @}
2269 ///
2270