PtrState.h revision f3ef5332fa3f4d5ec72c178a2b19dac363a19383
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