87 lines · c
1//===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8/// \file9///10/// This file declares special dependency analysis routines used in Objective C11/// ARC Optimizations.12///13/// WARNING: This file knows about certain library functions. It recognizes them14/// by name, and hardwires knowledge of their semantics.15///16/// WARNING: This file knows about how certain Objective-C library functions are17/// used. Naive LLVM IR transformations which would otherwise be18/// behavior-preserving may break these assumptions.19///20//===----------------------------------------------------------------------===//21 22#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H23#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H24 25#include "llvm/Analysis/ObjCARCInstKind.h"26 27namespace llvm {28 class BasicBlock;29 class Instruction;30 class Value;31}32 33namespace llvm {34namespace objcarc {35 36class ProvenanceAnalysis;37 38/// \enum DependenceKind39/// Defines different dependence kinds among various ARC constructs.40///41/// There are several kinds of dependence-like concepts in use here.42///43enum DependenceKind {44 NeedsPositiveRetainCount,45 AutoreleasePoolBoundary,46 CanChangeRetainCount,47 RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease.48 RetainAutoreleaseRVDep ///< Blocks objc_retainAutoreleaseReturnValue.49};50 51/// Find dependent instructions. If there is exactly one dependent instruction,52/// return it. Otherwise, return null.53llvm::Instruction *findSingleDependency(DependenceKind Flavor, const Value *Arg,54 BasicBlock *StartBB,55 Instruction *StartInst,56 ProvenanceAnalysis &PA);57 58bool59Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg,60 ProvenanceAnalysis &PA);61 62/// Test whether the given instruction can "use" the given pointer's object in a63/// way that requires the reference count to be positive.64bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,65 ARCInstKind Class);66 67/// Test whether the given instruction can result in a reference count68/// modification (positive or negative) for the pointer's object.69bool CanAlterRefCount(const Instruction *Inst, const Value *Ptr,70 ProvenanceAnalysis &PA, ARCInstKind Class);71 72/// Returns true if we can not conservatively prove that Inst can not decrement73/// the reference count of Ptr. Returns false if we can.74bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr,75 ProvenanceAnalysis &PA, ARCInstKind Class);76 77static inline bool CanDecrementRefCount(const Instruction *Inst,78 const Value *Ptr,79 ProvenanceAnalysis &PA) {80 return CanDecrementRefCount(Inst, Ptr, PA, GetARCInstKind(Inst));81}82 83} // namespace objcarc84} // namespace llvm85 86#endif87