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