1 //===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===// 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 declares 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 #ifndef LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 24 #define LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 25 26 #include "llvm/ADT/SmallPtrSet.h" 27 28 namespace llvm { 29 class BasicBlock; 30 class Instruction; 31 class Value; 32 } 33 34 namespace llvm { 35 namespace objcarc { 36 37 class ProvenanceAnalysis; 38 39 /// \enum DependenceKind 40 /// \brief Defines different dependence kinds among various ARC constructs. 41 /// 42 /// There are several kinds of dependence-like concepts in use here. 43 /// 44 enum DependenceKind { 45 NeedsPositiveRetainCount, 46 AutoreleasePoolBoundary, 47 CanChangeRetainCount, 48 RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease. 49 RetainAutoreleaseRVDep, ///< Blocks objc_retainAutoreleaseReturnValue. 50 RetainRVDep ///< Blocks objc_retainAutoreleasedReturnValue. 51 }; 52 53 void FindDependencies(DependenceKind Flavor, 54 const Value *Arg, 55 BasicBlock *StartBB, Instruction *StartInst, 56 SmallPtrSet<Instruction *, 4> &DependingInstructions, 57 SmallPtrSet<const BasicBlock *, 4> &Visited, 58 ProvenanceAnalysis &PA); 59 60 bool 61 Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg, 62 ProvenanceAnalysis &PA); 63 64 /// Test whether the given instruction can "use" the given pointer's object in a 65 /// way that requires the reference count to be positive. 66 bool 67 CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA, 68 InstructionClass Class); 69 70 /// Test whether the given instruction can result in a reference count 71 /// modification (positive or negative) for the pointer's object. 72 bool 73 CanAlterRefCount(const Instruction *Inst, const Value *Ptr, 74 ProvenanceAnalysis &PA, InstructionClass Class); 75 76 } // namespace objcarc 77 } // namespace llvm 78 79 #endif // LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H 80