DependencyAnalysis.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. /// \file
  9. ///
  10. /// This file declares special dependency analysis routines used in Objective C
  11. /// ARC Optimizations.
  12. ///
  13. /// WARNING: This file knows about certain library functions. It recognizes them
  14. /// by name, and hardwires knowledge of their semantics.
  15. ///
  16. /// WARNING: This file knows about how certain Objective-C library functions are
  17. /// used. Naive LLVM IR transformations which would otherwise be
  18. /// behavior-preserving may break these assumptions.
  19. ///
  20. //===----------------------------------------------------------------------===//
  21. #ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H
  22. #define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H
  23. #include "llvm/ADT/SmallPtrSet.h"
  24. #include "llvm/Analysis/ObjCARCInstKind.h"
  25. namespace llvm {
  26. class BasicBlock;
  27. class Instruction;
  28. class Value;
  29. }
  30. namespace llvm {
  31. namespace objcarc {
  32. class ProvenanceAnalysis;
  33. /// \enum DependenceKind
  34. /// Defines different dependence kinds among various ARC constructs.
  35. ///
  36. /// There are several kinds of dependence-like concepts in use here.
  37. ///
  38. enum DependenceKind {
  39. NeedsPositiveRetainCount,
  40. AutoreleasePoolBoundary,
  41. CanChangeRetainCount,
  42. RetainAutoreleaseDep, ///< Blocks objc_retainAutorelease.
  43. RetainAutoreleaseRVDep ///< Blocks objc_retainAutoreleaseReturnValue.
  44. };
  45. /// Find dependent instructions. If there is exactly one dependent instruction,
  46. /// return it. Otherwise, return null.
  47. llvm::Instruction *findSingleDependency(DependenceKind Flavor, const Value *Arg,
  48. BasicBlock *StartBB,
  49. Instruction *StartInst,
  50. ProvenanceAnalysis &PA);
  51. bool
  52. Depends(DependenceKind Flavor, Instruction *Inst, const Value *Arg,
  53. ProvenanceAnalysis &PA);
  54. /// Test whether the given instruction can "use" the given pointer's object in a
  55. /// way that requires the reference count to be positive.
  56. bool CanUse(const Instruction *Inst, const Value *Ptr, ProvenanceAnalysis &PA,
  57. ARCInstKind Class);
  58. /// Test whether the given instruction can result in a reference count
  59. /// modification (positive or negative) for the pointer's object.
  60. bool CanAlterRefCount(const Instruction *Inst, const Value *Ptr,
  61. ProvenanceAnalysis &PA, ARCInstKind Class);
  62. /// Returns true if we can not conservatively prove that Inst can not decrement
  63. /// the reference count of Ptr. Returns false if we can.
  64. bool CanDecrementRefCount(const Instruction *Inst, const Value *Ptr,
  65. ProvenanceAnalysis &PA, ARCInstKind Class);
  66. static inline bool CanDecrementRefCount(const Instruction *Inst,
  67. const Value *Ptr,
  68. ProvenanceAnalysis &PA) {
  69. return CanDecrementRefCount(Inst, Ptr, PA, GetARCInstKind(Inst));
  70. }
  71. } // namespace objcarc
  72. } // namespace llvm
  73. #endif