ObjCARCContract.cpp revision 7a7102d17f979918042bc040e27288d64a6bea5f
1//===- ObjCARCOpts.cpp - ObjC ARC Optimization ----------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// \file 10/// This file defines late ObjC ARC optimizations. ARC stands for Automatic 11/// Reference Counting and is a system for managing reference counts for objects 12/// in Objective C. 13/// 14/// WARNING: This file knows about certain library functions. It recognizes them 15/// by name, and hardwires knowledge of their semantics. 16/// 17/// WARNING: This file knows about how certain Objective-C library functions are 18/// used. Naive LLVM IR transformations which would otherwise be 19/// behavior-preserving may break these assumptions. 20/// 21//===----------------------------------------------------------------------===// 22 23// TODO: ObjCARCContract could insert PHI nodes when uses aren't 24// dominated by single calls. 25 26#define DEBUG_TYPE "objc-arc-contract" 27#include "ObjCARC.h" 28#include "DependencyAnalysis.h" 29#include "ProvenanceAnalysis.h" 30#include "llvm/ADT/Statistic.h" 31#include "llvm/Analysis/Dominators.h" 32#include "llvm/IR/InlineAsm.h" 33#include "llvm/IR/Operator.h" 34 35using namespace llvm; 36using namespace llvm::objcarc; 37 38STATISTIC(NumPeeps, "Number of calls peephole-optimized"); 39STATISTIC(NumStoreStrongs, "Number objc_storeStrong calls formed"); 40 41namespace { 42 /// \brief Late ARC optimizations 43 /// 44 /// These change the IR in a way that makes it difficult to be analyzed by 45 /// ObjCARCOpt, so it's run late. 46 class ObjCARCContract : public FunctionPass { 47 bool Changed; 48 AliasAnalysis *AA; 49 DominatorTree *DT; 50 ProvenanceAnalysis PA; 51 52 /// A flag indicating whether this optimization pass should run. 53 bool Run; 54 55 /// Declarations for ObjC runtime functions, for use in creating calls to 56 /// them. These are initialized lazily to avoid cluttering up the Module 57 /// with unused declarations. 58 59 /// Declaration for objc_storeStrong(). 60 Constant *StoreStrongCallee; 61 /// Declaration for objc_retainAutorelease(). 62 Constant *RetainAutoreleaseCallee; 63 /// Declaration for objc_retainAutoreleaseReturnValue(). 64 Constant *RetainAutoreleaseRVCallee; 65 66 /// The inline asm string to insert between calls and RetainRV calls to make 67 /// the optimization work on targets which need it. 68 const MDString *RetainRVMarker; 69 70 /// The set of inserted objc_storeStrong calls. If at the end of walking the 71 /// function we have found no alloca instructions, these calls can be marked 72 /// "tail". 73 SmallPtrSet<CallInst *, 8> StoreStrongCalls; 74 75 Constant *getStoreStrongCallee(Module *M); 76 Constant *getRetainAutoreleaseCallee(Module *M); 77 Constant *getRetainAutoreleaseRVCallee(Module *M); 78 79 bool ContractAutorelease(Function &F, Instruction *Autorelease, 80 InstructionClass Class, 81 SmallPtrSet<Instruction *, 4> 82 &DependingInstructions, 83 SmallPtrSet<const BasicBlock *, 4> 84 &Visited); 85 86 void ContractRelease(Instruction *Release, 87 inst_iterator &Iter); 88 89 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 90 virtual bool doInitialization(Module &M); 91 virtual bool runOnFunction(Function &F); 92 93 public: 94 static char ID; 95 ObjCARCContract() : FunctionPass(ID) { 96 initializeObjCARCContractPass(*PassRegistry::getPassRegistry()); 97 } 98 }; 99} 100 101char ObjCARCContract::ID = 0; 102INITIALIZE_PASS_BEGIN(ObjCARCContract, 103 "objc-arc-contract", "ObjC ARC contraction", false, false) 104INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 105INITIALIZE_PASS_DEPENDENCY(DominatorTree) 106INITIALIZE_PASS_END(ObjCARCContract, 107 "objc-arc-contract", "ObjC ARC contraction", false, false) 108 109Pass *llvm::createObjCARCContractPass() { 110 return new ObjCARCContract(); 111} 112 113void ObjCARCContract::getAnalysisUsage(AnalysisUsage &AU) const { 114 AU.addRequired<AliasAnalysis>(); 115 AU.addRequired<DominatorTree>(); 116 AU.setPreservesCFG(); 117} 118 119Constant *ObjCARCContract::getStoreStrongCallee(Module *M) { 120 if (!StoreStrongCallee) { 121 LLVMContext &C = M->getContext(); 122 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 123 Type *I8XX = PointerType::getUnqual(I8X); 124 Type *Params[] = { I8XX, I8X }; 125 126 AttributeSet Attr = AttributeSet() 127 .addAttribute(M->getContext(), AttributeSet::FunctionIndex, 128 Attribute::NoUnwind) 129 .addAttribute(M->getContext(), 1, Attribute::NoCapture); 130 131 StoreStrongCallee = 132 M->getOrInsertFunction( 133 "objc_storeStrong", 134 FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false), 135 Attr); 136 } 137 return StoreStrongCallee; 138} 139 140Constant *ObjCARCContract::getRetainAutoreleaseCallee(Module *M) { 141 if (!RetainAutoreleaseCallee) { 142 LLVMContext &C = M->getContext(); 143 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 144 Type *Params[] = { I8X }; 145 FunctionType *FTy = FunctionType::get(I8X, Params, /*isVarArg=*/false); 146 AttributeSet Attribute = 147 AttributeSet().addAttribute(M->getContext(), AttributeSet::FunctionIndex, 148 Attribute::NoUnwind); 149 RetainAutoreleaseCallee = 150 M->getOrInsertFunction("objc_retainAutorelease", FTy, Attribute); 151 } 152 return RetainAutoreleaseCallee; 153} 154 155Constant *ObjCARCContract::getRetainAutoreleaseRVCallee(Module *M) { 156 if (!RetainAutoreleaseRVCallee) { 157 LLVMContext &C = M->getContext(); 158 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 159 Type *Params[] = { I8X }; 160 FunctionType *FTy = FunctionType::get(I8X, Params, /*isVarArg=*/false); 161 AttributeSet Attribute = 162 AttributeSet().addAttribute(M->getContext(), AttributeSet::FunctionIndex, 163 Attribute::NoUnwind); 164 RetainAutoreleaseRVCallee = 165 M->getOrInsertFunction("objc_retainAutoreleaseReturnValue", FTy, 166 Attribute); 167 } 168 return RetainAutoreleaseRVCallee; 169} 170 171/// Merge an autorelease with a retain into a fused call. 172bool 173ObjCARCContract::ContractAutorelease(Function &F, Instruction *Autorelease, 174 InstructionClass Class, 175 SmallPtrSet<Instruction *, 4> 176 &DependingInstructions, 177 SmallPtrSet<const BasicBlock *, 4> 178 &Visited) { 179 const Value *Arg = GetObjCArg(Autorelease); 180 181 // Check that there are no instructions between the retain and the autorelease 182 // (such as an autorelease_pop) which may change the count. 183 CallInst *Retain = 0; 184 if (Class == IC_AutoreleaseRV) 185 FindDependencies(RetainAutoreleaseRVDep, Arg, 186 Autorelease->getParent(), Autorelease, 187 DependingInstructions, Visited, PA); 188 else 189 FindDependencies(RetainAutoreleaseDep, Arg, 190 Autorelease->getParent(), Autorelease, 191 DependingInstructions, Visited, PA); 192 193 Visited.clear(); 194 if (DependingInstructions.size() != 1) { 195 DependingInstructions.clear(); 196 return false; 197 } 198 199 Retain = dyn_cast_or_null<CallInst>(*DependingInstructions.begin()); 200 DependingInstructions.clear(); 201 202 if (!Retain || 203 GetBasicInstructionClass(Retain) != IC_Retain || 204 GetObjCArg(Retain) != Arg) 205 return false; 206 207 Changed = true; 208 ++NumPeeps; 209 210 DEBUG(dbgs() << "ObjCARCContract::ContractAutorelease: Fusing " 211 "retain/autorelease. Erasing: " << *Autorelease << "\n" 212 " Old Retain: " 213 << *Retain << "\n"); 214 215 if (Class == IC_AutoreleaseRV) 216 Retain->setCalledFunction(getRetainAutoreleaseRVCallee(F.getParent())); 217 else 218 Retain->setCalledFunction(getRetainAutoreleaseCallee(F.getParent())); 219 220 DEBUG(dbgs() << " New Retain: " 221 << *Retain << "\n"); 222 223 EraseInstruction(Autorelease); 224 return true; 225} 226 227/// Attempt to merge an objc_release with a store, load, and objc_retain to form 228/// an objc_storeStrong. This can be a little tricky because the instructions 229/// don't always appear in order, and there may be unrelated intervening 230/// instructions. 231void ObjCARCContract::ContractRelease(Instruction *Release, 232 inst_iterator &Iter) { 233 LoadInst *Load = dyn_cast<LoadInst>(GetObjCArg(Release)); 234 if (!Load || !Load->isSimple()) return; 235 236 // For now, require everything to be in one basic block. 237 BasicBlock *BB = Release->getParent(); 238 if (Load->getParent() != BB) return; 239 240 // Walk down to find the store and the release, which may be in either order. 241 BasicBlock::iterator I = Load, End = BB->end(); 242 ++I; 243 AliasAnalysis::Location Loc = AA->getLocation(Load); 244 StoreInst *Store = 0; 245 bool SawRelease = false; 246 for (; !Store || !SawRelease; ++I) { 247 if (I == End) 248 return; 249 250 Instruction *Inst = I; 251 if (Inst == Release) { 252 SawRelease = true; 253 continue; 254 } 255 256 InstructionClass Class = GetBasicInstructionClass(Inst); 257 258 // Unrelated retains are harmless. 259 if (IsRetain(Class)) 260 continue; 261 262 if (Store) { 263 // The store is the point where we're going to put the objc_storeStrong, 264 // so make sure there are no uses after it. 265 if (CanUse(Inst, Load, PA, Class)) 266 return; 267 } else if (AA->getModRefInfo(Inst, Loc) & AliasAnalysis::Mod) { 268 // We are moving the load down to the store, so check for anything 269 // else which writes to the memory between the load and the store. 270 Store = dyn_cast<StoreInst>(Inst); 271 if (!Store || !Store->isSimple()) return; 272 if (Store->getPointerOperand() != Loc.Ptr) return; 273 } 274 } 275 276 Value *New = StripPointerCastsAndObjCCalls(Store->getValueOperand()); 277 278 // Walk up to find the retain. 279 I = Store; 280 BasicBlock::iterator Begin = BB->begin(); 281 while (I != Begin && GetBasicInstructionClass(I) != IC_Retain) 282 --I; 283 Instruction *Retain = I; 284 if (GetBasicInstructionClass(Retain) != IC_Retain) return; 285 if (GetObjCArg(Retain) != New) return; 286 287 Changed = true; 288 ++NumStoreStrongs; 289 290 LLVMContext &C = Release->getContext(); 291 Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); 292 Type *I8XX = PointerType::getUnqual(I8X); 293 294 Value *Args[] = { Load->getPointerOperand(), New }; 295 if (Args[0]->getType() != I8XX) 296 Args[0] = new BitCastInst(Args[0], I8XX, "", Store); 297 if (Args[1]->getType() != I8X) 298 Args[1] = new BitCastInst(Args[1], I8X, "", Store); 299 CallInst *StoreStrong = 300 CallInst::Create(getStoreStrongCallee(BB->getParent()->getParent()), 301 Args, "", Store); 302 StoreStrong->setDoesNotThrow(); 303 StoreStrong->setDebugLoc(Store->getDebugLoc()); 304 305 // We can't set the tail flag yet, because we haven't yet determined 306 // whether there are any escaping allocas. Remember this call, so that 307 // we can set the tail flag once we know it's safe. 308 StoreStrongCalls.insert(StoreStrong); 309 310 if (&*Iter == Store) ++Iter; 311 Store->eraseFromParent(); 312 Release->eraseFromParent(); 313 EraseInstruction(Retain); 314 if (Load->use_empty()) 315 Load->eraseFromParent(); 316} 317 318bool ObjCARCContract::doInitialization(Module &M) { 319 // If nothing in the Module uses ARC, don't do anything. 320 Run = ModuleHasARC(M); 321 if (!Run) 322 return false; 323 324 // These are initialized lazily. 325 StoreStrongCallee = 0; 326 RetainAutoreleaseCallee = 0; 327 RetainAutoreleaseRVCallee = 0; 328 329 // Initialize RetainRVMarker. 330 RetainRVMarker = 0; 331 if (NamedMDNode *NMD = 332 M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker")) 333 if (NMD->getNumOperands() == 1) { 334 const MDNode *N = NMD->getOperand(0); 335 if (N->getNumOperands() == 1) 336 if (const MDString *S = dyn_cast<MDString>(N->getOperand(0))) 337 RetainRVMarker = S; 338 } 339 340 return false; 341} 342 343bool ObjCARCContract::runOnFunction(Function &F) { 344 if (!EnableARCOpts) 345 return false; 346 347 // If nothing in the Module uses ARC, don't do anything. 348 if (!Run) 349 return false; 350 351 Changed = false; 352 AA = &getAnalysis<AliasAnalysis>(); 353 DT = &getAnalysis<DominatorTree>(); 354 355 PA.setAA(&getAnalysis<AliasAnalysis>()); 356 357 // Track whether it's ok to mark objc_storeStrong calls with the "tail" 358 // keyword. Be conservative if the function has variadic arguments. 359 // It seems that functions which "return twice" are also unsafe for the 360 // "tail" argument, because they are setjmp, which could need to 361 // return to an earlier stack state. 362 bool TailOkForStoreStrongs = !F.isVarArg() && 363 !F.callsFunctionThatReturnsTwice(); 364 365 // For ObjC library calls which return their argument, replace uses of the 366 // argument with uses of the call return value, if it dominates the use. This 367 // reduces register pressure. 368 SmallPtrSet<Instruction *, 4> DependingInstructions; 369 SmallPtrSet<const BasicBlock *, 4> Visited; 370 for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ) { 371 Instruction *Inst = &*I++; 372 373 DEBUG(dbgs() << "ObjCARCContract: Visiting: " << *Inst << "\n"); 374 375 // Only these library routines return their argument. In particular, 376 // objc_retainBlock does not necessarily return its argument. 377 InstructionClass Class = GetBasicInstructionClass(Inst); 378 switch (Class) { 379 case IC_Retain: 380 case IC_FusedRetainAutorelease: 381 case IC_FusedRetainAutoreleaseRV: 382 break; 383 case IC_Autorelease: 384 case IC_AutoreleaseRV: 385 if (ContractAutorelease(F, Inst, Class, DependingInstructions, Visited)) 386 continue; 387 break; 388 case IC_RetainRV: { 389 // If we're compiling for a target which needs a special inline-asm 390 // marker to do the retainAutoreleasedReturnValue optimization, 391 // insert it now. 392 if (!RetainRVMarker) 393 break; 394 BasicBlock::iterator BBI = Inst; 395 BasicBlock *InstParent = Inst->getParent(); 396 397 // Step up to see if the call immediately precedes the RetainRV call. 398 // If it's an invoke, we have to cross a block boundary. And we have 399 // to carefully dodge no-op instructions. 400 do { 401 if (&*BBI == InstParent->begin()) { 402 BasicBlock *Pred = InstParent->getSinglePredecessor(); 403 if (!Pred) 404 goto decline_rv_optimization; 405 BBI = Pred->getTerminator(); 406 break; 407 } 408 --BBI; 409 } while (isNoopInstruction(BBI)); 410 411 if (&*BBI == GetObjCArg(Inst)) { 412 DEBUG(dbgs() << "ObjCARCContract: Adding inline asm marker for " 413 "retainAutoreleasedReturnValue optimization.\n"); 414 Changed = true; 415 InlineAsm *IA = 416 InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst->getContext()), 417 /*isVarArg=*/false), 418 RetainRVMarker->getString(), 419 /*Constraints=*/"", /*hasSideEffects=*/true); 420 CallInst::Create(IA, "", Inst); 421 } 422 decline_rv_optimization: 423 break; 424 } 425 case IC_InitWeak: { 426 // objc_initWeak(p, null) => *p = null 427 CallInst *CI = cast<CallInst>(Inst); 428 if (isNullOrUndef(CI->getArgOperand(1))) { 429 Value *Null = 430 ConstantPointerNull::get(cast<PointerType>(CI->getType())); 431 Changed = true; 432 new StoreInst(Null, CI->getArgOperand(0), CI); 433 434 DEBUG(dbgs() << "OBJCARCContract: Old = " << *CI << "\n" 435 << " New = " << *Null << "\n"); 436 437 CI->replaceAllUsesWith(Null); 438 CI->eraseFromParent(); 439 } 440 continue; 441 } 442 case IC_Release: 443 ContractRelease(Inst, I); 444 continue; 445 case IC_User: 446 // Be conservative if the function has any alloca instructions. 447 // Technically we only care about escaping alloca instructions, 448 // but this is sufficient to handle some interesting cases. 449 if (isa<AllocaInst>(Inst)) 450 TailOkForStoreStrongs = false; 451 continue; 452 default: 453 continue; 454 } 455 456 DEBUG(dbgs() << "ObjCARCContract: Finished List.\n\n"); 457 458 // Don't use GetObjCArg because we don't want to look through bitcasts 459 // and such; to do the replacement, the argument must have type i8*. 460 const Value *Arg = cast<CallInst>(Inst)->getArgOperand(0); 461 for (;;) { 462 // If we're compiling bugpointed code, don't get in trouble. 463 if (!isa<Instruction>(Arg) && !isa<Argument>(Arg)) 464 break; 465 // Look through the uses of the pointer. 466 for (Value::const_use_iterator UI = Arg->use_begin(), UE = Arg->use_end(); 467 UI != UE; ) { 468 Use &U = UI.getUse(); 469 unsigned OperandNo = UI.getOperandNo(); 470 ++UI; // Increment UI now, because we may unlink its element. 471 472 // If the call's return value dominates a use of the call's argument 473 // value, rewrite the use to use the return value. We check for 474 // reachability here because an unreachable call is considered to 475 // trivially dominate itself, which would lead us to rewriting its 476 // argument in terms of its return value, which would lead to 477 // infinite loops in GetObjCArg. 478 if (DT->isReachableFromEntry(U) && DT->dominates(Inst, U)) { 479 Changed = true; 480 Instruction *Replacement = Inst; 481 Type *UseTy = U.get()->getType(); 482 if (PHINode *PHI = dyn_cast<PHINode>(U.getUser())) { 483 // For PHI nodes, insert the bitcast in the predecessor block. 484 unsigned ValNo = PHINode::getIncomingValueNumForOperand(OperandNo); 485 BasicBlock *BB = PHI->getIncomingBlock(ValNo); 486 if (Replacement->getType() != UseTy) 487 Replacement = new BitCastInst(Replacement, UseTy, "", 488 &BB->back()); 489 // While we're here, rewrite all edges for this PHI, rather 490 // than just one use at a time, to minimize the number of 491 // bitcasts we emit. 492 for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) 493 if (PHI->getIncomingBlock(i) == BB) { 494 // Keep the UI iterator valid. 495 if (&PHI->getOperandUse( 496 PHINode::getOperandNumForIncomingValue(i)) == 497 &UI.getUse()) 498 ++UI; 499 PHI->setIncomingValue(i, Replacement); 500 } 501 } else { 502 if (Replacement->getType() != UseTy) 503 Replacement = new BitCastInst(Replacement, UseTy, "", 504 cast<Instruction>(U.getUser())); 505 U.set(Replacement); 506 } 507 } 508 } 509 510 // If Arg is a no-op casted pointer, strip one level of casts and iterate. 511 if (const BitCastInst *BI = dyn_cast<BitCastInst>(Arg)) 512 Arg = BI->getOperand(0); 513 else if (isa<GEPOperator>(Arg) && 514 cast<GEPOperator>(Arg)->hasAllZeroIndices()) 515 Arg = cast<GEPOperator>(Arg)->getPointerOperand(); 516 else if (isa<GlobalAlias>(Arg) && 517 !cast<GlobalAlias>(Arg)->mayBeOverridden()) 518 Arg = cast<GlobalAlias>(Arg)->getAliasee(); 519 else 520 break; 521 } 522 } 523 524 // If this function has no escaping allocas or suspicious vararg usage, 525 // objc_storeStrong calls can be marked with the "tail" keyword. 526 if (TailOkForStoreStrongs) 527 for (SmallPtrSet<CallInst *, 8>::iterator I = StoreStrongCalls.begin(), 528 E = StoreStrongCalls.end(); I != E; ++I) 529 (*I)->setTailCall(); 530 StoreStrongCalls.clear(); 531 532 return Changed; 533} 534 535/// @} 536/// 537