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