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