1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===- ARCInstKind.cpp - ObjC ARC Optimization ----------------------------===//
2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//                     The LLVM Compiler Infrastructure
4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file is distributed under the University of Illinois Open Source
6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// License. See LICENSE.TXT for details.
7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===//
9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \file
10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This file defines several utility functions used by various ARC
11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// optimizations which are IMHO too big to be in a header file.
12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// WARNING: This file knows about certain library functions. It recognizes them
14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// by name, and hardwires knowledge of their semantics.
15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// WARNING: This file knows about how certain Objective-C library functions are
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// used. Naive LLVM IR transformations which would otherwise be
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// behavior-preserving may break these assumptions.
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===//
21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ObjCARCInstKind.h"
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/ObjCARCAnalysisUtils.h"
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/ADT/StringSwitch.h"
25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Intrinsics.h"
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesusing namespace llvm;
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesusing namespace llvm::objcarc;
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesraw_ostream &llvm::objcarc::operator<<(raw_ostream &OS,
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                       const ARCInstKind Class) {
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::Retain";
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::RetainRV";
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return OS << "ARCInstKind::ClaimRV";
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::RetainBlock";
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::Release";
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::Autorelease";
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::AutoreleaseRV";
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::AutoreleasepoolPush";
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::AutoreleasepoolPop";
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::NoopCast";
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::FusedRetainAutorelease";
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::FusedRetainAutoreleaseRV";
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::LoadWeakRetained";
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::StoreWeak";
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::InitWeak";
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::LoadWeak";
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::MoveWeak";
67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::CopyWeak";
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::DestroyWeak";
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::StoreStrong";
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::CallOrUser";
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::Call";
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::User";
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::IntrinsicUser";
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return OS << "ARCInstKind::None";
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("Unknown instruction class!");
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
87ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesARCInstKind llvm::objcarc::GetFunctionClass(const Function *F) {
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // No (mandatory) arguments.
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (AI == AE)
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return StringSwitch<ARCInstKind>(F->getName())
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        .Case("objc_autoreleasePoolPush", ARCInstKind::AutoreleasepoolPush)
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        .Case("clang.arc.use", ARCInstKind::IntrinsicUser)
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        .Default(ARCInstKind::CallOrUser);
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // One argument.
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Argument *A0 = &*AI++;
99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (AI == AE)
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Argument is a pointer.
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (PointerType *PTy = dyn_cast<PointerType>(A0->getType())) {
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      Type *ETy = PTy->getElementType();
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // Argument is i8*.
104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (ETy->isIntegerTy(8))
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        return StringSwitch<ARCInstKind>(F->getName())
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retain", ARCInstKind::Retain)
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retainAutoreleasedReturnValue", ARCInstKind::RetainRV)
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            .Case("objc_unsafeClaimAutoreleasedReturnValue",
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  ARCInstKind::ClaimRV)
110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retainBlock", ARCInstKind::RetainBlock)
111ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_release", ARCInstKind::Release)
112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_autorelease", ARCInstKind::Autorelease)
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_autoreleaseReturnValue", ARCInstKind::AutoreleaseRV)
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_autoreleasePoolPop", ARCInstKind::AutoreleasepoolPop)
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retainedObject", ARCInstKind::NoopCast)
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_unretainedObject", ARCInstKind::NoopCast)
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_unretainedPointer", ARCInstKind::NoopCast)
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retain_autorelease",
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  ARCInstKind::FusedRetainAutorelease)
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retainAutorelease", ARCInstKind::FusedRetainAutorelease)
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_retainAutoreleaseReturnValue",
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  ARCInstKind::FusedRetainAutoreleaseRV)
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_sync_enter", ARCInstKind::User)
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Case("objc_sync_exit", ARCInstKind::User)
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            .Default(ARCInstKind::CallOrUser);
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // Argument is i8**
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (PointerType *Pte = dyn_cast<PointerType>(ETy))
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        if (Pte->getElementType()->isIntegerTy(8))
130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          return StringSwitch<ARCInstKind>(F->getName())
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              .Case("objc_loadWeakRetained", ARCInstKind::LoadWeakRetained)
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              .Case("objc_loadWeak", ARCInstKind::LoadWeak)
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              .Case("objc_destroyWeak", ARCInstKind::DestroyWeak)
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              .Default(ARCInstKind::CallOrUser);
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
136ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Two arguments, first is i8**.
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Argument *A1 = &*AI++;
139ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (AI == AE)
140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (PointerType *PTy = dyn_cast<PointerType>(A0->getType()))
141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (PointerType *Pte = dyn_cast<PointerType>(PTy->getElementType()))
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        if (Pte->getElementType()->isIntegerTy(8))
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          if (PointerType *PTy1 = dyn_cast<PointerType>(A1->getType())) {
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            Type *ETy1 = PTy1->getElementType();
145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            // Second argument is i8*
146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            if (ETy1->isIntegerTy(8))
147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              return StringSwitch<ARCInstKind>(F->getName())
148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  .Case("objc_storeWeak", ARCInstKind::StoreWeak)
149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  .Case("objc_initWeak", ARCInstKind::InitWeak)
150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  .Case("objc_storeStrong", ARCInstKind::StoreStrong)
151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  .Default(ARCInstKind::CallOrUser);
152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            // Second argument is i8**.
153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines            if (PointerType *Pte1 = dyn_cast<PointerType>(ETy1))
154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines              if (Pte1->getElementType()->isIntegerTy(8))
155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                return StringSwitch<ARCInstKind>(F->getName())
156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("objc_moveWeak", ARCInstKind::MoveWeak)
157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("objc_copyWeak", ARCInstKind::CopyWeak)
158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    // Ignore annotation calls. This is important to stop the
159ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    // optimizer from treating annotations as uses which would
160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    // make the state of the pointers they are attempting to
161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    // elucidate to be incorrect.
162ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("llvm.arc.annotation.topdown.bbstart",
163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                          ARCInstKind::None)
164ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("llvm.arc.annotation.topdown.bbend",
165ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                          ARCInstKind::None)
166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("llvm.arc.annotation.bottomup.bbstart",
167ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                          ARCInstKind::None)
168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Case("llvm.arc.annotation.bottomup.bbend",
169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                          ARCInstKind::None)
170ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    .Default(ARCInstKind::CallOrUser);
171ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          }
172ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
173ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Anything else.
174ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return ARCInstKind::CallOrUser;
175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// A whitelist of intrinsics that we know do not use objc pointers or decrement
1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// ref counts.
1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic bool isInertIntrinsic(unsigned ID) {
1804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // TODO: Make this into a covered switch.
1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (ID) {
1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::returnaddress:
1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::frameaddress:
1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::stacksave:
1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::stackrestore:
1864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::vastart:
1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::vacopy:
1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::vaend:
1894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::objectsize:
1904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::prefetch:
1914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::stackprotector:
1924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_return_i32:
1934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_return_i64:
1944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_typeid_for:
1954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_dwarf_cfa:
1964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_sjlj_lsda:
1974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::eh_sjlj_functioncontext:
1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::init_trampoline:
1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::adjust_trampoline:
2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::lifetime_start:
2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::lifetime_end:
2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::invariant_start:
2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::invariant_end:
2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Don't let dbg info affect our results.
2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::dbg_declare:
2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::dbg_value:
2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    // Short cut: Some intrinsics obviously don't use ObjC pointers.
2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return false;
2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
2124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// A whitelist of intrinsics that we know do not use objc pointers or decrement
2154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// ref counts.
2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic bool isUseOnlyIntrinsic(unsigned ID) {
2174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // We are conservative and even though intrinsics are unlikely to touch
2184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // reference counts, we white list them for safety.
2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  //
2204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // TODO: Expand this into a covered switch. There is a lot more here.
2214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (ID) {
2224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::memcpy:
2234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::memmove:
2244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Intrinsic::memset:
2254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
2264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
2274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return false;
2284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
2294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
2304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
231ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Determine what kind of construct V is.
232ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesARCInstKind llvm::objcarc::GetARCInstKind(const Value *V) {
233ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (const Instruction *I = dyn_cast<Instruction>(V)) {
234ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Any instruction other than bitcast and gep with a pointer operand have a
235ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // use of an objc pointer. Bitcasts, GEPs, Selects, PHIs transfer a pointer
236ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // to a subsequent use, rather than using it themselves, in this sense.
237ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // As a short cut, several other opcodes are known to have no pointer
238ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // operands of interest. And ret is never followed by a release, so it's
239ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // not interesting to examine.
240ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    switch (I->getOpcode()) {
241ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Call: {
242ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      const CallInst *CI = cast<CallInst>(I);
2434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // See if we have a function that we know something about.
244ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (const Function *F = CI->getCalledFunction()) {
245ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        ARCInstKind Class = GetFunctionClass(F);
246ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        if (Class != ARCInstKind::CallOrUser)
247ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          return Class;
2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Intrinsic::ID ID = F->getIntrinsicID();
2494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        if (isInertIntrinsic(ID))
250ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          return ARCInstKind::None;
2514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        if (isUseOnlyIntrinsic(ID))
2524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar          return ARCInstKind::User;
253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      }
2544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // Otherwise, be conservative.
256ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return GetCallSiteClass(CI);
257ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
258ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Invoke:
2594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // Otherwise, be conservative.
260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return GetCallSiteClass(cast<InvokeInst>(I));
261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::BitCast:
262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::GetElementPtr:
263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Select:
264ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::PHI:
265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Ret:
266ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Br:
267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Switch:
268ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::IndirectBr:
269ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Alloca:
270ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::VAArg:
271ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Add:
272ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FAdd:
273ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Sub:
274ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FSub:
275ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Mul:
276ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FMul:
277ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::SDiv:
278ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::UDiv:
279ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FDiv:
280ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::SRem:
281ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::URem:
282ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FRem:
283ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Shl:
284ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::LShr:
285ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::AShr:
286ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::And:
287ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Or:
288ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Xor:
289ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::SExt:
290ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::ZExt:
291ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::Trunc:
292ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::IntToPtr:
293ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FCmp:
294ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FPTrunc:
295ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FPExt:
296ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FPToUI:
297ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::FPToSI:
298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::UIToFP:
299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::SIToFP:
300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::InsertElement:
301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::ExtractElement:
302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::ShuffleVector:
303ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::ExtractValue:
304ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      break;
305ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    case Instruction::ICmp:
306ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // Comparing a pointer with null, or any other constant, isn't an
307ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // interesting use, because we don't care what the pointer points to, or
308ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // about the values of any other dynamic reference-counted pointers.
309ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (IsPotentialRetainableObjPtr(I->getOperand(1)))
310ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        return ARCInstKind::User;
311ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      break;
312ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    default:
313ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // For anything else, check all the operands.
314ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // Note that this includes both operands of a Store: while the first
315ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // operand isn't actually being dereferenced, it is being stored to
316ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // memory where we can no longer track who might read it and dereference
317ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      // it, so we have to consider it potentially used.
318ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      for (User::const_op_iterator OI = I->op_begin(), OE = I->op_end();
319ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines           OI != OE; ++OI)
320ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        if (IsPotentialRetainableObjPtr(*OI))
321ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          return ARCInstKind::User;
322ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
323ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
324ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
325ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Otherwise, it's totally inert for ARC purposes.
326ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return ARCInstKind::None;
327ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
328ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
329ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class is a kind of user.
330ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsUser(ARCInstKind Class) {
331ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
332ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
333ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
336ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
337ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
338ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
339ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
340ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
341ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
342ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
343ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
344ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
345ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
346ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
347ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
348ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
349ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
350ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
351ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
352ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
353ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
354ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
355ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
356ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
358ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
359ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
360ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
361ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
362ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
363ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class is objc_retain or equivalent.
364ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsRetain(ARCInstKind Class) {
365ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
366ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
367ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
368ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
369ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // I believe we treat retain block as not a retain since it can copy its
370ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // block.
371ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
372ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
373ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
374ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
375ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
376ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
377ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
378ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
379ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
380ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
381ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
382ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
383ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
384ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
385ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
386ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
387ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
388ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
389ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
390ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
391ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
392ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
394ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
395ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
396ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
397ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
398ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
399ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class is objc_autorelease or equivalent.
400ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsAutorelease(ARCInstKind Class) {
401ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
402ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
403ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
404ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
405ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
406ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
408ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
409ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
410ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
411ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
412ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
413ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
414ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
415ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
416ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
418ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
419ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
420ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
421ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
422ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
423ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
424ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
425ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
426ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
427ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
428ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
430ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
431ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
432ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
433ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class represents instructions which return their
434ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// argument verbatim.
435ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsForwarding(ARCInstKind Class) {
436ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
437ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
438ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
440ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
441ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
442ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
443ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
444ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
445ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
446ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
447ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
448ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
450ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
451ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
452ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
453ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
454ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
455ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
456ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
457ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
458ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
459ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
460ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
461ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
462ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
463ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
464ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
465ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
466ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
467ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
468ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class represents instructions which do nothing if
469ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// passed a null pointer.
470ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsNoopOnNull(ARCInstKind Class) {
471ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
472ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
473ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
475ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
476ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
477ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
478ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
479ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
480ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
481ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
482ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
483ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
484ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
485ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
486ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
487ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
488ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
489ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
490ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
491ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
492ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
493ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
494ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
495ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
496ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
497ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
498ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
499ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
500ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
501ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
502ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
503ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class represents instructions which are always safe
504ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// to mark with the "tail" keyword.
505ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsAlwaysTail(ARCInstKind Class) {
506ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // ARCInstKind::RetainBlock may be given a stack argument.
507ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
508ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
509ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
511ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
512ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
513ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
514ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
515ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
516ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
517ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
518ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
519ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
520ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
521ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
522ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
523ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
524ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
525ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
526ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
527ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
528ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
529ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
530ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
531ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
532ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
533ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
534ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
535ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
536ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
537ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
538ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
539ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class represents instructions which are never safe
540ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// to mark with the "tail" keyword.
541ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsNeverTail(ARCInstKind Class) {
542ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// It is never safe to tail call objc_autorelease since by tail calling
543ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// objc_autorelease: fast autoreleasing causing our object to be potentially
544ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// reclaimed from the autorelease pool which violates the semantics of
545ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// __autoreleasing types in ARC.
546ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
547ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
548ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
549ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
550ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
552ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
553ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
554ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
555ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
556ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
557ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
558ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
559ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
560ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
561ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
562ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
563ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
564ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
565ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
566ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
567ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
568ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
569ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
570ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
571ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
572ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
573ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
574ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
575ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
576ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
577ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
578ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Test if the given class represents instructions which are always safe
579ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// to mark with the nounwind attribute.
580ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::IsNoThrow(ARCInstKind Class) {
581ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // objc_retainBlock is not nounwind because it calls user copy constructors
582ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // which could theoretically throw.
583ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
584ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
585ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
587ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
588ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
589ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
590ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
591ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
592ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
593ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
594ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
595ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
596ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
597ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
598ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
599ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
600ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
601ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
602ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
603ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
604ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
605ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
606ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
607ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
608ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
609ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
610ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
611ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
612ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
613ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
614ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
615ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Test whether the given instruction can autorelease any pointer or cause an
616ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// autoreleasepool pop.
617ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
618ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This means that it *could* interrupt the RV optimization.
619ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::CanInterruptRV(ARCInstKind Class) {
620ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Class) {
621ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
622ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
623ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
624ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
625ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
626ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
627ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
628ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
629ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
630ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
632ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
633ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
634ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
635ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
636ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
637ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
638ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
639ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
640ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
641ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
642ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
643ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
644ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
645ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
646ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
647ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
648ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
649ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
650ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
651ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
652ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::objcarc::CanDecrementRefCount(ARCInstKind Kind) {
653ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (Kind) {
654ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Retain:
655ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainRV:
656ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Autorelease:
657ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleaseRV:
658ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::NoopCast:
659ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutorelease:
660ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::FusedRetainAutoreleaseRV:
661ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::IntrinsicUser:
662ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::User:
663ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::None:
664ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
665ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
666ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // The cases below are conservative.
667ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
668ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // RetainBlock can result in user defined copy constructors being called
669ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // implying releases may occur.
670ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::RetainBlock:
671ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Release:
672ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPush:
673ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::AutoreleasepoolPop:
674ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeakRetained:
675ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreWeak:
676ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::InitWeak:
677ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::LoadWeak:
678ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::MoveWeak:
679ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CopyWeak:
680ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::DestroyWeak:
681ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::StoreStrong:
682ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::CallOrUser:
683ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case ARCInstKind::Call:
684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case ARCInstKind::ClaimRV:
685ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
686ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
687ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
688ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  llvm_unreachable("covered switch isn't covered?");
689ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
690