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