1 //===- ObjCARC.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 // This file defines ObjC ARC optimizations. ARC stands for 11 // Automatic Reference Counting and is a system for managing reference counts 12 // for objects 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, pattern-matching and replacement of 17 // low-level operations into higher-level operations, and numerous minor 18 // simplifications. 19 // 20 // This file also defines a simple ARC-aware AliasAnalysis. 21 // 22 // WARNING: This file knows about certain library functions. It recognizes them 23 // by name, and hardwires knowedge of their semantics. 24 // 25 // WARNING: This file knows about how certain Objective-C library functions are 26 // used. Naive LLVM IR transformations which would otherwise be 27 // behavior-preserving may break these assumptions. 28 // 29 //===----------------------------------------------------------------------===// 30 31 #define DEBUG_TYPE "objc-arc" 32 #include "llvm/Function.h" 33 #include "llvm/Intrinsics.h" 34 #include "llvm/GlobalVariable.h" 35 #include "llvm/DerivedTypes.h" 36 #include "llvm/Module.h" 37 #include "llvm/Analysis/ValueTracking.h" 38 #include "llvm/Transforms/Utils/Local.h" 39 #include "llvm/Support/CallSite.h" 40 #include "llvm/Support/CommandLine.h" 41 #include "llvm/ADT/StringSwitch.h" 42 #include "llvm/ADT/DenseMap.h" 43 #include "llvm/ADT/STLExtras.h" 44 using namespace llvm; 45 46 // A handy option to enable/disable all optimizations in this file. 47 static cl::opt<bool> EnableARCOpts("enable-objc-arc-opts", cl::init(true)); 48 49 //===----------------------------------------------------------------------===// 50 // Misc. Utilities 51 //===----------------------------------------------------------------------===// 52 53 namespace { 54 /// MapVector - An associative container with fast insertion-order 55 /// (deterministic) iteration over its elements. Plus the special 56 /// blot operation. 57 template<class KeyT, class ValueT> 58 class MapVector { 59 /// Map - Map keys to indices in Vector. 60 typedef DenseMap<KeyT, size_t> MapTy; 61 MapTy Map; 62 63 /// Vector - Keys and values. 64 typedef std::vector<std::pair<KeyT, ValueT> > VectorTy; 65 VectorTy Vector; 66 67 public: 68 typedef typename VectorTy::iterator iterator; 69 typedef typename VectorTy::const_iterator const_iterator; 70 iterator begin() { return Vector.begin(); } 71 iterator end() { return Vector.end(); } 72 const_iterator begin() const { return Vector.begin(); } 73 const_iterator end() const { return Vector.end(); } 74 75 #ifdef XDEBUG 76 ~MapVector() { 77 assert(Vector.size() >= Map.size()); // May differ due to blotting. 78 for (typename MapTy::const_iterator I = Map.begin(), E = Map.end(); 79 I != E; ++I) { 80 assert(I->second < Vector.size()); 81 assert(Vector[I->second].first == I->first); 82 } 83 for (typename VectorTy::const_iterator I = Vector.begin(), 84 E = Vector.end(); I != E; ++I) 85 assert(!I->first || 86 (Map.count(I->first) && 87 Map[I->first] == size_t(I - Vector.begin()))); 88 } 89 #endif 90 91 ValueT &operator[](KeyT Arg) { 92 std::pair<typename MapTy::iterator, bool> Pair = 93 Map.insert(std::make_pair(Arg, size_t(0))); 94 if (Pair.second) { 95 Pair.first->second = Vector.size(); 96 Vector.push_back(std::make_pair(Arg, ValueT())); 97 return Vector.back().second; 98 } 99 return Vector[Pair.first->second].second; 100 } 101 102 std::pair<iterator, bool> 103 insert(const std::pair<KeyT, ValueT> &InsertPair) { 104 std::pair<typename MapTy::iterator, bool> Pair = 105 Map.insert(std::make_pair(InsertPair.first, size_t(0))); 106 if (Pair.second) { 107 Pair.first->second = Vector.size(); 108 Vector.push_back(InsertPair); 109 return std::make_pair(llvm::prior(Vector.end()), true); 110 } 111 return std::make_pair(Vector.begin() + Pair.first->second, false); 112 } 113 114 const_iterator find(KeyT Key) const { 115 typename MapTy::const_iterator It = Map.find(Key); 116 if (It == Map.end()) return Vector.end(); 117 return Vector.begin() + It->second; 118 } 119 120 /// blot - This is similar to erase, but instead of removing the element 121 /// from the vector, it just zeros out the key in the vector. This leaves 122 /// iterators intact, but clients must be prepared for zeroed-out keys when 123 /// iterating. 124 void blot(KeyT Key) { 125 typename MapTy::iterator It = Map.find(Key); 126 if (It == Map.end()) return; 127 Vector[It->second].first = KeyT(); 128 Map.erase(It); 129 } 130 131 void clear() { 132 Map.clear(); 133 Vector.clear(); 134 } 135 }; 136 } 137 138 //===----------------------------------------------------------------------===// 139 // ARC Utilities. 140 //===----------------------------------------------------------------------===// 141 142 namespace { 143 /// InstructionClass - A simple classification for instructions. 144 enum InstructionClass { 145 IC_Retain, ///< objc_retain 146 IC_RetainRV, ///< objc_retainAutoreleasedReturnValue 147 IC_RetainBlock, ///< objc_retainBlock 148 IC_Release, ///< objc_release 149 IC_Autorelease, ///< objc_autorelease 150 IC_AutoreleaseRV, ///< objc_autoreleaseReturnValue 151 IC_AutoreleasepoolPush, ///< objc_autoreleasePoolPush 152 IC_AutoreleasepoolPop, ///< objc_autoreleasePoolPop 153 IC_NoopCast, ///< objc_retainedObject, etc. 154 IC_FusedRetainAutorelease, ///< objc_retainAutorelease 155 IC_FusedRetainAutoreleaseRV, ///< objc_retainAutoreleaseReturnValue 156 IC_LoadWeakRetained, ///< objc_loadWeakRetained (primitive) 157 IC_StoreWeak, ///< objc_storeWeak (primitive) 158 IC_InitWeak, ///< objc_initWeak (derived) 159 IC_LoadWeak, ///< objc_loadWeak (derived) 160 IC_MoveWeak, ///< objc_moveWeak (derived) 161 IC_CopyWeak, ///< objc_copyWeak (derived) 162 IC_DestroyWeak, ///< objc_destroyWeak (derived) 163 IC_CallOrUser, ///< could call objc_release and/or "use" pointers 164 IC_Call, ///< could call objc_release 165 IC_User, ///< could "use" a pointer 166 IC_None ///< anything else 167 }; 168 } 169 170 /// IsPotentialUse - Test whether the given value is possible a 171 /// reference-counted pointer. 172 static bool IsPotentialUse(const Value *Op) { 173 // Pointers to static or stack storage are not reference-counted pointers. 174 if (isa<Constant>(Op) || isa<AllocaInst>(Op)) 175 return false; 176 // Special arguments are not reference-counted. 177 if (const Argument *Arg = dyn_cast<Argument>(Op)) 178 if (Arg->hasByValAttr() || 179 Arg->hasNestAttr() || 180 Arg->hasStructRetAttr()) 181 return false; 182 // Only consider values with pointer types, and not function pointers. 183 PointerType *Ty = dyn_cast<PointerType>(Op->getType()); 184 if (!Ty || isa<FunctionType>(Ty->getElementType())) 185 return false; 186 // Conservatively assume anything else is a potential use. 187 return true; 188 } 189 190 /// GetCallSiteClass - Helper for GetInstructionClass. Determines what kind 191 /// of construct CS is. 192 static InstructionClass GetCallSiteClass(ImmutableCallSite CS) { 193 for (ImmutableCallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); 194 I != E; ++I) 195 if (IsPotentialUse(*I)) 196 return CS.onlyReadsMemory() ? IC_User : IC_CallOrUser; 197 198 return CS.onlyReadsMemory() ? IC_None : IC_Call; 199 } 200 201 /// GetFunctionClass - Determine if F is one of the special known Functions. 202 /// If it isn't, return IC_CallOrUser. 203 static InstructionClass GetFunctionClass(const Function *F) { 204 Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 205 206 // No arguments. 207 if (AI == AE) 208 return StringSwitch<InstructionClass>(F->getName()) 209 .Case("objc_autoreleasePoolPush", IC_AutoreleasepoolPush) 210 .Default(IC_CallOrUser); 211 212 // One argument. 213 const Argument *A0 = AI++; 214 if (AI == AE) 215 // Argument is a pointer. 216 if (PointerType *PTy = dyn_cast<PointerType>(A0->getType())) { 217 Type *ETy = PTy->getElementType(); 218 // Argument is i8*. 219 if (ETy->isIntegerTy(8)) 220 return StringSwitch<InstructionClass>(F->getName()) 221 .Case("objc_retain", IC_Retain) 222 .Case("objc_retainAutoreleasedReturnValue", IC_RetainRV) 223 .Case("objc_retainBlock", IC_RetainBlock) 224 .Case("objc_release", IC_Release) 225 .Case("objc_autorelease", IC_Autorelease) 226 .Case("objc_autoreleaseReturnValue", IC_AutoreleaseRV) 227 .Case("objc_autoreleasePoolPop", IC_AutoreleasepoolPop) 228 .Case("objc_retainedObject", IC_NoopCast) 229 .Case("objc_unretainedObject", IC_NoopCast) 230 .Case("objc_unretainedPointer", IC_NoopCast) 231 .Case("objc_retain_autorelease", IC_FusedRetainAutorelease) 232 .Case("objc_retainAutorelease", IC_FusedRetainAutorelease) 233 .Case("objc_retainAutoreleaseReturnValue",IC_FusedRetainAutoreleaseRV) 234 .Default(IC_CallOrUser); 235 236 // Argument is i8** 237 if (PointerType *Pte = dyn_cast<PointerType>(ETy)) 238 if (Pte->getElementType()->isIntegerTy(8)) 239 return StringSwitch<InstructionClass>(F->getName()) 240 .Case("objc_loadWeakRetained", IC_LoadWeakRetained) 241 .Case("objc_loadWeak", IC_LoadWeak) 242 .Case("objc_destroyWeak", IC_DestroyWeak) 243 .Default(IC_CallOrUser); 244 } 245 246 // Two arguments, first is i8**. 247 const Argument *A1 = AI++; 248 if (AI == AE) 249 if (PointerType *PTy = dyn_cast<PointerType>(A0->getType())) 250 if (PointerType *Pte = dyn_cast<PointerType>(PTy->getElementType())) 251 if (Pte->getElementType()->isIntegerTy(8)) 252 if (PointerType *PTy1 = dyn_cast<PointerType>(A1->getType())) { 253 Type *ETy1 = PTy1->getElementType(); 254 // Second argument is i8* 255 if (ETy1->isIntegerTy(8)) 256 return StringSwitch<InstructionClass>(F->getName()) 257 .Case("objc_storeWeak", IC_StoreWeak) 258 .Case("objc_initWeak", IC_InitWeak) 259 .Default(IC_CallOrUser); 260 // Second argument is i8**. 261 if (PointerType *Pte1 = dyn_cast<PointerType>(ETy1)) 262 if (Pte1->getElementType()->isIntegerTy(8)) 263 return StringSwitch<InstructionClass>(F->getName()) 264 .Case("objc_moveWeak", IC_MoveWeak) 265 .Case("objc_copyWeak", IC_CopyWeak) 266 .Default(IC_CallOrUser); 267 } 268 269 // Anything else. 270 return IC_CallOrUser; 271 } 272 273 /// GetInstructionClass - Determine what kind of construct V is. 274 static InstructionClass GetInstructionClass(const Value *V) { 275 if (const Instruction *I = dyn_cast<Instruction>(V)) { 276 // Any instruction other than bitcast and gep with a pointer operand have a 277 // use of an objc pointer. Bitcasts, GEPs, Selects, PHIs transfer a pointer 278 // to a subsequent use, rather than using it themselves, in this sense. 279 // As a short cut, several other opcodes are known to have no pointer 280 // operands of interest. And ret is never followed by a release, so it's 281 // not interesting to examine. 282 switch (I->getOpcode()) { 283 case Instruction::Call: { 284 const CallInst *CI = cast<CallInst>(I); 285 // Check for calls to special functions. 286 if (const Function *F = CI->getCalledFunction()) { 287 InstructionClass Class = GetFunctionClass(F); 288 if (Class != IC_CallOrUser) 289 return Class; 290 291 // None of the intrinsic functions do objc_release. For intrinsics, the 292 // only question is whether or not they may be users. 293 switch (F->getIntrinsicID()) { 294 case 0: break; 295 case Intrinsic::bswap: case Intrinsic::ctpop: 296 case Intrinsic::ctlz: case Intrinsic::cttz: 297 case Intrinsic::returnaddress: case Intrinsic::frameaddress: 298 case Intrinsic::stacksave: case Intrinsic::stackrestore: 299 case Intrinsic::vastart: case Intrinsic::vacopy: case Intrinsic::vaend: 300 // Don't let dbg info affect our results. 301 case Intrinsic::dbg_declare: case Intrinsic::dbg_value: 302 // Short cut: Some intrinsics obviously don't use ObjC pointers. 303 return IC_None; 304 default: 305 for (Function::const_arg_iterator AI = F->arg_begin(), 306 AE = F->arg_end(); AI != AE; ++AI) 307 if (IsPotentialUse(AI)) 308 return IC_User; 309 return IC_None; 310 } 311 } 312 return GetCallSiteClass(CI); 313 } 314 case Instruction::Invoke: 315 return GetCallSiteClass(cast<InvokeInst>(I)); 316 case Instruction::BitCast: 317 case Instruction::GetElementPtr: 318 case Instruction::Select: case Instruction::PHI: 319 case Instruction::Ret: case Instruction::Br: 320 case Instruction::Switch: case Instruction::IndirectBr: 321 case Instruction::Alloca: case Instruction::VAArg: 322 case Instruction::Add: case Instruction::FAdd: 323 case Instruction::Sub: case Instruction::FSub: 324 case Instruction::Mul: case Instruction::FMul: 325 case Instruction::SDiv: case Instruction::UDiv: case Instruction::FDiv: 326 case Instruction::SRem: case Instruction::URem: case Instruction::FRem: 327 case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: 328 case Instruction::And: case Instruction::Or: case Instruction::Xor: 329 case Instruction::SExt: case Instruction::ZExt: case Instruction::Trunc: 330 case Instruction::IntToPtr: case Instruction::FCmp: 331 case Instruction::FPTrunc: case Instruction::FPExt: 332 case Instruction::FPToUI: case Instruction::FPToSI: 333 case Instruction::UIToFP: case Instruction::SIToFP: 334 case Instruction::InsertElement: case Instruction::ExtractElement: 335 case Instruction::ShuffleVector: 336 case Instruction::ExtractValue: 337 break; 338 case Instruction::ICmp: 339 // Comparing a pointer with null, or any other constant, isn't an 340 // interesting use, because we don't care what the pointer points to, or 341 // about the values of any other dynamic reference-counted pointers. 342 if (IsPotentialUse(I->getOperand(1))) 343 return IC_User; 344 break; 345 default: 346 // For anything else, check all the operands. 347 for (User::const_op_iterator OI = I->op_begin(), OE = I->op_end(); 348 OI != OE; ++OI) 349 if (IsPotentialUse(*OI)) 350 return IC_User; 351 } 352 } 353 354 // Otherwise, it's totally inert for ARC purposes. 355 return IC_None; 356 } 357 358 /// GetBasicInstructionClass - Determine what kind of construct V is. This is 359 /// similar to GetInstructionClass except that it only detects objc runtine 360 /// calls. This allows it to be faster. 361 static InstructionClass GetBasicInstructionClass(const Value *V) { 362 if (const CallInst *CI = dyn_cast<CallInst>(V)) { 363 if (const Function *F = CI->getCalledFunction()) 364 return GetFunctionClass(F); 365 // Otherwise, be conservative. 366 return IC_CallOrUser; 367 } 368 369 // Otherwise, be conservative. 370 return IC_User; 371 } 372 373 /// IsRetain - Test if the the given class is objc_retain or 374 /// equivalent. 375 static bool IsRetain(InstructionClass Class) { 376 return Class == IC_Retain || 377 Class == IC_RetainRV; 378 } 379 380 /// IsAutorelease - Test if the the given class is objc_autorelease or 381 /// equivalent. 382 static bool IsAutorelease(InstructionClass Class) { 383 return Class == IC_Autorelease || 384 Class == IC_AutoreleaseRV; 385 } 386 387 /// IsForwarding - Test if the given class represents instructions which return 388 /// their argument verbatim. 389 static bool IsForwarding(InstructionClass Class) { 390 // objc_retainBlock technically doesn't always return its argument 391 // verbatim, but it doesn't matter for our purposes here. 392 return Class == IC_Retain || 393 Class == IC_RetainRV || 394 Class == IC_Autorelease || 395 Class == IC_AutoreleaseRV || 396 Class == IC_RetainBlock || 397 Class == IC_NoopCast; 398 } 399 400 /// IsNoopOnNull - Test if the given class represents instructions which do 401 /// nothing if passed a null pointer. 402 static bool IsNoopOnNull(InstructionClass Class) { 403 return Class == IC_Retain || 404 Class == IC_RetainRV || 405 Class == IC_Release || 406 Class == IC_Autorelease || 407 Class == IC_AutoreleaseRV || 408 Class == IC_RetainBlock; 409 } 410 411 /// IsAlwaysTail - Test if the given class represents instructions which are 412 /// always safe to mark with the "tail" keyword. 413 static bool IsAlwaysTail(InstructionClass Class) { 414 // IC_RetainBlock may be given a stack argument. 415 return Class == IC_Retain || 416 Class == IC_RetainRV || 417 Class == IC_Autorelease || 418 Class == IC_AutoreleaseRV; 419 } 420 421 /// IsNoThrow - Test if the given class represents instructions which are always 422 /// safe to mark with the nounwind attribute.. 423 static bool IsNoThrow(InstructionClass Class) { 424 return Class == IC_Retain || 425 Class == IC_RetainRV || 426 Class == IC_RetainBlock || 427 Class == IC_Release || 428 Class == IC_Autorelease || 429 Class == IC_AutoreleaseRV || 430 Class == IC_AutoreleasepoolPush || 431 Class == IC_AutoreleasepoolPop; 432 } 433 434 /// EraseInstruction - Erase the given instruction. ObjC calls return their 435 /// argument verbatim, so if it's such a call and the return value has users, 436 /// replace them with the argument value. 437 static void EraseInstruction(Instruction *CI) { 438 Value *OldArg = cast<CallInst>(CI)->getArgOperand(0); 439 440 bool Unused = CI->use_empty(); 441 442 if (!Unused) { 443 // Replace the return value with the argument. 444 assert(IsForwarding(GetBasicInstructionClass(CI)) && 445 "Can't delete non-forwarding instruction with users!"); 446 CI->replaceAllUsesWith(OldArg); 447 } 448 449 CI->eraseFromParent(); 450 451 if (Unused) 452 RecursivelyDeleteTriviallyDeadInstructions(OldArg); 453 } 454 455 /// GetUnderlyingObjCPtr - This is a wrapper around getUnderlyingObject which 456 /// also knows how to look through objc_retain and objc_autorelease calls, which 457 /// we know to return their argument verbatim. 458 static const Value *GetUnderlyingObjCPtr(const Value *V) { 459 for (;;) { 460 V = GetUnderlyingObject(V); 461 if (!IsForwarding(GetBasicInstructionClass(V))) 462 break; 463 V = cast<CallInst>(V)->getArgOperand(0); 464 } 465 466 return V; 467 } 468 469 /// StripPointerCastsAndObjCCalls - This is a wrapper around 470 /// Value::stripPointerCasts which also knows how to look through objc_retain 471 /// and objc_autorelease calls, which we know to return their argument verbatim. 472 static const Value *StripPointerCastsAndObjCCalls(const Value *V) { 473 for (;;) { 474 V = V->stripPointerCasts(); 475 if (!IsForwarding(GetBasicInstructionClass(V))) 476 break; 477 V = cast<CallInst>(V)->getArgOperand(0); 478 } 479 return V; 480 } 481 482 /// StripPointerCastsAndObjCCalls - This is a wrapper around 483 /// Value::stripPointerCasts which also knows how to look through objc_retain 484 /// and objc_autorelease calls, which we know to return their argument verbatim. 485 static Value *StripPointerCastsAndObjCCalls(Value *V) { 486 for (;;) { 487 V = V->stripPointerCasts(); 488 if (!IsForwarding(GetBasicInstructionClass(V))) 489 break; 490 V = cast<CallInst>(V)->getArgOperand(0); 491 } 492 return V; 493 } 494 495 /// GetObjCArg - Assuming the given instruction is one of the special calls such 496 /// as objc_retain or objc_release, return the argument value, stripped of no-op 497 /// casts and forwarding calls. 498 static Value *GetObjCArg(Value *Inst) { 499 return StripPointerCastsAndObjCCalls(cast<CallInst>(Inst)->getArgOperand(0)); 500 } 501 502 /// IsObjCIdentifiedObject - This is similar to AliasAnalysis' 503 /// isObjCIdentifiedObject, except that it uses special knowledge of 504 /// ObjC conventions... 505 static bool IsObjCIdentifiedObject(const Value *V) { 506 // Assume that call results and arguments have their own "provenance". 507 // Constants (including GlobalVariables) and Allocas are never 508 // reference-counted. 509 if (isa<CallInst>(V) || isa<InvokeInst>(V) || 510 isa<Argument>(V) || isa<Constant>(V) || 511 isa<AllocaInst>(V)) 512 return true; 513 514 if (const LoadInst *LI = dyn_cast<LoadInst>(V)) { 515 const Value *Pointer = 516 StripPointerCastsAndObjCCalls(LI->getPointerOperand()); 517 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Pointer)) { 518 StringRef Name = GV->getName(); 519 // These special variables are known to hold values which are not 520 // reference-counted pointers. 521 if (Name.startswith("\01L_OBJC_SELECTOR_REFERENCES_") || 522 Name.startswith("\01L_OBJC_CLASSLIST_REFERENCES_") || 523 Name.startswith("\01L_OBJC_CLASSLIST_SUP_REFS_$_") || 524 Name.startswith("\01L_OBJC_METH_VAR_NAME_") || 525 Name.startswith("\01l_objc_msgSend_fixup_")) 526 return true; 527 } 528 } 529 530 return false; 531 } 532 533 /// FindSingleUseIdentifiedObject - This is similar to 534 /// StripPointerCastsAndObjCCalls but it stops as soon as it finds a value 535 /// with multiple uses. 536 static const Value *FindSingleUseIdentifiedObject(const Value *Arg) { 537 if (Arg->hasOneUse()) { 538 if (const BitCastInst *BC = dyn_cast<BitCastInst>(Arg)) 539 return FindSingleUseIdentifiedObject(BC->getOperand(0)); 540 if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Arg)) 541 if (GEP->hasAllZeroIndices()) 542 return FindSingleUseIdentifiedObject(GEP->getPointerOperand()); 543 if (IsForwarding(GetBasicInstructionClass(Arg))) 544 return FindSingleUseIdentifiedObject( 545 cast<CallInst>(Arg)->getArgOperand(0)); 546 if (!IsObjCIdentifiedObject(Arg)) 547 return 0; 548 return Arg; 549 } 550 551 // If we found an identifiable object but it has multiple uses, but they 552 // are trivial uses, we can still consider this to be a single-use 553 // value. 554 if (IsObjCIdentifiedObject(Arg)) { 555 for (Value::const_use_iterator UI = Arg->use_begin(), UE = Arg->use_end(); 556 UI != UE; ++UI) { 557 const User *U = *UI; 558 if (!U->use_empty() || StripPointerCastsAndObjCCalls(U) != Arg) 559 return 0; 560 } 561 562 return Arg; 563 } 564 565 return 0; 566 } 567 568 /// ModuleHasARC - Test if the given module looks interesting to run ARC 569 /// optimization on. 570 static bool ModuleHasARC(const Module &M) { 571 return 572 M.getNamedValue("objc_retain") || 573 M.getNamedValue("objc_release") || 574 M.getNamedValue("objc_autorelease") || 575 M.getNamedValue("objc_retainAutoreleasedReturnValue") || 576 M.getNamedValue("objc_retainBlock") || 577 M.getNamedValue("objc_autoreleaseReturnValue") || 578 M.getNamedValue("objc_autoreleasePoolPush") || 579 M.getNamedValue("objc_loadWeakRetained") || 580 M.getNamedValue("objc_loadWeak") || 581 M.getNamedValue("objc_destroyWeak") || 582 M.getNamedValue("objc_storeWeak") || 583 M.getNamedValue("objc_initWeak") || 584 M.getNamedValue("objc_moveWeak") || 585 M.getNamedValue("objc_copyWeak") || 586 M.getNamedValue("objc_retainedObject") || 587 M.getNamedValue("objc_unretainedObject") || 588 M.getNamedValue("objc_unretainedPointer"); 589 } 590 591 //===----------------------------------------------------------------------===// 592 // ARC AliasAnalysis. 593 //===----------------------------------------------------------------------===// 594 595 #include "llvm/Pass.h" 596 #include "llvm/Analysis/AliasAnalysis.h" 597 #include "llvm/Analysis/Passes.h" 598 599 namespace { 600 /// ObjCARCAliasAnalysis - This is a simple alias analysis 601 /// implementation that uses knowledge of ARC constructs to answer queries. 602 /// 603 /// TODO: This class could be generalized to know about other ObjC-specific 604 /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing 605 /// even though their offsets are dynamic. 606 class ObjCARCAliasAnalysis : public ImmutablePass, 607 public AliasAnalysis { 608 public: 609 static char ID; // Class identification, replacement for typeinfo 610 ObjCARCAliasAnalysis() : ImmutablePass(ID) { 611 initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry()); 612 } 613 614 private: 615 virtual void initializePass() { 616 InitializeAliasAnalysis(this); 617 } 618 619 /// getAdjustedAnalysisPointer - This method is used when a pass implements 620 /// an analysis interface through multiple inheritance. If needed, it 621 /// should override this to adjust the this pointer as needed for the 622 /// specified pass info. 623 virtual void *getAdjustedAnalysisPointer(const void *PI) { 624 if (PI == &AliasAnalysis::ID) 625 return (AliasAnalysis*)this; 626 return this; 627 } 628 629 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 630 virtual AliasResult alias(const Location &LocA, const Location &LocB); 631 virtual bool pointsToConstantMemory(const Location &Loc, bool OrLocal); 632 virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS); 633 virtual ModRefBehavior getModRefBehavior(const Function *F); 634 virtual ModRefResult getModRefInfo(ImmutableCallSite CS, 635 const Location &Loc); 636 virtual ModRefResult getModRefInfo(ImmutableCallSite CS1, 637 ImmutableCallSite CS2); 638 }; 639 } // End of anonymous namespace 640 641 // Register this pass... 642 char ObjCARCAliasAnalysis::ID = 0; 643 INITIALIZE_AG_PASS(ObjCARCAliasAnalysis, AliasAnalysis, "objc-arc-aa", 644 "ObjC-ARC-Based Alias Analysis", false, true, false) 645 646 ImmutablePass *llvm::createObjCARCAliasAnalysisPass() { 647 return new ObjCARCAliasAnalysis(); 648 } 649 650 void 651 ObjCARCAliasAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 652 AU.setPreservesAll(); 653 AliasAnalysis::getAnalysisUsage(AU); 654 } 655 656 AliasAnalysis::AliasResult 657 ObjCARCAliasAnalysis::alias(const Location &LocA, const Location &LocB) { 658 if (!EnableARCOpts) 659 return AliasAnalysis::alias(LocA, LocB); 660 661 // First, strip off no-ops, including ObjC-specific no-ops, and try making a 662 // precise alias query. 663 const Value *SA = StripPointerCastsAndObjCCalls(LocA.Ptr); 664 const Value *SB = StripPointerCastsAndObjCCalls(LocB.Ptr); 665 AliasResult Result = 666 AliasAnalysis::alias(Location(SA, LocA.Size, LocA.TBAATag), 667 Location(SB, LocB.Size, LocB.TBAATag)); 668 if (Result != MayAlias) 669 return Result; 670 671 // If that failed, climb to the underlying object, including climbing through 672 // ObjC-specific no-ops, and try making an imprecise alias query. 673 const Value *UA = GetUnderlyingObjCPtr(SA); 674 const Value *UB = GetUnderlyingObjCPtr(SB); 675 if (UA != SA || UB != SB) { 676 Result = AliasAnalysis::alias(Location(UA), Location(UB)); 677 // We can't use MustAlias or PartialAlias results here because 678 // GetUnderlyingObjCPtr may return an offsetted pointer value. 679 if (Result == NoAlias) 680 return NoAlias; 681 } 682 683 // If that failed, fail. We don't need to chain here, since that's covered 684 // by the earlier precise query. 685 return MayAlias; 686 } 687 688 bool 689 ObjCARCAliasAnalysis::pointsToConstantMemory(const Location &Loc, 690 bool OrLocal) { 691 if (!EnableARCOpts) 692 return AliasAnalysis::pointsToConstantMemory(Loc, OrLocal); 693 694 // First, strip off no-ops, including ObjC-specific no-ops, and try making 695 // a precise alias query. 696 const Value *S = StripPointerCastsAndObjCCalls(Loc.Ptr); 697 if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.TBAATag), 698 OrLocal)) 699 return true; 700 701 // If that failed, climb to the underlying object, including climbing through 702 // ObjC-specific no-ops, and try making an imprecise alias query. 703 const Value *U = GetUnderlyingObjCPtr(S); 704 if (U != S) 705 return AliasAnalysis::pointsToConstantMemory(Location(U), OrLocal); 706 707 // If that failed, fail. We don't need to chain here, since that's covered 708 // by the earlier precise query. 709 return false; 710 } 711 712 AliasAnalysis::ModRefBehavior 713 ObjCARCAliasAnalysis::getModRefBehavior(ImmutableCallSite CS) { 714 // We have nothing to do. Just chain to the next AliasAnalysis. 715 return AliasAnalysis::getModRefBehavior(CS); 716 } 717 718 AliasAnalysis::ModRefBehavior 719 ObjCARCAliasAnalysis::getModRefBehavior(const Function *F) { 720 if (!EnableARCOpts) 721 return AliasAnalysis::getModRefBehavior(F); 722 723 switch (GetFunctionClass(F)) { 724 case IC_NoopCast: 725 return DoesNotAccessMemory; 726 default: 727 break; 728 } 729 730 return AliasAnalysis::getModRefBehavior(F); 731 } 732 733 AliasAnalysis::ModRefResult 734 ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS, const Location &Loc) { 735 if (!EnableARCOpts) 736 return AliasAnalysis::getModRefInfo(CS, Loc); 737 738 switch (GetBasicInstructionClass(CS.getInstruction())) { 739 case IC_Retain: 740 case IC_RetainRV: 741 case IC_RetainBlock: 742 case IC_Autorelease: 743 case IC_AutoreleaseRV: 744 case IC_NoopCast: 745 case IC_AutoreleasepoolPush: 746 case IC_FusedRetainAutorelease: 747 case IC_FusedRetainAutoreleaseRV: 748 // These functions don't access any memory visible to the compiler. 749 return NoModRef; 750 default: 751 break; 752 } 753 754 return AliasAnalysis::getModRefInfo(CS, Loc); 755 } 756 757 AliasAnalysis::ModRefResult 758 ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS1, 759 ImmutableCallSite CS2) { 760 // TODO: Theoretically we could check for dependencies between objc_* calls 761 // and OnlyAccessesArgumentPointees calls or other well-behaved calls. 762 return AliasAnalysis::getModRefInfo(CS1, CS2); 763 } 764 765 //===----------------------------------------------------------------------===// 766 // ARC expansion. 767 //===----------------------------------------------------------------------===// 768 769 #include "llvm/Support/InstIterator.h" 770 #include "llvm/Transforms/Scalar.h" 771 772 namespace { 773 /// ObjCARCExpand - Early ARC transformations. 774 class ObjCARCExpand : public FunctionPass { 775 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 776 virtual bool doInitialization(Module &M); 777 virtual bool runOnFunction(Function &F); 778 779 /// Run - A flag indicating whether this optimization pass should run. 780 bool Run; 781 782 public: 783 static char ID; 784 ObjCARCExpand() : FunctionPass(ID) { 785 initializeObjCARCExpandPass(*PassRegistry::getPassRegistry()); 786 } 787 }; 788 } 789 790 char ObjCARCExpand::ID = 0; 791 INITIALIZE_PASS(ObjCARCExpand, 792 "objc-arc-expand", "ObjC ARC expansion", false, false) 793 794 Pass *llvm::createObjCARCExpandPass() { 795 return new ObjCARCExpand(); 796 } 797 798 void ObjCARCExpand::getAnalysisUsage(AnalysisUsage &AU) const { 799 AU.setPreservesCFG(); 800 } 801 802 bool ObjCARCExpand::doInitialization(Module &M) { 803 Run = ModuleHasARC(M); 804 return false; 805 } 806 807 bool ObjCARCExpand::runOnFunction(Function &F) { 808 if (!EnableARCOpts) 809 return false; 810 811 // If nothing in the Module uses ARC, don't do anything. 812 if (!Run) 813 return false; 814 815 bool Changed = false; 816 817 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ++I) { 818 Instruction *Inst = &*I; 819 820 switch (GetBasicInstructionClass(Inst)) { 821 case IC_Retain: 822 case IC_RetainRV: 823 case IC_Autorelease: 824 case IC_AutoreleaseRV: 825 case IC_FusedRetainAutorelease: 826 case IC_FusedRetainAutoreleaseRV: 827 // These calls return their argument verbatim, as a low-level 828 // optimization. However, this makes high-level optimizations 829 // harder. Undo any uses of this optimization that the front-end 830 // emitted here. We'll redo them in a later pass. 831 Changed = true; 832 Inst->replaceAllUsesWith(cast<CallInst>(Inst)->getArgOperand(0)); 833 break; 834 default: 835 break; 836 } 837 } 838 839 return Changed; 840 } 841 842 //===----------------------------------------------------------------------===// 843 // ARC optimization. 844 //===----------------------------------------------------------------------===// 845 846 // TODO: On code like this: 847 // 848 // objc_retain(%x) 849 // stuff_that_cannot_release() 850 // objc_autorelease(%x) 851 // stuff_that_cannot_release() 852 // objc_retain(%x) 853 // stuff_that_cannot_release() 854 // objc_autorelease(%x) 855 // 856 // The second retain and autorelease can be deleted. 857 858 // TODO: It should be possible to delete 859 // objc_autoreleasePoolPush and objc_autoreleasePoolPop 860 // pairs if nothing is actually autoreleased between them. Also, autorelease 861 // calls followed by objc_autoreleasePoolPop calls (perhaps in ObjC++ code 862 // after inlining) can be turned into plain release calls. 863 864 // TODO: Critical-edge splitting. If the optimial insertion point is 865 // a critical edge, the current algorithm has to fail, because it doesn't 866 // know how to split edges. It should be possible to make the optimizer 867 // think in terms of edges, rather than blocks, and then split critical 868 // edges on demand. 869 870 // TODO: OptimizeSequences could generalized to be Interprocedural. 871 872 // TODO: Recognize that a bunch of other objc runtime calls have 873 // non-escaping arguments and non-releasing arguments, and may be 874 // non-autoreleasing. 875 876 // TODO: Sink autorelease calls as far as possible. Unfortunately we 877 // usually can't sink them past other calls, which would be the main 878 // case where it would be useful. 879 880 /// TODO: The pointer returned from objc_loadWeakRetained is retained. 881 882 #include "llvm/GlobalAlias.h" 883 #include "llvm/Constants.h" 884 #include "llvm/LLVMContext.h" 885 #include "llvm/Support/ErrorHandling.h" 886 #include "llvm/Support/CFG.h" 887 #include "llvm/ADT/PostOrderIterator.h" 888 #include "llvm/ADT/Statistic.h" 889 890 STATISTIC(NumNoops, "Number of no-op objc calls eliminated"); 891 STATISTIC(NumPartialNoops, "Number of partially no-op objc calls eliminated"); 892 STATISTIC(NumAutoreleases,"Number of autoreleases converted to releases"); 893 STATISTIC(NumRets, "Number of return value forwarding " 894 "retain+autoreleaes eliminated"); 895 STATISTIC(NumRRs, "Number of retain+release paths eliminated"); 896 STATISTIC(NumPeeps, "Number of calls peephole-optimized"); 897 898 namespace { 899 /// ProvenanceAnalysis - This is similar to BasicAliasAnalysis, and it 900 /// uses many of the same techniques, except it uses special ObjC-specific 901 /// reasoning about pointer relationships. 902 class ProvenanceAnalysis { 903 AliasAnalysis *AA; 904 905 typedef std::pair<const Value *, const Value *> ValuePairTy; 906 typedef DenseMap<ValuePairTy, bool> CachedResultsTy; 907 CachedResultsTy CachedResults; 908 909 bool relatedCheck(const Value *A, const Value *B); 910 bool relatedSelect(const SelectInst *A, const Value *B); 911 bool relatedPHI(const PHINode *A, const Value *B); 912 913 // Do not implement. 914 void operator=(const ProvenanceAnalysis &); 915 ProvenanceAnalysis(const ProvenanceAnalysis &); 916 917 public: 918 ProvenanceAnalysis() {} 919 920 void setAA(AliasAnalysis *aa) { AA = aa; } 921 922 AliasAnalysis *getAA() const { return AA; } 923 924 bool related(const Value *A, const Value *B); 925 926 void clear() { 927 CachedResults.clear(); 928 } 929 }; 930 } 931 932 bool ProvenanceAnalysis::relatedSelect(const SelectInst *A, const Value *B) { 933 // If the values are Selects with the same condition, we can do a more precise 934 // check: just check for relations between the values on corresponding arms. 935 if (const SelectInst *SB = dyn_cast<SelectInst>(B)) 936 if (A->getCondition() == SB->getCondition()) { 937 if (related(A->getTrueValue(), SB->getTrueValue())) 938 return true; 939 if (related(A->getFalseValue(), SB->getFalseValue())) 940 return true; 941 return false; 942 } 943 944 // Check both arms of the Select node individually. 945 if (related(A->getTrueValue(), B)) 946 return true; 947 if (related(A->getFalseValue(), B)) 948 return true; 949 950 // The arms both checked out. 951 return false; 952 } 953 954 bool ProvenanceAnalysis::relatedPHI(const PHINode *A, const Value *B) { 955 // If the values are PHIs in the same block, we can do a more precise as well 956 // as efficient check: just check for relations between the values on 957 // corresponding edges. 958 if (const PHINode *PNB = dyn_cast<PHINode>(B)) 959 if (PNB->getParent() == A->getParent()) { 960 for (unsigned i = 0, e = A->getNumIncomingValues(); i != e; ++i) 961 if (related(A->getIncomingValue(i), 962 PNB->getIncomingValueForBlock(A->getIncomingBlock(i)))) 963 return true; 964 return false; 965 } 966 967 // Check each unique source of the PHI node against B. 968 SmallPtrSet<const Value *, 4> UniqueSrc; 969 for (unsigned i = 0, e = A->getNumIncomingValues(); i != e; ++i) { 970 const Value *PV1 = A->getIncomingValue(i); 971 if (UniqueSrc.insert(PV1) && related(PV1, B)) 972 return true; 973 } 974 975 // All of the arms checked out. 976 return false; 977 } 978 979 /// isStoredObjCPointer - Test if the value of P, or any value covered by its 980 /// provenance, is ever stored within the function (not counting callees). 981 static bool isStoredObjCPointer(const Value *P) { 982 SmallPtrSet<const Value *, 8> Visited; 983 SmallVector<const Value *, 8> Worklist; 984 Worklist.push_back(P); 985 Visited.insert(P); 986 do { 987 P = Worklist.pop_back_val(); 988 for (Value::const_use_iterator UI = P->use_begin(), UE = P->use_end(); 989 UI != UE; ++UI) { 990 const User *Ur = *UI; 991 if (isa<StoreInst>(Ur)) { 992 if (UI.getOperandNo() == 0) 993 // The pointer is stored. 994 return true; 995 // The pointed is stored through. 996 continue; 997 } 998 if (isa<CallInst>(Ur)) 999 // The pointer is passed as an argument, ignore this. 1000 continue; 1001 if (isa<PtrToIntInst>(P)) 1002 // Assume the worst. 1003 return true; 1004 if (Visited.insert(Ur)) 1005 Worklist.push_back(Ur); 1006 } 1007 } while (!Worklist.empty()); 1008 1009 // Everything checked out. 1010 return false; 1011 } 1012 1013 bool ProvenanceAnalysis::relatedCheck(const Value *A, const Value *B) { 1014 // Skip past provenance pass-throughs. 1015 A = GetUnderlyingObjCPtr(A); 1016 B = GetUnderlyingObjCPtr(B); 1017 1018 // Quick check. 1019 if (A == B) 1020 return true; 1021 1022 // Ask regular AliasAnalysis, for a first approximation. 1023 switch (AA->alias(A, B)) { 1024 case AliasAnalysis::NoAlias: 1025 return false; 1026 case AliasAnalysis::MustAlias: 1027 case AliasAnalysis::PartialAlias: 1028 return true; 1029 case AliasAnalysis::MayAlias: 1030 break; 1031 } 1032 1033 bool AIsIdentified = IsObjCIdentifiedObject(A); 1034 bool BIsIdentified = IsObjCIdentifiedObject(B); 1035 1036 // An ObjC-Identified object can't alias a load if it is never locally stored. 1037 if (AIsIdentified) { 1038 if (BIsIdentified) { 1039 // If both pointers have provenance, they can be directly compared. 1040 if (A != B) 1041 return false; 1042 } else { 1043 if (isa<LoadInst>(B)) 1044 return isStoredObjCPointer(A); 1045 } 1046 } else { 1047 if (BIsIdentified && isa<LoadInst>(A)) 1048 return isStoredObjCPointer(B); 1049 } 1050 1051 // Special handling for PHI and Select. 1052 if (const PHINode *PN = dyn_cast<PHINode>(A)) 1053 return relatedPHI(PN, B); 1054 if (const PHINode *PN = dyn_cast<PHINode>(B)) 1055 return relatedPHI(PN, A); 1056 if (const SelectInst *S = dyn_cast<SelectInst>(A)) 1057 return relatedSelect(S, B); 1058 if (const SelectInst *S = dyn_cast<SelectInst>(B)) 1059 return relatedSelect(S, A); 1060 1061 // Conservative. 1062 return true; 1063 } 1064 1065 bool ProvenanceAnalysis::related(const Value *A, const Value *B) { 1066 // Begin by inserting a conservative value into the map. If the insertion 1067 // fails, we have the answer already. If it succeeds, leave it there until we 1068 // compute the real answer to guard against recursive queries. 1069 if (A > B) std::swap(A, B); 1070 std::pair<CachedResultsTy::iterator, bool> Pair = 1071 CachedResults.insert(std::make_pair(ValuePairTy(A, B), true)); 1072 if (!Pair.second) 1073 return Pair.first->second; 1074 1075 bool Result = relatedCheck(A, B); 1076 CachedResults[ValuePairTy(A, B)] = Result; 1077 return Result; 1078 } 1079 1080 namespace { 1081 // Sequence - A sequence of states that a pointer may go through in which an 1082 // objc_retain and objc_release are actually needed. 1083 enum Sequence { 1084 S_None, 1085 S_Retain, ///< objc_retain(x) 1086 S_CanRelease, ///< foo(x) -- x could possibly see a ref count decrement 1087 S_Use, ///< any use of x 1088 S_Stop, ///< like S_Release, but code motion is stopped 1089 S_Release, ///< objc_release(x) 1090 S_MovableRelease ///< objc_release(x), !clang.imprecise_release 1091 }; 1092 } 1093 1094 static Sequence MergeSeqs(Sequence A, Sequence B, bool TopDown) { 1095 // The easy cases. 1096 if (A == B) 1097 return A; 1098 if (A == S_None || B == S_None) 1099 return S_None; 1100 1101 // Note that we can't merge S_CanRelease and S_Use. 1102 if (A > B) std::swap(A, B); 1103 if (TopDown) { 1104 // Choose the side which is further along in the sequence. 1105 if (A == S_Retain && (B == S_CanRelease || B == S_Use)) 1106 return B; 1107 } else { 1108 // Choose the side which is further along in the sequence. 1109 if ((A == S_Use || A == S_CanRelease) && 1110 (B == S_Release || B == S_Stop || B == S_MovableRelease)) 1111 return A; 1112 // If both sides are releases, choose the more conservative one. 1113 if (A == S_Stop && (B == S_Release || B == S_MovableRelease)) 1114 return A; 1115 if (A == S_Release && B == S_MovableRelease) 1116 return A; 1117 } 1118 1119 return S_None; 1120 } 1121 1122 namespace { 1123 /// RRInfo - Unidirectional information about either a 1124 /// retain-decrement-use-release sequence or release-use-decrement-retain 1125 /// reverese sequence. 1126 struct RRInfo { 1127 /// KnownIncremented - After an objc_retain, the reference count of the 1128 /// referenced object is known to be positive. Similarly, before an 1129 /// objc_release, the reference count of the referenced object is known to 1130 /// be positive. If there are retain-release pairs in code regions where the 1131 /// retain count is known to be positive, they can be eliminated, regardless 1132 /// of any side effects between them. 1133 bool KnownIncremented; 1134 1135 /// IsRetainBlock - True if the Calls are objc_retainBlock calls (as 1136 /// opposed to objc_retain calls). 1137 bool IsRetainBlock; 1138 1139 /// IsTailCallRelease - True of the objc_release calls are all marked 1140 /// with the "tail" keyword. 1141 bool IsTailCallRelease; 1142 1143 /// ReleaseMetadata - If the Calls are objc_release calls and they all have 1144 /// a clang.imprecise_release tag, this is the metadata tag. 1145 MDNode *ReleaseMetadata; 1146 1147 /// Calls - For a top-down sequence, the set of objc_retains or 1148 /// objc_retainBlocks. For bottom-up, the set of objc_releases. 1149 SmallPtrSet<Instruction *, 2> Calls; 1150 1151 /// ReverseInsertPts - The set of optimal insert positions for 1152 /// moving calls in the opposite sequence. 1153 SmallPtrSet<Instruction *, 2> ReverseInsertPts; 1154 1155 RRInfo() : 1156 KnownIncremented(false), IsRetainBlock(false), IsTailCallRelease(false), 1157 ReleaseMetadata(0) {} 1158 1159 void clear(); 1160 }; 1161 } 1162 1163 void RRInfo::clear() { 1164 KnownIncremented = false; 1165 IsRetainBlock = false; 1166 IsTailCallRelease = false; 1167 ReleaseMetadata = 0; 1168 Calls.clear(); 1169 ReverseInsertPts.clear(); 1170 } 1171 1172 namespace { 1173 /// PtrState - This class summarizes several per-pointer runtime properties 1174 /// which are propogated through the flow graph. 1175 class PtrState { 1176 /// RefCount - The known minimum number of reference count increments. 1177 unsigned RefCount; 1178 1179 /// Seq - The current position in the sequence. 1180 Sequence Seq; 1181 1182 public: 1183 /// RRI - Unidirectional information about the current sequence. 1184 /// TODO: Encapsulate this better. 1185 RRInfo RRI; 1186 1187 PtrState() : RefCount(0), Seq(S_None) {} 1188 1189 void IncrementRefCount() { 1190 if (RefCount != UINT_MAX) ++RefCount; 1191 } 1192 1193 void DecrementRefCount() { 1194 if (RefCount != 0) --RefCount; 1195 } 1196 1197 void ClearRefCount() { 1198 RefCount = 0; 1199 } 1200 1201 bool IsKnownIncremented() const { 1202 return RefCount > 0; 1203 } 1204 1205 void SetSeq(Sequence NewSeq) { 1206 Seq = NewSeq; 1207 } 1208 1209 void SetSeqToRelease(MDNode *M) { 1210 if (Seq == S_None || Seq == S_Use) { 1211 Seq = M ? S_MovableRelease : S_Release; 1212 RRI.ReleaseMetadata = M; 1213 } else if (Seq != S_MovableRelease || RRI.ReleaseMetadata != M) { 1214 Seq = S_Release; 1215 RRI.ReleaseMetadata = 0; 1216 } 1217 } 1218 1219 Sequence GetSeq() const { 1220 return Seq; 1221 } 1222 1223 void ClearSequenceProgress() { 1224 Seq = S_None; 1225 RRI.clear(); 1226 } 1227 1228 void Merge(const PtrState &Other, bool TopDown); 1229 }; 1230 } 1231 1232 void 1233 PtrState::Merge(const PtrState &Other, bool TopDown) { 1234 Seq = MergeSeqs(Seq, Other.Seq, TopDown); 1235 RefCount = std::min(RefCount, Other.RefCount); 1236 1237 // We can't merge a plain objc_retain with an objc_retainBlock. 1238 if (RRI.IsRetainBlock != Other.RRI.IsRetainBlock) 1239 Seq = S_None; 1240 1241 if (Seq == S_None) { 1242 RRI.clear(); 1243 } else { 1244 // Conservatively merge the ReleaseMetadata information. 1245 if (RRI.ReleaseMetadata != Other.RRI.ReleaseMetadata) 1246 RRI.ReleaseMetadata = 0; 1247 1248 RRI.KnownIncremented = RRI.KnownIncremented && Other.RRI.KnownIncremented; 1249 RRI.IsTailCallRelease = RRI.IsTailCallRelease && Other.RRI.IsTailCallRelease; 1250 RRI.Calls.insert(Other.RRI.Calls.begin(), Other.RRI.Calls.end()); 1251 RRI.ReverseInsertPts.insert(Other.RRI.ReverseInsertPts.begin(), 1252 Other.RRI.ReverseInsertPts.end()); 1253 } 1254 } 1255 1256 namespace { 1257 /// BBState - Per-BasicBlock state. 1258 class BBState { 1259 /// TopDownPathCount - The number of unique control paths from the entry 1260 /// which can reach this block. 1261 unsigned TopDownPathCount; 1262 1263 /// BottomUpPathCount - The number of unique control paths to exits 1264 /// from this block. 1265 unsigned BottomUpPathCount; 1266 1267 /// MapTy - A type for PerPtrTopDown and PerPtrBottomUp. 1268 typedef MapVector<const Value *, PtrState> MapTy; 1269 1270 /// PerPtrTopDown - The top-down traversal uses this to record information 1271 /// known about a pointer at the bottom of each block. 1272 MapTy PerPtrTopDown; 1273 1274 /// PerPtrBottomUp - The bottom-up traversal uses this to record information 1275 /// known about a pointer at the top of each block. 1276 MapTy PerPtrBottomUp; 1277 1278 public: 1279 BBState() : TopDownPathCount(0), BottomUpPathCount(0) {} 1280 1281 typedef MapTy::iterator ptr_iterator; 1282 typedef MapTy::const_iterator ptr_const_iterator; 1283 1284 ptr_iterator top_down_ptr_begin() { return PerPtrTopDown.begin(); } 1285 ptr_iterator top_down_ptr_end() { return PerPtrTopDown.end(); } 1286 ptr_const_iterator top_down_ptr_begin() const { 1287 return PerPtrTopDown.begin(); 1288 } 1289 ptr_const_iterator top_down_ptr_end() const { 1290 return PerPtrTopDown.end(); 1291 } 1292 1293 ptr_iterator bottom_up_ptr_begin() { return PerPtrBottomUp.begin(); } 1294 ptr_iterator bottom_up_ptr_end() { return PerPtrBottomUp.end(); } 1295 ptr_const_iterator bottom_up_ptr_begin() const { 1296 return PerPtrBottomUp.begin(); 1297 } 1298 ptr_const_iterator bottom_up_ptr_end() const { 1299 return PerPtrBottomUp.end(); 1300 } 1301 1302 /// SetAsEntry - Mark this block as being an entry block, which has one 1303 /// path from the entry by definition. 1304 void SetAsEntry() { TopDownPathCount = 1; } 1305 1306 /// SetAsExit - Mark this block as being an exit block, which has one 1307 /// path to an exit by definition. 1308 void SetAsExit() { BottomUpPathCount = 1; } 1309 1310 PtrState &getPtrTopDownState(const Value *Arg) { 1311 return PerPtrTopDown[Arg]; 1312 } 1313 1314 PtrState &getPtrBottomUpState(const Value *Arg) { 1315 return PerPtrBottomUp[Arg]; 1316 } 1317 1318 void clearBottomUpPointers() { 1319 PerPtrTopDown.clear(); 1320 } 1321 1322 void clearTopDownPointers() { 1323 PerPtrTopDown.clear(); 1324 } 1325 1326 void InitFromPred(const BBState &Other); 1327 void InitFromSucc(const BBState &Other); 1328 void MergePred(const BBState &Other); 1329 void MergeSucc(const BBState &Other); 1330 1331 /// GetAllPathCount - Return the number of possible unique paths from an 1332 /// entry to an exit which pass through this block. This is only valid 1333 /// after both the top-down and bottom-up traversals are complete. 1334 unsigned GetAllPathCount() const { 1335 return TopDownPathCount * BottomUpPathCount; 1336 } 1337 }; 1338 } 1339 1340 void BBState::InitFromPred(const BBState &Other) { 1341 PerPtrTopDown = Other.PerPtrTopDown; 1342 TopDownPathCount = Other.TopDownPathCount; 1343 } 1344 1345 void BBState::InitFromSucc(const BBState &Other) { 1346 PerPtrBottomUp = Other.PerPtrBottomUp; 1347 BottomUpPathCount = Other.BottomUpPathCount; 1348 } 1349 1350 /// MergePred - The top-down traversal uses this to merge information about 1351 /// predecessors to form the initial state for a new block. 1352 void BBState::MergePred(const BBState &Other) { 1353 // Other.TopDownPathCount can be 0, in which case it is either dead or a 1354 // loop backedge. Loop backedges are special. 1355 TopDownPathCount += Other.TopDownPathCount; 1356 1357 // For each entry in the other set, if our set has an entry with the same key, 1358 // merge the entries. Otherwise, copy the entry and merge it with an empty 1359 // entry. 1360 for (ptr_const_iterator MI = Other.top_down_ptr_begin(), 1361 ME = Other.top_down_ptr_end(); MI != ME; ++MI) { 1362 std::pair<ptr_iterator, bool> Pair = PerPtrTopDown.insert(*MI); 1363 Pair.first->second.Merge(Pair.second ? PtrState() : MI->second, 1364 /*TopDown=*/true); 1365 } 1366 1367 // For each entry in our set, if the other set doens't have an entry with the 1368 // same key, force it to merge with an empty entry. 1369 for (ptr_iterator MI = top_down_ptr_begin(), 1370 ME = top_down_ptr_end(); MI != ME; ++MI) 1371 if (Other.PerPtrTopDown.find(MI->first) == Other.PerPtrTopDown.end()) 1372 MI->second.Merge(PtrState(), /*TopDown=*/true); 1373 } 1374 1375 /// MergeSucc - The bottom-up traversal uses this to merge information about 1376 /// successors to form the initial state for a new block. 1377 void BBState::MergeSucc(const BBState &Other) { 1378 // Other.BottomUpPathCount can be 0, in which case it is either dead or a 1379 // loop backedge. Loop backedges are special. 1380 BottomUpPathCount += Other.BottomUpPathCount; 1381 1382 // For each entry in the other set, if our set has an entry with the 1383 // same key, merge the entries. Otherwise, copy the entry and merge 1384 // it with an empty entry. 1385 for (ptr_const_iterator MI = Other.bottom_up_ptr_begin(), 1386 ME = Other.bottom_up_ptr_end(); MI != ME; ++MI) { 1387 std::pair<ptr_iterator, bool> Pair = PerPtrBottomUp.insert(*MI); 1388 Pair.first->second.Merge(Pair.second ? PtrState() : MI->second, 1389 /*TopDown=*/false); 1390 } 1391 1392 // For each entry in our set, if the other set doens't have an entry 1393 // with the same key, force it to merge with an empty entry. 1394 for (ptr_iterator MI = bottom_up_ptr_begin(), 1395 ME = bottom_up_ptr_end(); MI != ME; ++MI) 1396 if (Other.PerPtrBottomUp.find(MI->first) == Other.PerPtrBottomUp.end()) 1397 MI->second.Merge(PtrState(), /*TopDown=*/false); 1398 } 1399 1400 namespace { 1401 /// ObjCARCOpt - The main ARC optimization pass. 1402 class ObjCARCOpt : public FunctionPass { 1403 bool Changed; 1404 ProvenanceAnalysis PA; 1405 1406 /// Run - A flag indicating whether this optimization pass should run. 1407 bool Run; 1408 1409 /// RetainFunc, RelaseFunc - Declarations for objc_retain, 1410 /// objc_retainBlock, and objc_release. 1411 Function *RetainFunc, *RetainBlockFunc, *RetainRVFunc, *ReleaseFunc; 1412 1413 /// RetainRVCallee, etc. - Declarations for ObjC runtime 1414 /// functions, for use in creating calls to them. These are initialized 1415 /// lazily to avoid cluttering up the Module with unused declarations. 1416 Constant *RetainRVCallee, *AutoreleaseRVCallee, *ReleaseCallee, 1417 *RetainCallee, *AutoreleaseCallee; 1418 1419 /// UsedInThisFunciton - Flags which determine whether each of the 1420 /// interesting runtine functions is in fact used in the current function. 1421 unsigned UsedInThisFunction; 1422 1423 /// ImpreciseReleaseMDKind - The Metadata Kind for clang.imprecise_release 1424 /// metadata. 1425 unsigned ImpreciseReleaseMDKind; 1426 1427 Constant *getRetainRVCallee(Module *M); 1428 Constant *getAutoreleaseRVCallee(Module *M); 1429 Constant *getReleaseCallee(Module *M); 1430 Constant *getRetainCallee(Module *M); 1431 Constant *getAutoreleaseCallee(Module *M); 1432 1433 void OptimizeRetainCall(Function &F, Instruction *Retain); 1434 bool OptimizeRetainRVCall(Function &F, Instruction *RetainRV); 1435 void OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV); 1436 void OptimizeIndividualCalls(Function &F); 1437 1438 void CheckForCFGHazards(const BasicBlock *BB, 1439 DenseMap<const BasicBlock *, BBState> &BBStates, 1440 BBState &MyStates) const; 1441 bool VisitBottomUp(BasicBlock *BB, 1442 DenseMap<const BasicBlock *, BBState> &BBStates, 1443 MapVector<Value *, RRInfo> &Retains); 1444 bool VisitTopDown(BasicBlock *BB, 1445 DenseMap<const BasicBlock *, BBState> &BBStates, 1446 DenseMap<Value *, RRInfo> &Releases); 1447 bool Visit(Function &F, 1448 DenseMap<const BasicBlock *, BBState> &BBStates, 1449 MapVector<Value *, RRInfo> &Retains, 1450 DenseMap<Value *, RRInfo> &Releases); 1451 1452 void MoveCalls(Value *Arg, RRInfo &RetainsToMove, RRInfo &ReleasesToMove, 1453 MapVector<Value *, RRInfo> &Retains, 1454 DenseMap<Value *, RRInfo> &Releases, 1455 SmallVectorImpl<Instruction *> &DeadInsts); 1456 1457 bool PerformCodePlacement(DenseMap<const BasicBlock *, BBState> &BBStates, 1458 MapVector<Value *, RRInfo> &Retains, 1459 DenseMap<Value *, RRInfo> &Releases); 1460 1461 void OptimizeWeakCalls(Function &F); 1462 1463 bool OptimizeSequences(Function &F); 1464 1465 void OptimizeReturns(Function &F); 1466 1467 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 1468 virtual bool doInitialization(Module &M); 1469 virtual bool runOnFunction(Function &F); 1470 virtual void releaseMemory(); 1471 1472 public: 1473 static char ID; 1474 ObjCARCOpt() : FunctionPass(ID) { 1475 initializeObjCARCOptPass(*PassRegistry::getPassRegistry()); 1476 } 1477 }; 1478 } 1479 1480 char ObjCARCOpt::ID = 0; 1481 INITIALIZE_PASS_BEGIN(ObjCARCOpt, 1482 "objc-arc", "ObjC ARC optimization", false, false) 1483 INITIALIZE_PASS_DEPENDENCY(ObjCARCAliasAnalysis) 1484 INITIALIZE_PASS_END(ObjCARCOpt, 1485 "objc-arc", "ObjC ARC optimization", false, false) 1486 1487 Pass *llvm::createObjCARCOptPass() { 1488 return new ObjCARCOpt(); 1489 } 1490 1491 void ObjCARCOpt::getAnalysisUsage(AnalysisUsage &AU) const { 1492 AU.addRequired<ObjCARCAliasAnalysis>(); 1493 AU.addRequired<AliasAnalysis>(); 1494 // ARC optimization doesn't currently split critical edges. 1495 AU.setPreservesCFG(); 1496 } 1497 1498 Constant *ObjCARCOpt::getRetainRVCallee(Module *M) { 1499 if (!RetainRVCallee) { 1500 LLVMContext &C = M->getContext(); 1501 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 1502 std::vector<Type *> Params; 1503 Params.push_back(I8X); 1504 FunctionType *FTy = 1505 FunctionType::get(I8X, Params, /*isVarArg=*/false); 1506 AttrListPtr Attributes; 1507 Attributes.addAttr(~0u, Attribute::NoUnwind); 1508 RetainRVCallee = 1509 M->getOrInsertFunction("objc_retainAutoreleasedReturnValue", FTy, 1510 Attributes); 1511 } 1512 return RetainRVCallee; 1513 } 1514 1515 Constant *ObjCARCOpt::getAutoreleaseRVCallee(Module *M) { 1516 if (!AutoreleaseRVCallee) { 1517 LLVMContext &C = M->getContext(); 1518 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 1519 std::vector<Type *> Params; 1520 Params.push_back(I8X); 1521 FunctionType *FTy = 1522 FunctionType::get(I8X, Params, /*isVarArg=*/false); 1523 AttrListPtr Attributes; 1524 Attributes.addAttr(~0u, Attribute::NoUnwind); 1525 AutoreleaseRVCallee = 1526 M->getOrInsertFunction("objc_autoreleaseReturnValue", FTy, 1527 Attributes); 1528 } 1529 return AutoreleaseRVCallee; 1530 } 1531 1532 Constant *ObjCARCOpt::getReleaseCallee(Module *M) { 1533 if (!ReleaseCallee) { 1534 LLVMContext &C = M->getContext(); 1535 std::vector<Type *> Params; 1536 Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C))); 1537 AttrListPtr Attributes; 1538 Attributes.addAttr(~0u, Attribute::NoUnwind); 1539 ReleaseCallee = 1540 M->getOrInsertFunction( 1541 "objc_release", 1542 FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false), 1543 Attributes); 1544 } 1545 return ReleaseCallee; 1546 } 1547 1548 Constant *ObjCARCOpt::getRetainCallee(Module *M) { 1549 if (!RetainCallee) { 1550 LLVMContext &C = M->getContext(); 1551 std::vector<Type *> Params; 1552 Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C))); 1553 AttrListPtr Attributes; 1554 Attributes.addAttr(~0u, Attribute::NoUnwind); 1555 RetainCallee = 1556 M->getOrInsertFunction( 1557 "objc_retain", 1558 FunctionType::get(Params[0], Params, /*isVarArg=*/false), 1559 Attributes); 1560 } 1561 return RetainCallee; 1562 } 1563 1564 Constant *ObjCARCOpt::getAutoreleaseCallee(Module *M) { 1565 if (!AutoreleaseCallee) { 1566 LLVMContext &C = M->getContext(); 1567 std::vector<Type *> Params; 1568 Params.push_back(PointerType::getUnqual(Type::getInt8Ty(C))); 1569 AttrListPtr Attributes; 1570 Attributes.addAttr(~0u, Attribute::NoUnwind); 1571 AutoreleaseCallee = 1572 M->getOrInsertFunction( 1573 "objc_autorelease", 1574 FunctionType::get(Params[0], Params, /*isVarArg=*/false), 1575 Attributes); 1576 } 1577 return AutoreleaseCallee; 1578 } 1579 1580 /// CanAlterRefCount - Test whether the given instruction can result in a 1581 /// reference count modification (positive or negative) for the pointer's 1582 /// object. 1583 static bool 1584 CanAlterRefCount(const Instruction *Inst, const Value *Ptr, 1585 ProvenanceAnalysis &PA, InstructionClass Class) { 1586 switch (Class) { 1587 case IC_Autorelease: 1588 case IC_AutoreleaseRV: 1589 case IC_User: 1590 // These operations never directly modify a reference count. 1591 return false; 1592 default: break; 1593 } 1594 1595 ImmutableCallSite CS = static_cast<const Value *>(Inst); 1596 assert(CS && "Only calls can alter reference counts!"); 1597 1598 // See if AliasAnalysis can help us with the call. 1599 AliasAnalysis::ModRefBehavior MRB = PA.getAA()->getModRefBehavior(CS); 1600 if (AliasAnalysis::onlyReadsMemory(MRB)) 1601 return false; 1602 if (AliasAnalysis::onlyAccessesArgPointees(MRB)) { 1603 for (ImmutableCallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); 1604 I != E; ++I) { 1605 const Value *Op = *I; 1606 if (IsPotentialUse(Op) && PA.related(Ptr, Op)) 1607 return true; 1608 } 1609 return false; 1610 } 1611 1612 // Assume the worst. 1613 return true; 1614 } 1615 1616 /// CanUse - Test whether the given instruction can "use" the given pointer's 1617 /// object in a way that requires the reference count to be positive. 1618 static bool 1619 CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA, 1620 InstructionClass Class) { 1621 // IC_Call operations (as opposed to IC_CallOrUser) never "use" objc pointers. 1622 if (Class == IC_Call) 1623 return false; 1624 1625 // Consider various instructions which may have pointer arguments which are 1626 // not "uses". 1627 if (const ICmpInst *ICI = dyn_cast<ICmpInst>(Inst)) { 1628 // Comparing a pointer with null, or any other constant, isn't really a use, 1629 // because we don't care what the pointer points to, or about the values 1630 // of any other dynamic reference-counted pointers. 1631 if (!IsPotentialUse(ICI->getOperand(1))) 1632 return false; 1633 } else if (ImmutableCallSite CS = static_cast<const Value *>(Inst)) { 1634 // For calls, just check the arguments (and not the callee operand). 1635 for (ImmutableCallSite::arg_iterator OI = CS.arg_begin(), 1636 OE = CS.arg_end(); OI != OE; ++OI) { 1637 const Value *Op = *OI; 1638 if (IsPotentialUse(Op) && PA.related(Ptr, Op)) 1639 return true; 1640 } 1641 return false; 1642 } else if (const StoreInst *SI = dyn_cast<StoreInst>(Inst)) { 1643 // Special-case stores, because we don't care about the stored value, just 1644 // the store address. 1645 const Value *Op = GetUnderlyingObjCPtr(SI->getPointerOperand()); 1646 // If we can't tell what the underlying object was, assume there is a 1647 // dependence. 1648 return IsPotentialUse(Op) && PA.related(Op, Ptr); 1649 } 1650 1651 // Check each operand for a match. 1652 for (User::const_op_iterator OI = Inst->op_begin(), OE = Inst->op_end(); 1653 OI != OE; ++OI) { 1654 const Value *Op = *OI; 1655 if (IsPotentialUse(Op) && PA.related(Ptr, Op)) 1656 return true; 1657 } 1658 return false; 1659 } 1660 1661 /// CanInterruptRV - Test whether the given instruction can autorelease 1662 /// any pointer or cause an autoreleasepool pop. 1663 static bool 1664 CanInterruptRV(InstructionClass Class) { 1665 switch (Class) { 1666 case IC_AutoreleasepoolPop: 1667 case IC_CallOrUser: 1668 case IC_Call: 1669 case IC_Autorelease: 1670 case IC_AutoreleaseRV: 1671 case IC_FusedRetainAutorelease: 1672 case IC_FusedRetainAutoreleaseRV: 1673 return true; 1674 default: 1675 return false; 1676 } 1677 } 1678 1679 namespace { 1680 /// DependenceKind - There are several kinds of dependence-like concepts in 1681 /// use here. 1682 enum DependenceKind { 1683 NeedsPositiveRetainCount, 1684 CanChangeRetainCount, 1685 RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease. 1686 RetainAutoreleaseRVDep, ///< Blocks objc_retainAutoreleaseReturnValue. 1687 RetainRVDep ///< Blocks objc_retainAutoreleasedReturnValue. 1688 }; 1689 } 1690 1691 /// Depends - Test if there can be dependencies on Inst through Arg. This 1692 /// function only tests dependencies relevant for removing pairs of calls. 1693 static bool 1694 Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg, 1695 ProvenanceAnalysis &PA) { 1696 // If we've reached the definition of Arg, stop. 1697 if (Inst == Arg) 1698 return true; 1699 1700 switch (Flavor) { 1701 case NeedsPositiveRetainCount: { 1702 InstructionClass Class = GetInstructionClass(Inst); 1703 switch (Class) { 1704 case IC_AutoreleasepoolPop: 1705 case IC_AutoreleasepoolPush: 1706 case IC_None: 1707 return false; 1708 default: 1709 return CanUse(Inst, Arg, PA, Class); 1710 } 1711 } 1712 1713 case CanChangeRetainCount: { 1714 InstructionClass Class = GetInstructionClass(Inst); 1715 switch (Class) { 1716 case IC_AutoreleasepoolPop: 1717 // Conservatively assume this can decrement any count. 1718 return true; 1719 case IC_AutoreleasepoolPush: 1720 case IC_None: 1721 return false; 1722 default: 1723 return CanAlterRefCount(Inst, Arg, PA, Class); 1724 } 1725 } 1726 1727 case RetainAutoreleaseDep: 1728 switch (GetBasicInstructionClass(Inst)) { 1729 case IC_AutoreleasepoolPop: 1730 // Don't merge an objc_autorelease with an objc_retain inside a different 1731 // autoreleasepool scope. 1732 return true; 1733 case IC_Retain: 1734 case IC_RetainRV: 1735 // Check for a retain of the same pointer for merging. 1736 return GetObjCArg(Inst) == Arg; 1737 default: 1738 // Nothing else matters for objc_retainAutorelease formation. 1739 return false; 1740 } 1741 break; 1742 1743 case RetainAutoreleaseRVDep: { 1744 InstructionClass Class = GetBasicInstructionClass(Inst); 1745 switch (Class) { 1746 case IC_Retain: 1747 case IC_RetainRV: 1748 // Check for a retain of the same pointer for merging. 1749 return GetObjCArg(Inst) == Arg; 1750 default: 1751 // Anything that can autorelease interrupts 1752 // retainAutoreleaseReturnValue formation. 1753 return CanInterruptRV(Class); 1754 } 1755 break; 1756 } 1757 1758 case RetainRVDep: 1759 return CanInterruptRV(GetBasicInstructionClass(Inst)); 1760 } 1761 1762 llvm_unreachable("Invalid dependence flavor"); 1763 return true; 1764 } 1765 1766 /// FindDependencies - Walk up the CFG from StartPos (which is in StartBB) and 1767 /// find local and non-local dependencies on Arg. 1768 /// TODO: Cache results? 1769 static void 1770 FindDependencies(DependenceKind Flavor, 1771 const Value *Arg, 1772 BasicBlock *StartBB, Instruction *StartInst, 1773 SmallPtrSet<Instruction *, 4> &DependingInstructions, 1774 SmallPtrSet<const BasicBlock *, 4> &Visited, 1775 ProvenanceAnalysis &PA) { 1776 BasicBlock::iterator StartPos = StartInst; 1777 1778 SmallVector<std::pair<BasicBlock *, BasicBlock::iterator>, 4> Worklist; 1779 Worklist.push_back(std::make_pair(StartBB, StartPos)); 1780 do { 1781 std::pair<BasicBlock *, BasicBlock::iterator> Pair = 1782 Worklist.pop_back_val(); 1783 BasicBlock *LocalStartBB = Pair.first; 1784 BasicBlock::iterator LocalStartPos = Pair.second; 1785 BasicBlock::iterator StartBBBegin = LocalStartBB->begin(); 1786 for (;;) { 1787 if (LocalStartPos == StartBBBegin) { 1788 pred_iterator PI(LocalStartBB), PE(LocalStartBB, false); 1789 if (PI == PE) 1790 // If we've reached the function entry, produce a null dependence. 1791 DependingInstructions.insert(0); 1792 else 1793 // Add the predecessors to the worklist. 1794 do { 1795 BasicBlock *PredBB = *PI; 1796 if (Visited.insert(PredBB)) 1797 Worklist.push_back(std::make_pair(PredBB, PredBB->end())); 1798 } while (++PI != PE); 1799 break; 1800 } 1801 1802 Instruction *Inst = --LocalStartPos; 1803 if (Depends(Flavor, Inst, Arg, PA)) { 1804 DependingInstructions.insert(Inst); 1805 break; 1806 } 1807 } 1808 } while (!Worklist.empty()); 1809 1810 // Determine whether the original StartBB post-dominates all of the blocks we 1811 // visited. If not, insert a sentinal indicating that most optimizations are 1812 // not safe. 1813 for (SmallPtrSet<const BasicBlock *, 4>::const_iterator I = Visited.begin(), 1814 E = Visited.end(); I != E; ++I) { 1815 const BasicBlock *BB = *I; 1816 if (BB == StartBB) 1817 continue; 1818 const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); 1819 for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI) { 1820 const BasicBlock *Succ = *SI; 1821 if (Succ != StartBB && !Visited.count(Succ)) { 1822 DependingInstructions.insert(reinterpret_cast<Instruction *>(-1)); 1823 return; 1824 } 1825 } 1826 } 1827 } 1828 1829 static bool isNullOrUndef(const Value *V) { 1830 return isa<ConstantPointerNull>(V) || isa<UndefValue>(V); 1831 } 1832 1833 static bool isNoopInstruction(const Instruction *I) { 1834 return isa<BitCastInst>(I) || 1835 (isa<GetElementPtrInst>(I) && 1836 cast<GetElementPtrInst>(I)->hasAllZeroIndices()); 1837 } 1838 1839 /// OptimizeRetainCall - Turn objc_retain into 1840 /// objc_retainAutoreleasedReturnValue if the operand is a return value. 1841 void 1842 ObjCARCOpt::OptimizeRetainCall(Function &F, Instruction *Retain) { 1843 CallSite CS(GetObjCArg(Retain)); 1844 Instruction *Call = CS.getInstruction(); 1845 if (!Call) return; 1846 if (Call->getParent() != Retain->getParent()) return; 1847 1848 // Check that the call is next to the retain. 1849 BasicBlock::iterator I = Call; 1850 ++I; 1851 while (isNoopInstruction(I)) ++I; 1852 if (&*I != Retain) 1853 return; 1854 1855 // Turn it to an objc_retainAutoreleasedReturnValue.. 1856 Changed = true; 1857 ++NumPeeps; 1858 cast<CallInst>(Retain)->setCalledFunction(getRetainRVCallee(F.getParent())); 1859 } 1860 1861 /// OptimizeRetainRVCall - Turn objc_retainAutoreleasedReturnValue into 1862 /// objc_retain if the operand is not a return value. Or, if it can be 1863 /// paired with an objc_autoreleaseReturnValue, delete the pair and 1864 /// return true. 1865 bool 1866 ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) { 1867 // Check for the argument being from an immediately preceding call. 1868 Value *Arg = GetObjCArg(RetainRV); 1869 CallSite CS(Arg); 1870 if (Instruction *Call = CS.getInstruction()) 1871 if (Call->getParent() == RetainRV->getParent()) { 1872 BasicBlock::iterator I = Call; 1873 ++I; 1874 while (isNoopInstruction(I)) ++I; 1875 if (&*I == RetainRV) 1876 return false; 1877 } 1878 1879 // Check for being preceded by an objc_autoreleaseReturnValue on the same 1880 // pointer. In this case, we can delete the pair. 1881 BasicBlock::iterator I = RetainRV, Begin = RetainRV->getParent()->begin(); 1882 if (I != Begin) { 1883 do --I; while (I != Begin && isNoopInstruction(I)); 1884 if (GetBasicInstructionClass(I) == IC_AutoreleaseRV && 1885 GetObjCArg(I) == Arg) { 1886 Changed = true; 1887 ++NumPeeps; 1888 EraseInstruction(I); 1889 EraseInstruction(RetainRV); 1890 return true; 1891 } 1892 } 1893 1894 // Turn it to a plain objc_retain. 1895 Changed = true; 1896 ++NumPeeps; 1897 cast<CallInst>(RetainRV)->setCalledFunction(getRetainCallee(F.getParent())); 1898 return false; 1899 } 1900 1901 /// OptimizeAutoreleaseRVCall - Turn objc_autoreleaseReturnValue into 1902 /// objc_autorelease if the result is not used as a return value. 1903 void 1904 ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV) { 1905 // Check for a return of the pointer value. 1906 const Value *Ptr = GetObjCArg(AutoreleaseRV); 1907 for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end(); 1908 UI != UE; ++UI) { 1909 const User *I = *UI; 1910 if (isa<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV) 1911 return; 1912 } 1913 1914 Changed = true; 1915 ++NumPeeps; 1916 cast<CallInst>(AutoreleaseRV)-> 1917 setCalledFunction(getAutoreleaseCallee(F.getParent())); 1918 } 1919 1920 /// OptimizeIndividualCalls - Visit each call, one at a time, and make 1921 /// simplifications without doing any additional analysis. 1922 void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { 1923 // Reset all the flags in preparation for recomputing them. 1924 UsedInThisFunction = 0; 1925 1926 // Visit all objc_* calls in F. 1927 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) { 1928 Instruction *Inst = &*I++; 1929 InstructionClass Class = GetBasicInstructionClass(Inst); 1930 1931 switch (Class) { 1932 default: break; 1933 1934 // Delete no-op casts. These function calls have special semantics, but 1935 // the semantics are entirely implemented via lowering in the front-end, 1936 // so by the time they reach the optimizer, they are just no-op calls 1937 // which return their argument. 1938 // 1939 // There are gray areas here, as the ability to cast reference-counted 1940 // pointers to raw void* and back allows code to break ARC assumptions, 1941 // however these are currently considered to be unimportant. 1942 case IC_NoopCast: 1943 Changed = true; 1944 ++NumNoops; 1945 EraseInstruction(Inst); 1946 continue; 1947 1948 // If the pointer-to-weak-pointer is null, it's undefined behavior. 1949 case IC_StoreWeak: 1950 case IC_LoadWeak: 1951 case IC_LoadWeakRetained: 1952 case IC_InitWeak: 1953 case IC_DestroyWeak: { 1954 CallInst *CI = cast<CallInst>(Inst); 1955 if (isNullOrUndef(CI->getArgOperand(0))) { 1956 Type *Ty = CI->getArgOperand(0)->getType(); 1957 new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()), 1958 Constant::getNullValue(Ty), 1959 CI); 1960 CI->replaceAllUsesWith(UndefValue::get(CI->getType())); 1961 CI->eraseFromParent(); 1962 continue; 1963 } 1964 break; 1965 } 1966 case IC_CopyWeak: 1967 case IC_MoveWeak: { 1968 CallInst *CI = cast<CallInst>(Inst); 1969 if (isNullOrUndef(CI->getArgOperand(0)) || 1970 isNullOrUndef(CI->getArgOperand(1))) { 1971 Type *Ty = CI->getArgOperand(0)->getType(); 1972 new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()), 1973 Constant::getNullValue(Ty), 1974 CI); 1975 CI->replaceAllUsesWith(UndefValue::get(CI->getType())); 1976 CI->eraseFromParent(); 1977 continue; 1978 } 1979 break; 1980 } 1981 case IC_Retain: 1982 OptimizeRetainCall(F, Inst); 1983 break; 1984 case IC_RetainRV: 1985 if (OptimizeRetainRVCall(F, Inst)) 1986 continue; 1987 break; 1988 case IC_AutoreleaseRV: 1989 OptimizeAutoreleaseRVCall(F, Inst); 1990 break; 1991 } 1992 1993 // objc_autorelease(x) -> objc_release(x) if x is otherwise unused. 1994 if (IsAutorelease(Class) && Inst->use_empty()) { 1995 CallInst *Call = cast<CallInst>(Inst); 1996 const Value *Arg = Call->getArgOperand(0); 1997 Arg = FindSingleUseIdentifiedObject(Arg); 1998 if (Arg) { 1999 Changed = true; 2000 ++NumAutoreleases; 2001 2002 // Create the declaration lazily. 2003 LLVMContext &C = Inst->getContext(); 2004 CallInst *NewCall = 2005 CallInst::Create(getReleaseCallee(F.getParent()), 2006 Call->getArgOperand(0), "", Call); 2007 NewCall->setMetadata(ImpreciseReleaseMDKind, 2008 MDNode::get(C, ArrayRef<Value *>())); 2009 EraseInstruction(Call); 2010 Inst = NewCall; 2011 Class = IC_Release; 2012 } 2013 } 2014 2015 // For functions which can never be passed stack arguments, add 2016 // a tail keyword. 2017 if (IsAlwaysTail(Class)) { 2018 Changed = true; 2019 cast<CallInst>(Inst)->setTailCall(); 2020 } 2021 2022 // Set nounwind as needed. 2023 if (IsNoThrow(Class)) { 2024 Changed = true; 2025 cast<CallInst>(Inst)->setDoesNotThrow(); 2026 } 2027 2028 if (!IsNoopOnNull(Class)) { 2029 UsedInThisFunction |= 1 << Class; 2030 continue; 2031 } 2032 2033 const Value *Arg = GetObjCArg(Inst); 2034 2035 // ARC calls with null are no-ops. Delete them. 2036 if (isNullOrUndef(Arg)) { 2037 Changed = true; 2038 ++NumNoops; 2039 EraseInstruction(Inst); 2040 continue; 2041 } 2042 2043 // Keep track of which of retain, release, autorelease, and retain_block 2044 // are actually present in this function. 2045 UsedInThisFunction |= 1 << Class; 2046 2047 // If Arg is a PHI, and one or more incoming values to the 2048 // PHI are null, and the call is control-equivalent to the PHI, and there 2049 // are no relevant side effects between the PHI and the call, the call 2050 // could be pushed up to just those paths with non-null incoming values. 2051 // For now, don't bother splitting critical edges for this. 2052 SmallVector<std::pair<Instruction *, const Value *>, 4> Worklist; 2053 Worklist.push_back(std::make_pair(Inst, Arg)); 2054 do { 2055 std::pair<Instruction *, const Value *> Pair = Worklist.pop_back_val(); 2056 Inst = Pair.first; 2057 Arg = Pair.second; 2058 2059 const PHINode *PN = dyn_cast<PHINode>(Arg); 2060 if (!PN) continue; 2061 2062 // Determine if the PHI has any null operands, or any incoming 2063 // critical edges. 2064 bool HasNull = false; 2065 bool HasCriticalEdges = false; 2066 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { 2067 Value *Incoming = 2068 StripPointerCastsAndObjCCalls(PN->getIncomingValue(i)); 2069 if (isNullOrUndef(Incoming)) 2070 HasNull = true; 2071 else if (cast<TerminatorInst>(PN->getIncomingBlock(i)->back()) 2072 .getNumSuccessors() != 1) { 2073 HasCriticalEdges = true; 2074 break; 2075 } 2076 } 2077 // If we have null operands and no critical edges, optimize. 2078 if (!HasCriticalEdges && HasNull) { 2079 SmallPtrSet<Instruction *, 4> DependingInstructions; 2080 SmallPtrSet<const BasicBlock *, 4> Visited; 2081 2082 // Check that there is nothing that cares about the reference 2083 // count between the call and the phi. 2084 FindDependencies(NeedsPositiveRetainCount, Arg, 2085 Inst->getParent(), Inst, 2086 DependingInstructions, Visited, PA); 2087 if (DependingInstructions.size() == 1 && 2088 *DependingInstructions.begin() == PN) { 2089 Changed = true; 2090 ++NumPartialNoops; 2091 // Clone the call into each predecessor that has a non-null value. 2092 CallInst *CInst = cast<CallInst>(Inst); 2093 Type *ParamTy = CInst->getArgOperand(0)->getType(); 2094 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { 2095 Value *Incoming = 2096 StripPointerCastsAndObjCCalls(PN->getIncomingValue(i)); 2097 if (!isNullOrUndef(Incoming)) { 2098 CallInst *Clone = cast<CallInst>(CInst->clone()); 2099 Value *Op = PN->getIncomingValue(i); 2100 Instruction *InsertPos = &PN->getIncomingBlock(i)->back(); 2101 if (Op->getType() != ParamTy) 2102 Op = new BitCastInst(Op, ParamTy, "", InsertPos); 2103 Clone->setArgOperand(0, Op); 2104 Clone->insertBefore(InsertPos); 2105 Worklist.push_back(std::make_pair(Clone, Incoming)); 2106 } 2107 } 2108 // Erase the original call. 2109 EraseInstruction(CInst); 2110 continue; 2111 } 2112 } 2113 } while (!Worklist.empty()); 2114 } 2115 } 2116 2117 /// CheckForCFGHazards - Check for critical edges, loop boundaries, irreducible 2118 /// control flow, or other CFG structures where moving code across the edge 2119 /// would result in it being executed more. 2120 void 2121 ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB, 2122 DenseMap<const BasicBlock *, BBState> &BBStates, 2123 BBState &MyStates) const { 2124 // If any top-down local-use or possible-dec has a succ which is earlier in 2125 // the sequence, forget it. 2126 for (BBState::ptr_const_iterator I = MyStates.top_down_ptr_begin(), 2127 E = MyStates.top_down_ptr_end(); I != E; ++I) 2128 switch (I->second.GetSeq()) { 2129 default: break; 2130 case S_Use: { 2131 const Value *Arg = I->first; 2132 const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); 2133 bool SomeSuccHasSame = false; 2134 bool AllSuccsHaveSame = true; 2135 for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI) 2136 switch (BBStates[*SI].getPtrBottomUpState(Arg).GetSeq()) { 2137 case S_None: 2138 case S_CanRelease: 2139 MyStates.getPtrTopDownState(Arg).ClearSequenceProgress(); 2140 SomeSuccHasSame = false; 2141 break; 2142 case S_Use: 2143 SomeSuccHasSame = true; 2144 break; 2145 case S_Stop: 2146 case S_Release: 2147 case S_MovableRelease: 2148 AllSuccsHaveSame = false; 2149 break; 2150 case S_Retain: 2151 llvm_unreachable("bottom-up pointer in retain state!"); 2152 } 2153 // If the state at the other end of any of the successor edges 2154 // matches the current state, require all edges to match. This 2155 // guards against loops in the middle of a sequence. 2156 if (SomeSuccHasSame && !AllSuccsHaveSame) 2157 MyStates.getPtrTopDownState(Arg).ClearSequenceProgress(); 2158 } 2159 case S_CanRelease: { 2160 const Value *Arg = I->first; 2161 const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); 2162 bool SomeSuccHasSame = false; 2163 bool AllSuccsHaveSame = true; 2164 for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI) 2165 switch (BBStates[*SI].getPtrBottomUpState(Arg).GetSeq()) { 2166 case S_None: 2167 MyStates.getPtrTopDownState(Arg).ClearSequenceProgress(); 2168 SomeSuccHasSame = false; 2169 break; 2170 case S_CanRelease: 2171 SomeSuccHasSame = true; 2172 break; 2173 case S_Stop: 2174 case S_Release: 2175 case S_MovableRelease: 2176 case S_Use: 2177 AllSuccsHaveSame = false; 2178 break; 2179 case S_Retain: 2180 llvm_unreachable("bottom-up pointer in retain state!"); 2181 } 2182 // If the state at the other end of any of the successor edges 2183 // matches the current state, require all edges to match. This 2184 // guards against loops in the middle of a sequence. 2185 if (SomeSuccHasSame && !AllSuccsHaveSame) 2186 MyStates.getPtrTopDownState(Arg).ClearSequenceProgress(); 2187 } 2188 } 2189 } 2190 2191 bool 2192 ObjCARCOpt::VisitBottomUp(BasicBlock *BB, 2193 DenseMap<const BasicBlock *, BBState> &BBStates, 2194 MapVector<Value *, RRInfo> &Retains) { 2195 bool NestingDetected = false; 2196 BBState &MyStates = BBStates[BB]; 2197 2198 // Merge the states from each successor to compute the initial state 2199 // for the current block. 2200 const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); 2201 succ_const_iterator SI(TI), SE(TI, false); 2202 if (SI == SE) 2203 MyStates.SetAsExit(); 2204 else 2205 do { 2206 const BasicBlock *Succ = *SI++; 2207 if (Succ == BB) 2208 continue; 2209 DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Succ); 2210 if (I == BBStates.end()) 2211 continue; 2212 MyStates.InitFromSucc(I->second); 2213 while (SI != SE) { 2214 Succ = *SI++; 2215 if (Succ != BB) { 2216 I = BBStates.find(Succ); 2217 if (I != BBStates.end()) 2218 MyStates.MergeSucc(I->second); 2219 } 2220 } 2221 break; 2222 } while (SI != SE); 2223 2224 // Visit all the instructions, bottom-up. 2225 for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; --I) { 2226 Instruction *Inst = llvm::prior(I); 2227 InstructionClass Class = GetInstructionClass(Inst); 2228 const Value *Arg = 0; 2229 2230 switch (Class) { 2231 case IC_Release: { 2232 Arg = GetObjCArg(Inst); 2233 2234 PtrState &S = MyStates.getPtrBottomUpState(Arg); 2235 2236 // If we see two releases in a row on the same pointer. If so, make 2237 // a note, and we'll cicle back to revisit it after we've 2238 // hopefully eliminated the second release, which may allow us to 2239 // eliminate the first release too. 2240 // Theoretically we could implement removal of nested retain+release 2241 // pairs by making PtrState hold a stack of states, but this is 2242 // simple and avoids adding overhead for the non-nested case. 2243 if (S.GetSeq() == S_Release || S.GetSeq() == S_MovableRelease) 2244 NestingDetected = true; 2245 2246 S.SetSeqToRelease(Inst->getMetadata(ImpreciseReleaseMDKind)); 2247 S.RRI.clear(); 2248 S.RRI.KnownIncremented = S.IsKnownIncremented(); 2249 S.RRI.IsTailCallRelease = cast<CallInst>(Inst)->isTailCall(); 2250 S.RRI.Calls.insert(Inst); 2251 2252 S.IncrementRefCount(); 2253 break; 2254 } 2255 case IC_RetainBlock: 2256 case IC_Retain: 2257 case IC_RetainRV: { 2258 Arg = GetObjCArg(Inst); 2259 2260 PtrState &S = MyStates.getPtrBottomUpState(Arg); 2261 S.DecrementRefCount(); 2262 2263 switch (S.GetSeq()) { 2264 case S_Stop: 2265 case S_Release: 2266 case S_MovableRelease: 2267 case S_Use: 2268 S.RRI.ReverseInsertPts.clear(); 2269 // FALL THROUGH 2270 case S_CanRelease: 2271 // Don't do retain+release tracking for IC_RetainRV, because it's 2272 // better to let it remain as the first instruction after a call. 2273 if (Class != IC_RetainRV) { 2274 S.RRI.IsRetainBlock = Class == IC_RetainBlock; 2275 Retains[Inst] = S.RRI; 2276 } 2277 S.ClearSequenceProgress(); 2278 break; 2279 case S_None: 2280 break; 2281 case S_Retain: 2282 llvm_unreachable("bottom-up pointer in retain state!"); 2283 } 2284 break; 2285 } 2286 case IC_AutoreleasepoolPop: 2287 // Conservatively, clear MyStates for all known pointers. 2288 MyStates.clearBottomUpPointers(); 2289 continue; 2290 case IC_AutoreleasepoolPush: 2291 case IC_None: 2292 // These are irrelevant. 2293 continue; 2294 default: 2295 break; 2296 } 2297 2298 // Consider any other possible effects of this instruction on each 2299 // pointer being tracked. 2300 for (BBState::ptr_iterator MI = MyStates.bottom_up_ptr_begin(), 2301 ME = MyStates.bottom_up_ptr_end(); MI != ME; ++MI) { 2302 const Value *Ptr = MI->first; 2303 if (Ptr == Arg) 2304 continue; // Handled above. 2305 PtrState &S = MI->second; 2306 Sequence Seq = S.GetSeq(); 2307 2308 // Check for possible retains and releases. 2309 if (CanAlterRefCount(Inst, Ptr, PA, Class)) { 2310 // Check for a retain (we're going bottom-up here). 2311 S.DecrementRefCount(); 2312 2313 // Check for a release. 2314 if (!IsRetain(Class) && Class != IC_RetainBlock) 2315 switch (Seq) { 2316 case S_Use: 2317 S.SetSeq(S_CanRelease); 2318 continue; 2319 case S_CanRelease: 2320 case S_Release: 2321 case S_MovableRelease: 2322 case S_Stop: 2323 case S_None: 2324 break; 2325 case S_Retain: 2326 llvm_unreachable("bottom-up pointer in retain state!"); 2327 } 2328 } 2329 2330 // Check for possible direct uses. 2331 switch (Seq) { 2332 case S_Release: 2333 case S_MovableRelease: 2334 if (CanUse(Inst, Ptr, PA, Class)) { 2335 S.RRI.ReverseInsertPts.clear(); 2336 S.RRI.ReverseInsertPts.insert(Inst); 2337 S.SetSeq(S_Use); 2338 } else if (Seq == S_Release && 2339 (Class == IC_User || Class == IC_CallOrUser)) { 2340 // Non-movable releases depend on any possible objc pointer use. 2341 S.SetSeq(S_Stop); 2342 S.RRI.ReverseInsertPts.clear(); 2343 S.RRI.ReverseInsertPts.insert(Inst); 2344 } 2345 break; 2346 case S_Stop: 2347 if (CanUse(Inst, Ptr, PA, Class)) 2348 S.SetSeq(S_Use); 2349 break; 2350 case S_CanRelease: 2351 case S_Use: 2352 case S_None: 2353 break; 2354 case S_Retain: 2355 llvm_unreachable("bottom-up pointer in retain state!"); 2356 } 2357 } 2358 } 2359 2360 return NestingDetected; 2361 } 2362 2363 bool 2364 ObjCARCOpt::VisitTopDown(BasicBlock *BB, 2365 DenseMap<const BasicBlock *, BBState> &BBStates, 2366 DenseMap<Value *, RRInfo> &Releases) { 2367 bool NestingDetected = false; 2368 BBState &MyStates = BBStates[BB]; 2369 2370 // Merge the states from each predecessor to compute the initial state 2371 // for the current block. 2372 const_pred_iterator PI(BB), PE(BB, false); 2373 if (PI == PE) 2374 MyStates.SetAsEntry(); 2375 else 2376 do { 2377 const BasicBlock *Pred = *PI++; 2378 if (Pred == BB) 2379 continue; 2380 DenseMap<const BasicBlock *, BBState>::iterator I = BBStates.find(Pred); 2381 if (I == BBStates.end()) 2382 continue; 2383 MyStates.InitFromPred(I->second); 2384 while (PI != PE) { 2385 Pred = *PI++; 2386 if (Pred != BB) { 2387 I = BBStates.find(Pred); 2388 if (I != BBStates.end()) 2389 MyStates.MergePred(I->second); 2390 } 2391 } 2392 break; 2393 } while (PI != PE); 2394 2395 // Visit all the instructions, top-down. 2396 for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { 2397 Instruction *Inst = I; 2398 InstructionClass Class = GetInstructionClass(Inst); 2399 const Value *Arg = 0; 2400 2401 switch (Class) { 2402 case IC_RetainBlock: 2403 case IC_Retain: 2404 case IC_RetainRV: { 2405 Arg = GetObjCArg(Inst); 2406 2407 PtrState &S = MyStates.getPtrTopDownState(Arg); 2408 2409 // Don't do retain+release tracking for IC_RetainRV, because it's 2410 // better to let it remain as the first instruction after a call. 2411 if (Class != IC_RetainRV) { 2412 // If we see two retains in a row on the same pointer. If so, make 2413 // a note, and we'll cicle back to revisit it after we've 2414 // hopefully eliminated the second retain, which may allow us to 2415 // eliminate the first retain too. 2416 // Theoretically we could implement removal of nested retain+release 2417 // pairs by making PtrState hold a stack of states, but this is 2418 // simple and avoids adding overhead for the non-nested case. 2419 if (S.GetSeq() == S_Retain) 2420 NestingDetected = true; 2421 2422 S.SetSeq(S_Retain); 2423 S.RRI.clear(); 2424 S.RRI.IsRetainBlock = Class == IC_RetainBlock; 2425 S.RRI.KnownIncremented = S.IsKnownIncremented(); 2426 S.RRI.Calls.insert(Inst); 2427 } 2428 2429 S.IncrementRefCount(); 2430 break; 2431 } 2432 case IC_Release: { 2433 Arg = GetObjCArg(Inst); 2434 2435 PtrState &S = MyStates.getPtrTopDownState(Arg); 2436 S.DecrementRefCount(); 2437 2438 switch (S.GetSeq()) { 2439 case S_Retain: 2440 case S_CanRelease: 2441 S.RRI.ReverseInsertPts.clear(); 2442 // FALL THROUGH 2443 case S_Use: 2444 S.RRI.ReleaseMetadata = Inst->getMetadata(ImpreciseReleaseMDKind); 2445 S.RRI.IsTailCallRelease = cast<CallInst>(Inst)->isTailCall(); 2446 Releases[Inst] = S.RRI; 2447 S.ClearSequenceProgress(); 2448 break; 2449 case S_None: 2450 break; 2451 case S_Stop: 2452 case S_Release: 2453 case S_MovableRelease: 2454 llvm_unreachable("top-down pointer in release state!"); 2455 } 2456 break; 2457 } 2458 case IC_AutoreleasepoolPop: 2459 // Conservatively, clear MyStates for all known pointers. 2460 MyStates.clearTopDownPointers(); 2461 continue; 2462 case IC_AutoreleasepoolPush: 2463 case IC_None: 2464 // These are irrelevant. 2465 continue; 2466 default: 2467 break; 2468 } 2469 2470 // Consider any other possible effects of this instruction on each 2471 // pointer being tracked. 2472 for (BBState::ptr_iterator MI = MyStates.top_down_ptr_begin(), 2473 ME = MyStates.top_down_ptr_end(); MI != ME; ++MI) { 2474 const Value *Ptr = MI->first; 2475 if (Ptr == Arg) 2476 continue; // Handled above. 2477 PtrState &S = MI->second; 2478 Sequence Seq = S.GetSeq(); 2479 2480 // Check for possible releases. 2481 if (!IsRetain(Class) && Class != IC_RetainBlock && 2482 CanAlterRefCount(Inst, Ptr, PA, Class)) { 2483 // Check for a release. 2484 S.DecrementRefCount(); 2485 2486 // Check for a release. 2487 switch (Seq) { 2488 case S_Retain: 2489 S.SetSeq(S_CanRelease); 2490 S.RRI.ReverseInsertPts.clear(); 2491 S.RRI.ReverseInsertPts.insert(Inst); 2492 2493 // One call can't cause a transition from S_Retain to S_CanRelease 2494 // and S_CanRelease to S_Use. If we've made the first transition, 2495 // we're done. 2496 continue; 2497 case S_Use: 2498 case S_CanRelease: 2499 case S_None: 2500 break; 2501 case S_Stop: 2502 case S_Release: 2503 case S_MovableRelease: 2504 llvm_unreachable("top-down pointer in release state!"); 2505 } 2506 } 2507 2508 // Check for possible direct uses. 2509 switch (Seq) { 2510 case S_CanRelease: 2511 if (CanUse(Inst, Ptr, PA, Class)) 2512 S.SetSeq(S_Use); 2513 break; 2514 case S_Use: 2515 case S_Retain: 2516 case S_None: 2517 break; 2518 case S_Stop: 2519 case S_Release: 2520 case S_MovableRelease: 2521 llvm_unreachable("top-down pointer in release state!"); 2522 } 2523 } 2524 } 2525 2526 CheckForCFGHazards(BB, BBStates, MyStates); 2527 return NestingDetected; 2528 } 2529 2530 // Visit - Visit the function both top-down and bottom-up. 2531 bool 2532 ObjCARCOpt::Visit(Function &F, 2533 DenseMap<const BasicBlock *, BBState> &BBStates, 2534 MapVector<Value *, RRInfo> &Retains, 2535 DenseMap<Value *, RRInfo> &Releases) { 2536 // Use postorder for bottom-up, and reverse-postorder for top-down, because we 2537 // magically know that loops will be well behaved, i.e. they won't repeatedly 2538 // call retain on a single pointer without doing a release. 2539 bool BottomUpNestingDetected = false; 2540 SmallVector<BasicBlock *, 8> PostOrder; 2541 for (po_iterator<Function *> I = po_begin(&F), E = po_end(&F); I != E; ++I) { 2542 BasicBlock *BB = *I; 2543 PostOrder.push_back(BB); 2544 2545 BottomUpNestingDetected |= VisitBottomUp(BB, BBStates, Retains); 2546 } 2547 2548 // Iterate through the post-order in reverse order, achieving a 2549 // reverse-postorder traversal. We don't use the ReversePostOrderTraversal 2550 // class here because it works by computing its own full postorder iteration, 2551 // recording the sequence, and playing it back in reverse. Since we're already 2552 // doing a full iteration above, we can just record the sequence manually and 2553 // avoid the cost of having ReversePostOrderTraversal compute it. 2554 bool TopDownNestingDetected = false; 2555 for (SmallVectorImpl<BasicBlock *>::const_reverse_iterator 2556 RI = PostOrder.rbegin(), RE = PostOrder.rend(); RI != RE; ++RI) 2557 TopDownNestingDetected |= VisitTopDown(*RI, BBStates, Releases); 2558 2559 return TopDownNestingDetected && BottomUpNestingDetected; 2560 } 2561 2562 /// MoveCalls - Move the calls in RetainsToMove and ReleasesToMove. 2563 void ObjCARCOpt::MoveCalls(Value *Arg, 2564 RRInfo &RetainsToMove, 2565 RRInfo &ReleasesToMove, 2566 MapVector<Value *, RRInfo> &Retains, 2567 DenseMap<Value *, RRInfo> &Releases, 2568 SmallVectorImpl<Instruction *> &DeadInsts) { 2569 Type *ArgTy = Arg->getType(); 2570 Type *ParamTy = 2571 (RetainRVFunc ? RetainRVFunc : 2572 RetainFunc ? RetainFunc : 2573 RetainBlockFunc)->arg_begin()->getType(); 2574 2575 // Insert the new retain and release calls. 2576 for (SmallPtrSet<Instruction *, 2>::const_iterator 2577 PI = ReleasesToMove.ReverseInsertPts.begin(), 2578 PE = ReleasesToMove.ReverseInsertPts.end(); PI != PE; ++PI) { 2579 Instruction *InsertPt = *PI; 2580 Value *MyArg = ArgTy == ParamTy ? Arg : 2581 new BitCastInst(Arg, ParamTy, "", InsertPt); 2582 CallInst *Call = 2583 CallInst::Create(RetainsToMove.IsRetainBlock ? 2584 RetainBlockFunc : RetainFunc, 2585 MyArg, "", InsertPt); 2586 Call->setDoesNotThrow(); 2587 if (!RetainsToMove.IsRetainBlock) 2588 Call->setTailCall(); 2589 } 2590 for (SmallPtrSet<Instruction *, 2>::const_iterator 2591 PI = RetainsToMove.ReverseInsertPts.begin(), 2592 PE = RetainsToMove.ReverseInsertPts.end(); PI != PE; ++PI) { 2593 Instruction *LastUse = *PI; 2594 Instruction *InsertPts[] = { 0, 0, 0 }; 2595 if (InvokeInst *II = dyn_cast<InvokeInst>(LastUse)) { 2596 // We can't insert code immediately after an invoke instruction, so 2597 // insert code at the beginning of both successor blocks instead. 2598 // The invoke's return value isn't available in the unwind block, 2599 // but our releases will never depend on it, because they must be 2600 // paired with retains from before the invoke. 2601 InsertPts[0] = II->getNormalDest()->getFirstNonPHI(); 2602 InsertPts[1] = II->getUnwindDest()->getFirstNonPHI(); 2603 } else { 2604 // Insert code immediately after the last use. 2605 InsertPts[0] = llvm::next(BasicBlock::iterator(LastUse)); 2606 } 2607 2608 for (Instruction **I = InsertPts; *I; ++I) { 2609 Instruction *InsertPt = *I; 2610 Value *MyArg = ArgTy == ParamTy ? Arg : 2611 new BitCastInst(Arg, ParamTy, "", InsertPt); 2612 CallInst *Call = CallInst::Create(ReleaseFunc, MyArg, "", InsertPt); 2613 // Attach a clang.imprecise_release metadata tag, if appropriate. 2614 if (MDNode *M = ReleasesToMove.ReleaseMetadata) 2615 Call->setMetadata(ImpreciseReleaseMDKind, M); 2616 Call->setDoesNotThrow(); 2617 if (ReleasesToMove.IsTailCallRelease) 2618 Call->setTailCall(); 2619 } 2620 } 2621 2622 // Delete the original retain and release calls. 2623 for (SmallPtrSet<Instruction *, 2>::const_iterator 2624 AI = RetainsToMove.Calls.begin(), 2625 AE = RetainsToMove.Calls.end(); AI != AE; ++AI) { 2626 Instruction *OrigRetain = *AI; 2627 Retains.blot(OrigRetain); 2628 DeadInsts.push_back(OrigRetain); 2629 } 2630 for (SmallPtrSet<Instruction *, 2>::const_iterator 2631 AI = ReleasesToMove.Calls.begin(), 2632 AE = ReleasesToMove.Calls.end(); AI != AE; ++AI) { 2633 Instruction *OrigRelease = *AI; 2634 Releases.erase(OrigRelease); 2635 DeadInsts.push_back(OrigRelease); 2636 } 2637 } 2638 2639 bool 2640 ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState> 2641 &BBStates, 2642 MapVector<Value *, RRInfo> &Retains, 2643 DenseMap<Value *, RRInfo> &Releases) { 2644 bool AnyPairsCompletelyEliminated = false; 2645 RRInfo RetainsToMove; 2646 RRInfo ReleasesToMove; 2647 SmallVector<Instruction *, 4> NewRetains; 2648 SmallVector<Instruction *, 4> NewReleases; 2649 SmallVector<Instruction *, 8> DeadInsts; 2650 2651 for (MapVector<Value *, RRInfo>::const_iterator I = Retains.begin(), 2652 E = Retains.end(); I != E; ) { 2653 Value *V = (I++)->first; 2654 if (!V) continue; // blotted 2655 2656 Instruction *Retain = cast<Instruction>(V); 2657 Value *Arg = GetObjCArg(Retain); 2658 2659 // If the object being released is in static or stack storage, we know it's 2660 // not being managed by ObjC reference counting, so we can delete pairs 2661 // regardless of what possible decrements or uses lie between them. 2662 bool KnownSafe = isa<Constant>(Arg) || isa<AllocaInst>(Arg); 2663 2664 // If a pair happens in a region where it is known that the reference count 2665 // is already incremented, we can similarly ignore possible decrements. 2666 bool KnownIncrementedTD = true, KnownIncrementedBU = true; 2667 2668 // Connect the dots between the top-down-collected RetainsToMove and 2669 // bottom-up-collected ReleasesToMove to form sets of related calls. 2670 // This is an iterative process so that we connect multiple releases 2671 // to multiple retains if needed. 2672 unsigned OldDelta = 0; 2673 unsigned NewDelta = 0; 2674 unsigned OldCount = 0; 2675 unsigned NewCount = 0; 2676 bool FirstRelease = true; 2677 bool FirstRetain = true; 2678 NewRetains.push_back(Retain); 2679 for (;;) { 2680 for (SmallVectorImpl<Instruction *>::const_iterator 2681 NI = NewRetains.begin(), NE = NewRetains.end(); NI != NE; ++NI) { 2682 Instruction *NewRetain = *NI; 2683 MapVector<Value *, RRInfo>::const_iterator It = Retains.find(NewRetain); 2684 assert(It != Retains.end()); 2685 const RRInfo &NewRetainRRI = It->second; 2686 KnownIncrementedTD &= NewRetainRRI.KnownIncremented; 2687 for (SmallPtrSet<Instruction *, 2>::const_iterator 2688 LI = NewRetainRRI.Calls.begin(), 2689 LE = NewRetainRRI.Calls.end(); LI != LE; ++LI) { 2690 Instruction *NewRetainRelease = *LI; 2691 DenseMap<Value *, RRInfo>::const_iterator Jt = 2692 Releases.find(NewRetainRelease); 2693 if (Jt == Releases.end()) 2694 goto next_retain; 2695 const RRInfo &NewRetainReleaseRRI = Jt->second; 2696 assert(NewRetainReleaseRRI.Calls.count(NewRetain)); 2697 if (ReleasesToMove.Calls.insert(NewRetainRelease)) { 2698 OldDelta -= 2699 BBStates[NewRetainRelease->getParent()].GetAllPathCount(); 2700 2701 // Merge the ReleaseMetadata and IsTailCallRelease values. 2702 if (FirstRelease) { 2703 ReleasesToMove.ReleaseMetadata = 2704 NewRetainReleaseRRI.ReleaseMetadata; 2705 ReleasesToMove.IsTailCallRelease = 2706 NewRetainReleaseRRI.IsTailCallRelease; 2707 FirstRelease = false; 2708 } else { 2709 if (ReleasesToMove.ReleaseMetadata != 2710 NewRetainReleaseRRI.ReleaseMetadata) 2711 ReleasesToMove.ReleaseMetadata = 0; 2712 if (ReleasesToMove.IsTailCallRelease != 2713 NewRetainReleaseRRI.IsTailCallRelease) 2714 ReleasesToMove.IsTailCallRelease = false; 2715 } 2716 2717 // Collect the optimal insertion points. 2718 if (!KnownSafe) 2719 for (SmallPtrSet<Instruction *, 2>::const_iterator 2720 RI = NewRetainReleaseRRI.ReverseInsertPts.begin(), 2721 RE = NewRetainReleaseRRI.ReverseInsertPts.end(); 2722 RI != RE; ++RI) { 2723 Instruction *RIP = *RI; 2724 if (ReleasesToMove.ReverseInsertPts.insert(RIP)) 2725 NewDelta -= BBStates[RIP->getParent()].GetAllPathCount(); 2726 } 2727 NewReleases.push_back(NewRetainRelease); 2728 } 2729 } 2730 } 2731 NewRetains.clear(); 2732 if (NewReleases.empty()) break; 2733 2734 // Back the other way. 2735 for (SmallVectorImpl<Instruction *>::const_iterator 2736 NI = NewReleases.begin(), NE = NewReleases.end(); NI != NE; ++NI) { 2737 Instruction *NewRelease = *NI; 2738 DenseMap<Value *, RRInfo>::const_iterator It = 2739 Releases.find(NewRelease); 2740 assert(It != Releases.end()); 2741 const RRInfo &NewReleaseRRI = It->second; 2742 KnownIncrementedBU &= NewReleaseRRI.KnownIncremented; 2743 for (SmallPtrSet<Instruction *, 2>::const_iterator 2744 LI = NewReleaseRRI.Calls.begin(), 2745 LE = NewReleaseRRI.Calls.end(); LI != LE; ++LI) { 2746 Instruction *NewReleaseRetain = *LI; 2747 MapVector<Value *, RRInfo>::const_iterator Jt = 2748 Retains.find(NewReleaseRetain); 2749 if (Jt == Retains.end()) 2750 goto next_retain; 2751 const RRInfo &NewReleaseRetainRRI = Jt->second; 2752 assert(NewReleaseRetainRRI.Calls.count(NewRelease)); 2753 if (RetainsToMove.Calls.insert(NewReleaseRetain)) { 2754 unsigned PathCount = 2755 BBStates[NewReleaseRetain->getParent()].GetAllPathCount(); 2756 OldDelta += PathCount; 2757 OldCount += PathCount; 2758 2759 // Merge the IsRetainBlock values. 2760 if (FirstRetain) { 2761 RetainsToMove.IsRetainBlock = NewReleaseRetainRRI.IsRetainBlock; 2762 FirstRetain = false; 2763 } else if (ReleasesToMove.IsRetainBlock != 2764 NewReleaseRetainRRI.IsRetainBlock) 2765 // It's not possible to merge the sequences if one uses 2766 // objc_retain and the other uses objc_retainBlock. 2767 goto next_retain; 2768 2769 // Collect the optimal insertion points. 2770 if (!KnownSafe) 2771 for (SmallPtrSet<Instruction *, 2>::const_iterator 2772 RI = NewReleaseRetainRRI.ReverseInsertPts.begin(), 2773 RE = NewReleaseRetainRRI.ReverseInsertPts.end(); 2774 RI != RE; ++RI) { 2775 Instruction *RIP = *RI; 2776 if (RetainsToMove.ReverseInsertPts.insert(RIP)) { 2777 PathCount = BBStates[RIP->getParent()].GetAllPathCount(); 2778 NewDelta += PathCount; 2779 NewCount += PathCount; 2780 } 2781 } 2782 NewRetains.push_back(NewReleaseRetain); 2783 } 2784 } 2785 } 2786 NewReleases.clear(); 2787 if (NewRetains.empty()) break; 2788 } 2789 2790 // If the pointer is known incremented, we can safely delete the pair 2791 // regardless of what's between them. 2792 if (KnownIncrementedTD || KnownIncrementedBU) { 2793 RetainsToMove.ReverseInsertPts.clear(); 2794 ReleasesToMove.ReverseInsertPts.clear(); 2795 NewCount = 0; 2796 } 2797 2798 // Determine whether the original call points are balanced in the retain and 2799 // release calls through the program. If not, conservatively don't touch 2800 // them. 2801 // TODO: It's theoretically possible to do code motion in this case, as 2802 // long as the existing imbalances are maintained. 2803 if (OldDelta != 0) 2804 goto next_retain; 2805 2806 // Determine whether the new insertion points we computed preserve the 2807 // balance of retain and release calls through the program. 2808 // TODO: If the fully aggressive solution isn't valid, try to find a 2809 // less aggressive solution which is. 2810 if (NewDelta != 0) 2811 goto next_retain; 2812 2813 // Ok, everything checks out and we're all set. Let's move some code! 2814 Changed = true; 2815 AnyPairsCompletelyEliminated = NewCount == 0; 2816 NumRRs += OldCount - NewCount; 2817 MoveCalls(Arg, RetainsToMove, ReleasesToMove, Retains, Releases, DeadInsts); 2818 2819 next_retain: 2820 NewReleases.clear(); 2821 NewRetains.clear(); 2822 RetainsToMove.clear(); 2823 ReleasesToMove.clear(); 2824 } 2825 2826 // Now that we're done moving everything, we can delete the newly dead 2827 // instructions, as we no longer need them as insert points. 2828 while (!DeadInsts.empty()) 2829 EraseInstruction(DeadInsts.pop_back_val()); 2830 2831 return AnyPairsCompletelyEliminated; 2832 } 2833 2834 /// OptimizeWeakCalls - Weak pointer optimizations. 2835 void ObjCARCOpt::OptimizeWeakCalls(Function &F) { 2836 // First, do memdep-style RLE and S2L optimizations. We can't use memdep 2837 // itself because it uses AliasAnalysis and we need to do provenance 2838 // queries instead. 2839 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) { 2840 Instruction *Inst = &*I++; 2841 InstructionClass Class = GetBasicInstructionClass(Inst); 2842 if (Class != IC_LoadWeak && Class != IC_LoadWeakRetained) 2843 continue; 2844 2845 // Delete objc_loadWeak calls with no users. 2846 if (Class == IC_LoadWeak && Inst->use_empty()) { 2847 Inst->eraseFromParent(); 2848 continue; 2849 } 2850 2851 // TODO: For now, just look for an earlier available version of this value 2852 // within the same block. Theoretically, we could do memdep-style non-local 2853 // analysis too, but that would want caching. A better approach would be to 2854 // use the technique that EarlyCSE uses. 2855 inst_iterator Current = llvm::prior(I); 2856 BasicBlock *CurrentBB = Current.getBasicBlockIterator(); 2857 for (BasicBlock::iterator B = CurrentBB->begin(), 2858 J = Current.getInstructionIterator(); 2859 J != B; --J) { 2860 Instruction *EarlierInst = &*llvm::prior(J); 2861 InstructionClass EarlierClass = GetInstructionClass(EarlierInst); 2862 switch (EarlierClass) { 2863 case IC_LoadWeak: 2864 case IC_LoadWeakRetained: { 2865 // If this is loading from the same pointer, replace this load's value 2866 // with that one. 2867 CallInst *Call = cast<CallInst>(Inst); 2868 CallInst *EarlierCall = cast<CallInst>(EarlierInst); 2869 Value *Arg = Call->getArgOperand(0); 2870 Value *EarlierArg = EarlierCall->getArgOperand(0); 2871 switch (PA.getAA()->alias(Arg, EarlierArg)) { 2872 case AliasAnalysis::MustAlias: 2873 Changed = true; 2874 // If the load has a builtin retain, insert a plain retain for it. 2875 if (Class == IC_LoadWeakRetained) { 2876 CallInst *CI = 2877 CallInst::Create(getRetainCallee(F.getParent()), EarlierCall, 2878 "", Call); 2879 CI->setTailCall(); 2880 } 2881 // Zap the fully redundant load. 2882 Call->replaceAllUsesWith(EarlierCall); 2883 Call->eraseFromParent(); 2884 goto clobbered; 2885 case AliasAnalysis::MayAlias: 2886 case AliasAnalysis::PartialAlias: 2887 goto clobbered; 2888 case AliasAnalysis::NoAlias: 2889 break; 2890 } 2891 break; 2892 } 2893 case IC_StoreWeak: 2894 case IC_InitWeak: { 2895 // If this is storing to the same pointer and has the same size etc. 2896 // replace this load's value with the stored value. 2897 CallInst *Call = cast<CallInst>(Inst); 2898 CallInst *EarlierCall = cast<CallInst>(EarlierInst); 2899 Value *Arg = Call->getArgOperand(0); 2900 Value *EarlierArg = EarlierCall->getArgOperand(0); 2901 switch (PA.getAA()->alias(Arg, EarlierArg)) { 2902 case AliasAnalysis::MustAlias: 2903 Changed = true; 2904 // If the load has a builtin retain, insert a plain retain for it. 2905 if (Class == IC_LoadWeakRetained) { 2906 CallInst *CI = 2907 CallInst::Create(getRetainCallee(F.getParent()), EarlierCall, 2908 "", Call); 2909 CI->setTailCall(); 2910 } 2911 // Zap the fully redundant load. 2912 Call->replaceAllUsesWith(EarlierCall->getArgOperand(1)); 2913 Call->eraseFromParent(); 2914 goto clobbered; 2915 case AliasAnalysis::MayAlias: 2916 case AliasAnalysis::PartialAlias: 2917 goto clobbered; 2918 case AliasAnalysis::NoAlias: 2919 break; 2920 } 2921 break; 2922 } 2923 case IC_MoveWeak: 2924 case IC_CopyWeak: 2925 // TOOD: Grab the copied value. 2926 goto clobbered; 2927 case IC_AutoreleasepoolPush: 2928 case IC_None: 2929 case IC_User: 2930 // Weak pointers are only modified through the weak entry points 2931 // (and arbitrary calls, which could call the weak entry points). 2932 break; 2933 default: 2934 // Anything else could modify the weak pointer. 2935 goto clobbered; 2936 } 2937 } 2938 clobbered:; 2939 } 2940 2941 // Then, for each destroyWeak with an alloca operand, check to see if 2942 // the alloca and all its users can be zapped. 2943 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) { 2944 Instruction *Inst = &*I++; 2945 InstructionClass Class = GetBasicInstructionClass(Inst); 2946 if (Class != IC_DestroyWeak) 2947 continue; 2948 2949 CallInst *Call = cast<CallInst>(Inst); 2950 Value *Arg = Call->getArgOperand(0); 2951 if (AllocaInst *Alloca = dyn_cast<AllocaInst>(Arg)) { 2952 for (Value::use_iterator UI = Alloca->use_begin(), 2953 UE = Alloca->use_end(); UI != UE; ++UI) { 2954 Instruction *UserInst = cast<Instruction>(*UI); 2955 switch (GetBasicInstructionClass(UserInst)) { 2956 case IC_InitWeak: 2957 case IC_StoreWeak: 2958 case IC_DestroyWeak: 2959 continue; 2960 default: 2961 goto done; 2962 } 2963 } 2964 Changed = true; 2965 for (Value::use_iterator UI = Alloca->use_begin(), 2966 UE = Alloca->use_end(); UI != UE; ) { 2967 CallInst *UserInst = cast<CallInst>(*UI++); 2968 if (!UserInst->use_empty()) 2969 UserInst->replaceAllUsesWith(UserInst->getOperand(1)); 2970 UserInst->eraseFromParent(); 2971 } 2972 Alloca->eraseFromParent(); 2973 done:; 2974 } 2975 } 2976 } 2977 2978 /// OptimizeSequences - Identify program paths which execute sequences of 2979 /// retains and releases which can be eliminated. 2980 bool ObjCARCOpt::OptimizeSequences(Function &F) { 2981 /// Releases, Retains - These are used to store the results of the main flow 2982 /// analysis. These use Value* as the key instead of Instruction* so that the 2983 /// map stays valid when we get around to rewriting code and calls get 2984 /// replaced by arguments. 2985 DenseMap<Value *, RRInfo> Releases; 2986 MapVector<Value *, RRInfo> Retains; 2987 2988 /// BBStates, This is used during the traversal of the function to track the 2989 /// states for each identified object at each block. 2990 DenseMap<const BasicBlock *, BBState> BBStates; 2991 2992 // Analyze the CFG of the function, and all instructions. 2993 bool NestingDetected = Visit(F, BBStates, Retains, Releases); 2994 2995 // Transform. 2996 return PerformCodePlacement(BBStates, Retains, Releases) && NestingDetected; 2997 } 2998 2999 /// OptimizeReturns - Look for this pattern: 3000 /// 3001 /// %call = call i8* @something(...) 3002 /// %2 = call i8* @objc_retain(i8* %call) 3003 /// %3 = call i8* @objc_autorelease(i8* %2) 3004 /// ret i8* %3 3005 /// 3006 /// And delete the retain and autorelease. 3007 /// 3008 /// Otherwise if it's just this: 3009 /// 3010 /// %3 = call i8* @objc_autorelease(i8* %2) 3011 /// ret i8* %3 3012 /// 3013 /// convert the autorelease to autoreleaseRV. 3014 void ObjCARCOpt::OptimizeReturns(Function &F) { 3015 if (!F.getReturnType()->isPointerTy()) 3016 return; 3017 3018 SmallPtrSet<Instruction *, 4> DependingInstructions; 3019 SmallPtrSet<const BasicBlock *, 4> Visited; 3020 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) { 3021 BasicBlock *BB = FI; 3022 ReturnInst *Ret = dyn_cast<ReturnInst>(&BB->back()); 3023 if (!Ret) continue; 3024 3025 const Value *Arg = StripPointerCastsAndObjCCalls(Ret->getOperand(0)); 3026 FindDependencies(NeedsPositiveRetainCount, Arg, 3027 BB, Ret, DependingInstructions, Visited, PA); 3028 if (DependingInstructions.size() != 1) 3029 goto next_block; 3030 3031 { 3032 CallInst *Autorelease = 3033 dyn_cast_or_null<CallInst>(*DependingInstructions.begin()); 3034 if (!Autorelease) 3035 goto next_block; 3036 InstructionClass AutoreleaseClass = 3037 GetBasicInstructionClass(Autorelease); 3038 if (!IsAutorelease(AutoreleaseClass)) 3039 goto next_block; 3040 if (GetObjCArg(Autorelease) != Arg) 3041 goto next_block; 3042 3043 DependingInstructions.clear(); 3044 Visited.clear(); 3045 3046 // Check that there is nothing that can affect the reference 3047 // count between the autorelease and the retain. 3048 FindDependencies(CanChangeRetainCount, Arg, 3049 BB, Autorelease, DependingInstructions, Visited, PA); 3050 if (DependingInstructions.size() != 1) 3051 goto next_block; 3052 3053 { 3054 CallInst *Retain = 3055 dyn_cast_or_null<CallInst>(*DependingInstructions.begin()); 3056 3057 // Check that we found a retain with the same argument. 3058 if (!Retain || 3059 !IsRetain(GetBasicInstructionClass(Retain)) || 3060 GetObjCArg(Retain) != Arg) 3061 goto next_block; 3062 3063 DependingInstructions.clear(); 3064 Visited.clear(); 3065 3066 // Convert the autorelease to an autoreleaseRV, since it's 3067 // returning the value. 3068 if (AutoreleaseClass == IC_Autorelease) { 3069 Autorelease->setCalledFunction(getAutoreleaseRVCallee(F.getParent())); 3070 AutoreleaseClass = IC_AutoreleaseRV; 3071 } 3072 3073 // Check that there is nothing that can affect the reference 3074 // count between the retain and the call. 3075 FindDependencies(CanChangeRetainCount, Arg, BB, Retain, 3076 DependingInstructions, Visited, PA); 3077 if (DependingInstructions.size() != 1) 3078 goto next_block; 3079 3080 { 3081 CallInst *Call = 3082 dyn_cast_or_null<CallInst>(*DependingInstructions.begin()); 3083 3084 // Check that the pointer is the return value of the call. 3085 if (!Call || Arg != Call) 3086 goto next_block; 3087 3088 // Check that the call is a regular call. 3089 InstructionClass Class = GetBasicInstructionClass(Call); 3090 if (Class != IC_CallOrUser && Class != IC_Call) 3091 goto next_block; 3092 3093 // If so, we can zap the retain and autorelease. 3094 Changed = true; 3095 ++NumRets; 3096 EraseInstruction(Retain); 3097 EraseInstruction(Autorelease); 3098 } 3099 } 3100 } 3101 3102 next_block: 3103 DependingInstructions.clear(); 3104 Visited.clear(); 3105 } 3106 } 3107 3108 bool ObjCARCOpt::doInitialization(Module &M) { 3109 if (!EnableARCOpts) 3110 return false; 3111 3112 Run = ModuleHasARC(M); 3113 if (!Run) 3114 return false; 3115 3116 // Identify the imprecise release metadata kind. 3117 ImpreciseReleaseMDKind = 3118 M.getContext().getMDKindID("clang.imprecise_release"); 3119 3120 // Identify the declarations for objc_retain and friends. 3121 RetainFunc = M.getFunction("objc_retain"); 3122 RetainBlockFunc = M.getFunction("objc_retainBlock"); 3123 RetainRVFunc = M.getFunction("objc_retainAutoreleasedReturnValue"); 3124 ReleaseFunc = M.getFunction("objc_release"); 3125 3126 // Intuitively, objc_retain and others are nocapture, however in practice 3127 // they are not, because they return their argument value. And objc_release 3128 // calls finalizers. 3129 3130 // These are initialized lazily. 3131 RetainRVCallee = 0; 3132 AutoreleaseRVCallee = 0; 3133 ReleaseCallee = 0; 3134 RetainCallee = 0; 3135 AutoreleaseCallee = 0; 3136 3137 return false; 3138 } 3139 3140 bool ObjCARCOpt::runOnFunction(Function &F) { 3141 if (!EnableARCOpts) 3142 return false; 3143 3144 // If nothing in the Module uses ARC, don't do anything. 3145 if (!Run) 3146 return false; 3147 3148 Changed = false; 3149 3150 PA.setAA(&getAnalysis<AliasAnalysis>()); 3151 3152 // This pass performs several distinct transformations. As a compile-time aid 3153 // when compiling code that isn't ObjC, skip these if the relevant ObjC 3154 // library functions aren't declared. 3155 3156 // Preliminary optimizations. This also computs UsedInThisFunction. 3157 OptimizeIndividualCalls(F); 3158 3159 // Optimizations for weak pointers. 3160 if (UsedInThisFunction & ((1 << IC_LoadWeak) | 3161 (1 << IC_LoadWeakRetained) | 3162 (1 << IC_StoreWeak) | 3163 (1 << IC_InitWeak) | 3164 (1 << IC_CopyWeak) | 3165 (1 << IC_MoveWeak) | 3166 (1 << IC_DestroyWeak))) 3167 OptimizeWeakCalls(F); 3168 3169 // Optimizations for retain+release pairs. 3170 if (UsedInThisFunction & ((1 << IC_Retain) | 3171 (1 << IC_RetainRV) | 3172 (1 << IC_RetainBlock))) 3173 if (UsedInThisFunction & (1 << IC_Release)) 3174 // Run OptimizeSequences until it either stops making changes or 3175 // no retain+release pair nesting is detected. 3176 while (OptimizeSequences(F)) {} 3177 3178 // Optimizations if objc_autorelease is used. 3179 if (UsedInThisFunction & 3180 ((1 << IC_Autorelease) | (1 << IC_AutoreleaseRV))) 3181 OptimizeReturns(F); 3182 3183 return Changed; 3184 } 3185 3186 void ObjCARCOpt::releaseMemory() { 3187 PA.clear(); 3188 } 3189 3190 //===----------------------------------------------------------------------===// 3191 // ARC contraction. 3192 //===----------------------------------------------------------------------===// 3193 3194 // TODO: ObjCARCContract could insert PHI nodes when uses aren't 3195 // dominated by single calls. 3196 3197 #include "llvm/Operator.h" 3198 #include "llvm/InlineAsm.h" 3199 #include "llvm/Analysis/Dominators.h" 3200 3201 STATISTIC(NumStoreStrongs, "Number objc_storeStrong calls formed"); 3202 3203 namespace { 3204 /// ObjCARCContract - Late ARC optimizations. These change the IR in a way 3205 /// that makes it difficult to be analyzed by ObjCARCOpt, so it's run late. 3206 class ObjCARCContract : public FunctionPass { 3207 bool Changed; 3208 AliasAnalysis *AA; 3209 DominatorTree *DT; 3210 ProvenanceAnalysis PA; 3211 3212 /// Run - A flag indicating whether this optimization pass should run. 3213 bool Run; 3214 3215 /// StoreStrongCallee, etc. - Declarations for ObjC runtime 3216 /// functions, for use in creating calls to them. These are initialized 3217 /// lazily to avoid cluttering up the Module with unused declarations. 3218 Constant *StoreStrongCallee, 3219 *RetainAutoreleaseCallee, *RetainAutoreleaseRVCallee; 3220 3221 /// RetainRVMarker - The inline asm string to insert between calls and 3222 /// RetainRV calls to make the optimization work on targets which need it. 3223 const MDString *RetainRVMarker; 3224 3225 Constant *getStoreStrongCallee(Module *M); 3226 Constant *getRetainAutoreleaseCallee(Module *M); 3227 Constant *getRetainAutoreleaseRVCallee(Module *M); 3228 3229 bool ContractAutorelease(Function &F, Instruction *Autorelease, 3230 InstructionClass Class, 3231 SmallPtrSet<Instruction *, 4> 3232 &DependingInstructions, 3233 SmallPtrSet<const BasicBlock *, 4> 3234 &Visited); 3235 3236 void ContractRelease(Instruction *Release, 3237 inst_iterator &Iter); 3238 3239 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 3240 virtual bool doInitialization(Module &M); 3241 virtual bool runOnFunction(Function &F); 3242 3243 public: 3244 static char ID; 3245 ObjCARCContract() : FunctionPass(ID) { 3246 initializeObjCARCContractPass(*PassRegistry::getPassRegistry()); 3247 } 3248 }; 3249 } 3250 3251 char ObjCARCContract::ID = 0; 3252 INITIALIZE_PASS_BEGIN(ObjCARCContract, 3253 "objc-arc-contract", "ObjC ARC contraction", false, false) 3254 INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 3255 INITIALIZE_PASS_DEPENDENCY(DominatorTree) 3256 INITIALIZE_PASS_END(ObjCARCContract, 3257 "objc-arc-contract", "ObjC ARC contraction", false, false) 3258 3259 Pass *llvm::createObjCARCContractPass() { 3260 return new ObjCARCContract(); 3261 } 3262 3263 void ObjCARCContract::getAnalysisUsage(AnalysisUsage &AU) const { 3264 AU.addRequired<AliasAnalysis>(); 3265 AU.addRequired<DominatorTree>(); 3266 AU.setPreservesCFG(); 3267 } 3268 3269 Constant *ObjCARCContract::getStoreStrongCallee(Module *M) { 3270 if (!StoreStrongCallee) { 3271 LLVMContext &C = M->getContext(); 3272 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 3273 Type *I8XX = PointerType::getUnqual(I8X); 3274 std::vector<Type *> Params; 3275 Params.push_back(I8XX); 3276 Params.push_back(I8X); 3277 3278 AttrListPtr Attributes; 3279 Attributes.addAttr(~0u, Attribute::NoUnwind); 3280 Attributes.addAttr(1, Attribute::NoCapture); 3281 3282 StoreStrongCallee = 3283 M->getOrInsertFunction( 3284 "objc_storeStrong", 3285 FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false), 3286 Attributes); 3287 } 3288 return StoreStrongCallee; 3289 } 3290 3291 Constant *ObjCARCContract::getRetainAutoreleaseCallee(Module *M) { 3292 if (!RetainAutoreleaseCallee) { 3293 LLVMContext &C = M->getContext(); 3294 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 3295 std::vector<Type *> Params; 3296 Params.push_back(I8X); 3297 FunctionType *FTy = 3298 FunctionType::get(I8X, Params, /*isVarArg=*/false); 3299 AttrListPtr Attributes; 3300 Attributes.addAttr(~0u, Attribute::NoUnwind); 3301 RetainAutoreleaseCallee = 3302 M->getOrInsertFunction("objc_retainAutorelease", FTy, Attributes); 3303 } 3304 return RetainAutoreleaseCallee; 3305 } 3306 3307 Constant *ObjCARCContract::getRetainAutoreleaseRVCallee(Module *M) { 3308 if (!RetainAutoreleaseRVCallee) { 3309 LLVMContext &C = M->getContext(); 3310 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 3311 std::vector<Type *> Params; 3312 Params.push_back(I8X); 3313 FunctionType *FTy = 3314 FunctionType::get(I8X, Params, /*isVarArg=*/false); 3315 AttrListPtr Attributes; 3316 Attributes.addAttr(~0u, Attribute::NoUnwind); 3317 RetainAutoreleaseRVCallee = 3318 M->getOrInsertFunction("objc_retainAutoreleaseReturnValue", FTy, 3319 Attributes); 3320 } 3321 return RetainAutoreleaseRVCallee; 3322 } 3323 3324 /// ContractAutorelease - Merge an autorelease with a retain into a fused 3325 /// call. 3326 bool 3327 ObjCARCContract::ContractAutorelease(Function &F, Instruction *Autorelease, 3328 InstructionClass Class, 3329 SmallPtrSet<Instruction *, 4> 3330 &DependingInstructions, 3331 SmallPtrSet<const BasicBlock *, 4> 3332 &Visited) { 3333 const Value *Arg = GetObjCArg(Autorelease); 3334 3335 // Check that there are no instructions between the retain and the autorelease 3336 // (such as an autorelease_pop) which may change the count. 3337 CallInst *Retain = 0; 3338 if (Class == IC_AutoreleaseRV) 3339 FindDependencies(RetainAutoreleaseRVDep, Arg, 3340 Autorelease->getParent(), Autorelease, 3341 DependingInstructions, Visited, PA); 3342 else 3343 FindDependencies(RetainAutoreleaseDep, Arg, 3344 Autorelease->getParent(), Autorelease, 3345 DependingInstructions, Visited, PA); 3346 3347 Visited.clear(); 3348 if (DependingInstructions.size() != 1) { 3349 DependingInstructions.clear(); 3350 return false; 3351 } 3352 3353 Retain = dyn_cast_or_null<CallInst>(*DependingInstructions.begin()); 3354 DependingInstructions.clear(); 3355 3356 if (!Retain || 3357 GetBasicInstructionClass(Retain) != IC_Retain || 3358 GetObjCArg(Retain) != Arg) 3359 return false; 3360 3361 Changed = true; 3362 ++NumPeeps; 3363 3364 if (Class == IC_AutoreleaseRV) 3365 Retain->setCalledFunction(getRetainAutoreleaseRVCallee(F.getParent())); 3366 else 3367 Retain->setCalledFunction(getRetainAutoreleaseCallee(F.getParent())); 3368 3369 EraseInstruction(Autorelease); 3370 return true; 3371 } 3372 3373 /// ContractRelease - Attempt to merge an objc_release with a store, load, and 3374 /// objc_retain to form an objc_storeStrong. This can be a little tricky because 3375 /// the instructions don't always appear in order, and there may be unrelated 3376 /// intervening instructions. 3377 void ObjCARCContract::ContractRelease(Instruction *Release, 3378 inst_iterator &Iter) { 3379 LoadInst *Load = dyn_cast<LoadInst>(GetObjCArg(Release)); 3380 if (!Load || Load->isVolatile()) return; 3381 3382 // For now, require everything to be in one basic block. 3383 BasicBlock *BB = Release->getParent(); 3384 if (Load->getParent() != BB) return; 3385 3386 // Walk down to find the store. 3387 BasicBlock::iterator I = Load, End = BB->end(); 3388 ++I; 3389 AliasAnalysis::Location Loc = AA->getLocation(Load); 3390 while (I != End && 3391 (&*I == Release || 3392 IsRetain(GetBasicInstructionClass(I)) || 3393 !(AA->getModRefInfo(I, Loc) & AliasAnalysis::Mod))) 3394 ++I; 3395 StoreInst *Store = dyn_cast<StoreInst>(I); 3396 if (!Store || Store->isVolatile()) return; 3397 if (Store->getPointerOperand() != Loc.Ptr) return; 3398 3399 Value *New = StripPointerCastsAndObjCCalls(Store->getValueOperand()); 3400 3401 // Walk up to find the retain. 3402 I = Store; 3403 BasicBlock::iterator Begin = BB->begin(); 3404 while (I != Begin && GetBasicInstructionClass(I) != IC_Retain) 3405 --I; 3406 Instruction *Retain = I; 3407 if (GetBasicInstructionClass(Retain) != IC_Retain) return; 3408 if (GetObjCArg(Retain) != New) return; 3409 3410 Changed = true; 3411 ++NumStoreStrongs; 3412 3413 LLVMContext &C = Release->getContext(); 3414 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 3415 Type *I8XX = PointerType::getUnqual(I8X); 3416 3417 Value *Args[] = { Load->getPointerOperand(), New }; 3418 if (Args[0]->getType() != I8XX) 3419 Args[0] = new BitCastInst(Args[0], I8XX, "", Store); 3420 if (Args[1]->getType() != I8X) 3421 Args[1] = new BitCastInst(Args[1], I8X, "", Store); 3422 CallInst *StoreStrong = 3423 CallInst::Create(getStoreStrongCallee(BB->getParent()->getParent()), 3424 Args, "", Store); 3425 StoreStrong->setDoesNotThrow(); 3426 StoreStrong->setDebugLoc(Store->getDebugLoc()); 3427 3428 if (&*Iter == Store) ++Iter; 3429 Store->eraseFromParent(); 3430 Release->eraseFromParent(); 3431 EraseInstruction(Retain); 3432 if (Load->use_empty()) 3433 Load->eraseFromParent(); 3434 } 3435 3436 bool ObjCARCContract::doInitialization(Module &M) { 3437 Run = ModuleHasARC(M); 3438 if (!Run) 3439 return false; 3440 3441 // These are initialized lazily. 3442 StoreStrongCallee = 0; 3443 RetainAutoreleaseCallee = 0; 3444 RetainAutoreleaseRVCallee = 0; 3445 3446 // Initialize RetainRVMarker. 3447 RetainRVMarker = 0; 3448 if (NamedMDNode *NMD = 3449 M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker")) 3450 if (NMD->getNumOperands() == 1) { 3451 const MDNode *N = NMD->getOperand(0); 3452 if (N->getNumOperands() == 1) 3453 if (const MDString *S = dyn_cast<MDString>(N->getOperand(0))) 3454 RetainRVMarker = S; 3455 } 3456 3457 return false; 3458 } 3459 3460 bool ObjCARCContract::runOnFunction(Function &F) { 3461 if (!EnableARCOpts) 3462 return false; 3463 3464 // If nothing in the Module uses ARC, don't do anything. 3465 if (!Run) 3466 return false; 3467 3468 Changed = false; 3469 AA = &getAnalysis<AliasAnalysis>(); 3470 DT = &getAnalysis<DominatorTree>(); 3471 3472 PA.setAA(&getAnalysis<AliasAnalysis>()); 3473 3474 // For ObjC library calls which return their argument, replace uses of the 3475 // argument with uses of the call return value, if it dominates the use. This 3476 // reduces register pressure. 3477 SmallPtrSet<Instruction *, 4> DependingInstructions; 3478 SmallPtrSet<const BasicBlock *, 4> Visited; 3479 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) { 3480 Instruction *Inst = &*I++; 3481 3482 // Only these library routines return their argument. In particular, 3483 // objc_retainBlock does not necessarily return its argument. 3484 InstructionClass Class = GetBasicInstructionClass(Inst); 3485 switch (Class) { 3486 case IC_Retain: 3487 case IC_FusedRetainAutorelease: 3488 case IC_FusedRetainAutoreleaseRV: 3489 break; 3490 case IC_Autorelease: 3491 case IC_AutoreleaseRV: 3492 if (ContractAutorelease(F, Inst, Class, DependingInstructions, Visited)) 3493 continue; 3494 break; 3495 case IC_RetainRV: { 3496 // If we're compiling for a target which needs a special inline-asm 3497 // marker to do the retainAutoreleasedReturnValue optimization, 3498 // insert it now. 3499 if (!RetainRVMarker) 3500 break; 3501 BasicBlock::iterator BBI = Inst; 3502 --BBI; 3503 while (isNoopInstruction(BBI)) --BBI; 3504 if (&*BBI == GetObjCArg(Inst)) { 3505 InlineAsm *IA = 3506 InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst->getContext()), 3507 /*isVarArg=*/false), 3508 RetainRVMarker->getString(), 3509 /*Constraints=*/"", /*hasSideEffects=*/true); 3510 CallInst::Create(IA, "", Inst); 3511 } 3512 break; 3513 } 3514 case IC_InitWeak: { 3515 // objc_initWeak(p, null) => *p = null 3516 CallInst *CI = cast<CallInst>(Inst); 3517 if (isNullOrUndef(CI->getArgOperand(1))) { 3518 Value *Null = 3519 ConstantPointerNull::get(cast<PointerType>(CI->getType())); 3520 Changed = true; 3521 new StoreInst(Null, CI->getArgOperand(0), CI); 3522 CI->replaceAllUsesWith(Null); 3523 CI->eraseFromParent(); 3524 } 3525 continue; 3526 } 3527 case IC_Release: 3528 ContractRelease(Inst, I); 3529 continue; 3530 default: 3531 continue; 3532 } 3533 3534 // Don't use GetObjCArg because we don't want to look through bitcasts 3535 // and such; to do the replacement, the argument must have type i8*. 3536 const Value *Arg = cast<CallInst>(Inst)->getArgOperand(0); 3537 for (;;) { 3538 // If we're compiling bugpointed code, don't get in trouble. 3539 if (!isa<Instruction>(Arg) && !isa<Argument>(Arg)) 3540 break; 3541 // Look through the uses of the pointer. 3542 for (Value::const_use_iterator UI = Arg->use_begin(), UE = Arg->use_end(); 3543 UI != UE; ) { 3544 Use &U = UI.getUse(); 3545 unsigned OperandNo = UI.getOperandNo(); 3546 ++UI; // Increment UI now, because we may unlink its element. 3547 if (Instruction *UserInst = dyn_cast<Instruction>(U.getUser())) 3548 if (Inst != UserInst && DT->dominates(Inst, UserInst)) { 3549 Changed = true; 3550 Instruction *Replacement = Inst; 3551 Type *UseTy = U.get()->getType(); 3552 if (PHINode *PHI = dyn_cast<PHINode>(UserInst)) { 3553 // For PHI nodes, insert the bitcast in the predecessor block. 3554 unsigned ValNo = 3555 PHINode::getIncomingValueNumForOperand(OperandNo); 3556 BasicBlock *BB = 3557 PHI->getIncomingBlock(ValNo); 3558 if (Replacement->getType() != UseTy) 3559 Replacement = new BitCastInst(Replacement, UseTy, "", 3560 &BB->back()); 3561 for (unsigned i = 0, e = PHI->getNumIncomingValues(); 3562 i != e; ++i) 3563 if (PHI->getIncomingBlock(i) == BB) { 3564 // Keep the UI iterator valid. 3565 if (&PHI->getOperandUse( 3566 PHINode::getOperandNumForIncomingValue(i)) == 3567 &UI.getUse()) 3568 ++UI; 3569 PHI->setIncomingValue(i, Replacement); 3570 } 3571 } else { 3572 if (Replacement->getType() != UseTy) 3573 Replacement = new BitCastInst(Replacement, UseTy, "", UserInst); 3574 U.set(Replacement); 3575 } 3576 } 3577 } 3578 3579 // If Arg is a no-op casted pointer, strip one level of casts and 3580 // iterate. 3581 if (const BitCastInst *BI = dyn_cast<BitCastInst>(Arg)) 3582 Arg = BI->getOperand(0); 3583 else if (isa<GEPOperator>(Arg) && 3584 cast<GEPOperator>(Arg)->hasAllZeroIndices()) 3585 Arg = cast<GEPOperator>(Arg)->getPointerOperand(); 3586 else if (isa<GlobalAlias>(Arg) && 3587 !cast<GlobalAlias>(Arg)->mayBeOverridden()) 3588 Arg = cast<GlobalAlias>(Arg)->getAliasee(); 3589 else 3590 break; 3591 } 3592 } 3593 3594 return Changed; 3595 } 3596