//===- DependencyAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
/// \file
///
/// This file declares special dependency analysis routines used in Objective C
/// ARC Optimizations.
///
/// WARNING: This file knows about certain library functions. It recognizes them
/// by name, and hardwires knowledge of their semantics.
///
/// WARNING: This file knows about how certain Objective-C library functions are
/// used. Naive LLVM IR transformations which would otherwise be
/// behavior-preserving may break these assumptions.
///
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H
#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H

#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Analysis/ObjCARCInstKind.h"

namespace llvm {
  class BasicBlock;
  class Instruction;
  class Value;
}

namespace llvm {
namespace objcarc {

class ProvenanceAnalysis;

/// \enum DependenceKind
/// Defines different dependence kinds among various ARC constructs.
///
/// There are several kinds of dependence-like concepts in use here.
///
enum DependenceKind {
  NeedsPositiveRetainCount,
  AutoreleasePoolBoundary,
  CanChangeRetainCount,
  RetainAutoreleaseDep,       ///< Blocks objc_retainAutorelease.
  RetainAutoreleaseRVDep,     ///< Blocks objc_retainAutoreleaseReturnValue.
  RetainRVDep                 ///< Blocks objc_retainAutoreleasedReturnValue.
};

void FindDependencies(DependenceKind Flavor,
                      const Value *Arg,
                      BasicBlock *StartBB, Instruction *StartInst,
                      SmallPtrSetImpl<Instruction *> &DependingInstructions,
                      SmallPtrSetImpl<const BasicBlock *> &Visited,
                      ProvenanceAnalysis &PA);

bool
Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg,
        ProvenanceAnalysis &PA);

/// Test whether the given instruction can "use" the given pointer's object in a
/// way that requires the reference count to be positive.
bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,
            ARCInstKind Class);

/// Test whether the given instruction can result in a reference count
/// modification (positive or negative) for the pointer's object.
bool CanAlterRefCount(const Instruction *Inst, const Value *Ptr,
                      ProvenanceAnalysis &PA, ARCInstKind Class);

/// Returns true if we can not conservatively prove that Inst can not decrement
/// the reference count of Ptr. Returns false if we can.
bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr,
                          ProvenanceAnalysis &PA, ARCInstKind Class);

static inline bool CanDecrementRefCount(const Instruction *Inst,
                                        const Value *Ptr,
                                        ProvenanceAnalysis &PA) {
  return CanDecrementRefCount(Inst, Ptr, PA, GetARCInstKind(Inst));
}

} // namespace objcarc
} // namespace llvm

#endif
