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