1//===- DependencyAnalysis.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/// 11/// This file defines special dependency analysis routines used in Objective C 12/// ARC Optimizations. 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#define DEBUG_TYPE "objc-arc-dependency" 24#include "ObjCARC.h" 25#include "DependencyAnalysis.h" 26#include "ProvenanceAnalysis.h" 27#include "llvm/Support/CFG.h" 28 29using namespace llvm; 30using namespace llvm::objcarc; 31 32/// Test whether the given instruction can result in a reference count 33/// modification (positive or negative) for the pointer's object. 34bool 35llvm::objcarc::CanAlterRefCount(const Instruction *Inst, const Value *Ptr, 36 ProvenanceAnalysis &PA, 37 InstructionClass Class) { 38 switch (Class) { 39 case IC_Autorelease: 40 case IC_AutoreleaseRV: 41 case IC_IntrinsicUser: 42 case IC_User: 43 // These operations never directly modify a reference count. 44 return false; 45 default: break; 46 } 47 48 ImmutableCallSite CS = static_cast<const Value *>(Inst); 49 assert(CS && "Only calls can alter reference counts!"); 50 51 // See if AliasAnalysis can help us with the call. 52 AliasAnalysis::ModRefBehavior MRB = PA.getAA()->getModRefBehavior(CS); 53 if (AliasAnalysis::onlyReadsMemory(MRB)) 54 return false; 55 if (AliasAnalysis::onlyAccessesArgPointees(MRB)) { 56 for (ImmutableCallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); 57 I != E; ++I) { 58 const Value *Op = *I; 59 if (IsPotentialRetainableObjPtr(Op, *PA.getAA()) && PA.related(Ptr, Op)) 60 return true; 61 } 62 return false; 63 } 64 65 // Assume the worst. 66 return true; 67} 68 69/// Test whether the given instruction can "use" the given pointer's object in a 70/// way that requires the reference count to be positive. 71bool 72llvm::objcarc::CanUse(const Instruction *Inst, const Value *Ptr, 73 ProvenanceAnalysis &PA, InstructionClass Class) { 74 // IC_Call operations (as opposed to IC_CallOrUser) never "use" objc pointers. 75 if (Class == IC_Call) 76 return false; 77 78 // Consider various instructions which may have pointer arguments which are 79 // not "uses". 80 if (const ICmpInst *ICI = dyn_cast<ICmpInst>(Inst)) { 81 // Comparing a pointer with null, or any other constant, isn't really a use, 82 // because we don't care what the pointer points to, or about the values 83 // of any other dynamic reference-counted pointers. 84 if (!IsPotentialRetainableObjPtr(ICI->getOperand(1), *PA.getAA())) 85 return false; 86 } else if (ImmutableCallSite CS = static_cast<const Value *>(Inst)) { 87 // For calls, just check the arguments (and not the callee operand). 88 for (ImmutableCallSite::arg_iterator OI = CS.arg_begin(), 89 OE = CS.arg_end(); OI != OE; ++OI) { 90 const Value *Op = *OI; 91 if (IsPotentialRetainableObjPtr(Op, *PA.getAA()) && PA.related(Ptr, Op)) 92 return true; 93 } 94 return false; 95 } else if (const StoreInst *SI = dyn_cast<StoreInst>(Inst)) { 96 // Special-case stores, because we don't care about the stored value, just 97 // the store address. 98 const Value *Op = GetUnderlyingObjCPtr(SI->getPointerOperand()); 99 // If we can't tell what the underlying object was, assume there is a 100 // dependence. 101 return IsPotentialRetainableObjPtr(Op, *PA.getAA()) && PA.related(Op, Ptr); 102 } 103 104 // Check each operand for a match. 105 for (User::const_op_iterator OI = Inst->op_begin(), OE = Inst->op_end(); 106 OI != OE; ++OI) { 107 const Value *Op = *OI; 108 if (IsPotentialRetainableObjPtr(Op, *PA.getAA()) && PA.related(Ptr, Op)) 109 return true; 110 } 111 return false; 112} 113 114/// Test if there can be dependencies on Inst through Arg. This function only 115/// tests dependencies relevant for removing pairs of calls. 116bool 117llvm::objcarc::Depends(DependenceKind Flavor, Instruction *Inst, 118 const Value *Arg, ProvenanceAnalysis &PA) { 119 // If we've reached the definition of Arg, stop. 120 if (Inst == Arg) 121 return true; 122 123 switch (Flavor) { 124 case NeedsPositiveRetainCount: { 125 InstructionClass Class = GetInstructionClass(Inst); 126 switch (Class) { 127 case IC_AutoreleasepoolPop: 128 case IC_AutoreleasepoolPush: 129 case IC_None: 130 return false; 131 default: 132 return CanUse(Inst, Arg, PA, Class); 133 } 134 } 135 136 case AutoreleasePoolBoundary: { 137 InstructionClass Class = GetInstructionClass(Inst); 138 switch (Class) { 139 case IC_AutoreleasepoolPop: 140 case IC_AutoreleasepoolPush: 141 // These mark the end and begin of an autorelease pool scope. 142 return true; 143 default: 144 // Nothing else does this. 145 return false; 146 } 147 } 148 149 case CanChangeRetainCount: { 150 InstructionClass Class = GetInstructionClass(Inst); 151 switch (Class) { 152 case IC_AutoreleasepoolPop: 153 // Conservatively assume this can decrement any count. 154 return true; 155 case IC_AutoreleasepoolPush: 156 case IC_None: 157 return false; 158 default: 159 return CanAlterRefCount(Inst, Arg, PA, Class); 160 } 161 } 162 163 case RetainAutoreleaseDep: 164 switch (GetBasicInstructionClass(Inst)) { 165 case IC_AutoreleasepoolPop: 166 case IC_AutoreleasepoolPush: 167 // Don't merge an objc_autorelease with an objc_retain inside a different 168 // autoreleasepool scope. 169 return true; 170 case IC_Retain: 171 case IC_RetainRV: 172 // Check for a retain of the same pointer for merging. 173 return GetObjCArg(Inst) == Arg; 174 default: 175 // Nothing else matters for objc_retainAutorelease formation. 176 return false; 177 } 178 179 case RetainAutoreleaseRVDep: { 180 InstructionClass Class = GetBasicInstructionClass(Inst); 181 switch (Class) { 182 case IC_Retain: 183 case IC_RetainRV: 184 // Check for a retain of the same pointer for merging. 185 return GetObjCArg(Inst) == Arg; 186 default: 187 // Anything that can autorelease interrupts 188 // retainAutoreleaseReturnValue formation. 189 return CanInterruptRV(Class); 190 } 191 } 192 193 case RetainRVDep: 194 return CanInterruptRV(GetBasicInstructionClass(Inst)); 195 } 196 197 llvm_unreachable("Invalid dependence flavor"); 198} 199 200/// Walk up the CFG from StartPos (which is in StartBB) and find local and 201/// non-local dependencies on Arg. 202/// 203/// TODO: Cache results? 204void 205llvm::objcarc::FindDependencies(DependenceKind Flavor, 206 const Value *Arg, 207 BasicBlock *StartBB, Instruction *StartInst, 208 SmallPtrSet<Instruction *, 4> &DependingInsts, 209 SmallPtrSet<const BasicBlock *, 4> &Visited, 210 ProvenanceAnalysis &PA) { 211 BasicBlock::iterator StartPos = StartInst; 212 213 SmallVector<std::pair<BasicBlock *, BasicBlock::iterator>, 4> Worklist; 214 Worklist.push_back(std::make_pair(StartBB, StartPos)); 215 do { 216 std::pair<BasicBlock *, BasicBlock::iterator> Pair = 217 Worklist.pop_back_val(); 218 BasicBlock *LocalStartBB = Pair.first; 219 BasicBlock::iterator LocalStartPos = Pair.second; 220 BasicBlock::iterator StartBBBegin = LocalStartBB->begin(); 221 for (;;) { 222 if (LocalStartPos == StartBBBegin) { 223 pred_iterator PI(LocalStartBB), PE(LocalStartBB, false); 224 if (PI == PE) 225 // If we've reached the function entry, produce a null dependence. 226 DependingInsts.insert(0); 227 else 228 // Add the predecessors to the worklist. 229 do { 230 BasicBlock *PredBB = *PI; 231 if (Visited.insert(PredBB)) 232 Worklist.push_back(std::make_pair(PredBB, PredBB->end())); 233 } while (++PI != PE); 234 break; 235 } 236 237 Instruction *Inst = --LocalStartPos; 238 if (Depends(Flavor, Inst, Arg, PA)) { 239 DependingInsts.insert(Inst); 240 break; 241 } 242 } 243 } while (!Worklist.empty()); 244 245 // Determine whether the original StartBB post-dominates all of the blocks we 246 // visited. If not, insert a sentinal indicating that most optimizations are 247 // not safe. 248 for (SmallPtrSet<const BasicBlock *, 4>::const_iterator I = Visited.begin(), 249 E = Visited.end(); I != E; ++I) { 250 const BasicBlock *BB = *I; 251 if (BB == StartBB) 252 continue; 253 const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); 254 for (succ_const_iterator SI(TI), SE(TI, false); SI != SE; ++SI) { 255 const BasicBlock *Succ = *SI; 256 if (Succ != StartBB && !Visited.count(Succ)) { 257 DependingInsts.insert(reinterpret_cast<Instruction *>(-1)); 258 return; 259 } 260 } 261 } 262} 263