14c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===--- PtrState.h - ARC State for a Ptr -------------------*- C++ -*-----===//
24c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
34c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
44c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
54c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
64c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
74c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
84c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
94c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//  This file contains declarations for the ARC state associated with a ptr. It
114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//  is only used by the ARC Sequence Dataflow computation. By separating this
124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//  from the actual dataflow, it is easier to consider the mechanics of the ARC
134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//  optimization separate from the actual predicates being used.
144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_PTRSTATE_H
184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#define LLVM_LIB_TRANSFORMS_OBJCARC_PTRSTATE_H
194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/SmallPtrSet.h"
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ObjCARCInstKind.h"
224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/IR/Instruction.h"
234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/IR/Value.h"
244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/raw_ostream.h"
254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/Debug.h"
264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace llvm {
284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace objcarc {
294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass ARCMDKindCache;
314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass ProvenanceAnalysis;
324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// \enum Sequence
344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar///
354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// \brief A sequence of states that a pointer may go through in which an
364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// objc_retain and objc_release are actually needed.
374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarenum Sequence {
384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_None,
394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_Retain,        ///< objc_retain(x).
404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_CanRelease,    ///< foo(x) -- x could possibly see a ref count decrement.
414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_Use,           ///< any use of x.
424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_Stop,          ///< like S_Release, but code motion is stopped.
434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_Release,       ///< objc_release(x).
444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  S_MovableRelease ///< objc_release(x), !clang.imprecise_release.
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarraw_ostream &operator<<(raw_ostream &OS,
484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                        const Sequence S) LLVM_ATTRIBUTE_UNUSED;
494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// \brief Unidirectional information about either a
514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// retain-decrement-use-release sequence or release-use-decrement-retain
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// reverse sequence.
534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstruct RRInfo {
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// After an objc_retain, the reference count of the referenced
554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// object is known to be positive. Similarly, before an objc_release, the
564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// reference count of the referenced object is known to be positive. If
574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// there are retain-release pairs in code regions where the retain count
584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// is known to be positive, they can be eliminated, regardless of any side
594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// effects between them.
604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ///
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Also, a retain+release pair nested within another retain+release
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// pair all on the known same pointer value can be eliminated, regardless
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// of any intervening side effects.
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ///
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// KnownSafe is true when either of these conditions is satisfied.
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool KnownSafe;
674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// True of the objc_release calls are all marked with the "tail" keyword.
694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool IsTailCallRelease;
704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// If the Calls are objc_release calls and they all have a
724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// clang.imprecise_release tag, this is the metadata tag.
734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MDNode *ReleaseMetadata;
744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// For a top-down sequence, the set of objc_retains or
764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// objc_retainBlocks. For bottom-up, the set of objc_releases.
774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SmallPtrSet<Instruction *, 2> Calls;
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// The set of optimal insert positions for moving calls in the opposite
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// sequence.
814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SmallPtrSet<Instruction *, 2> ReverseInsertPts;
824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// If this is true, we cannot perform code motion but can still remove
844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// retain/release pairs.
854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool CFGHazardAfflicted;
864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  RRInfo()
884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      : KnownSafe(false), IsTailCallRelease(false), ReleaseMetadata(nullptr),
894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        CFGHazardAfflicted(false) {}
904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void clear();
924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Conservatively merge the two RRInfo. Returns true if a partial merge has
944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// occurred, false otherwise.
954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool Merge(const RRInfo &Other);
964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// \brief This class summarizes several per-pointer runtime properties which
99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// are propagated through the flow graph.
1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass PtrState {
1014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarprotected:
1024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// True if the reference count is known to be incremented.
1034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool KnownPositiveRefCount;
1044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// True if we've seen an opportunity for partial RR elimination, such as
1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// pushing calls into a CFG triangle or into one side of a CFG diamond.
1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool Partial;
1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// The current position in the sequence.
1104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned char Seq : 8;
1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Unidirectional information about the current sequence.
1134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  RRInfo RRI;
1144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  PtrState() : KnownPositiveRefCount(false), Partial(false), Seq(S_None) {}
1164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarpublic:
1184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool IsKnownSafe() const { return RRI.KnownSafe; }
1194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetKnownSafe(const bool NewValue) { RRI.KnownSafe = NewValue; }
1214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool IsTailCallRelease() const { return RRI.IsTailCallRelease; }
1234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetTailCallRelease(const bool NewValue) {
1254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    RRI.IsTailCallRelease = NewValue;
1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool IsTrackingImpreciseReleases() const {
1294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RRI.ReleaseMetadata != nullptr;
1304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const MDNode *GetReleaseMetadata() const { return RRI.ReleaseMetadata; }
1334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetReleaseMetadata(MDNode *NewValue) { RRI.ReleaseMetadata = NewValue; }
1354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool IsCFGHazardAfflicted() const { return RRI.CFGHazardAfflicted; }
1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetCFGHazardAfflicted(const bool NewValue) {
1394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    RRI.CFGHazardAfflicted = NewValue;
1404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetKnownPositiveRefCount();
1434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void ClearKnownPositiveRefCount();
1444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool HasKnownPositiveRefCount() const { return KnownPositiveRefCount; }
1464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void SetSeq(Sequence NewSeq);
1484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Sequence GetSeq() const { return static_cast<Sequence>(Seq); }
1504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void ClearSequenceProgress() { ResetSequenceProgress(S_None); }
1524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void ResetSequenceProgress(Sequence NewSeq);
1544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void Merge(const PtrState &Other, bool TopDown);
1554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void InsertCall(Instruction *I) { RRI.Calls.insert(I); }
1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void InsertReverseInsertPt(Instruction *I) { RRI.ReverseInsertPts.insert(I); }
1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void ClearReverseInsertPts() { RRI.ReverseInsertPts.clear(); }
1614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool HasReverseInsertPts() const { return !RRI.ReverseInsertPts.empty(); }
1634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const RRInfo &GetRRInfo() const { return RRI; }
1654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
1664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstruct BottomUpPtrState : PtrState {
1684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  BottomUpPtrState() : PtrState() {}
1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// (Re-)Initialize this bottom up pointer returning true if we detected a
1714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// pointer with nested releases.
1724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool InitBottomUp(ARCMDKindCache &Cache, Instruction *I);
1734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Return true if this set of releases can be paired with a release. Modifies
175f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// state appropriately to reflect that the matching occurred if it is
1764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// successful.
1774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ///
1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// It is assumed that one has already checked that the RCIdentity of the
1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// retain and the RCIdentity of this ptr state are the same.
1804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool MatchWithRetain();
1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void HandlePotentialUse(BasicBlock *BB, Instruction *Inst, const Value *Ptr,
1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                          ProvenanceAnalysis &PA, ARCInstKind Class);
1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool HandlePotentialAlterRefCount(Instruction *Inst, const Value *Ptr,
1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                    ProvenanceAnalysis &PA, ARCInstKind Class);
1864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstruct TopDownPtrState : PtrState {
1894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  TopDownPtrState() : PtrState() {}
1904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// (Re-)Initialize this bottom up pointer returning true if we detected a
1924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// pointer with nested releases.
1934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool InitTopDown(ARCInstKind Kind, Instruction *I);
1944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// Return true if this set of retains can be paired with the given
1964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// release. Modifies state appropriately to reflect that the matching
197f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// occurred.
1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool MatchWithRelease(ARCMDKindCache &Cache, Instruction *Release);
1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void HandlePotentialUse(Instruction *Inst, const Value *Ptr,
2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                          ProvenanceAnalysis &PA, ARCInstKind Class);
2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  bool HandlePotentialAlterRefCount(Instruction *Inst, const Value *Ptr,
2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                    ProvenanceAnalysis &PA, ARCInstKind Class);
2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace objcarc
2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace llvm
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#endif
211