Home | History | Annotate | Download | only in ObjCARC
      1 //===- ObjCARC.h - ObjC ARC Optimization --------------*- C++ -*-----------===//
      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 common definitions/declarations used by the ObjC ARC
     11 /// Optimizer. ARC stands for Automatic Reference Counting and is a system for
     12 /// managing reference counts for objects in Objective C.
     13 ///
     14 /// WARNING: This file knows about certain library functions. It recognizes them
     15 /// by name, and hardwires knowledge of their semantics.
     16 ///
     17 /// WARNING: This file knows about how certain Objective-C library functions are
     18 /// used. Naive LLVM IR transformations which would otherwise be
     19 /// behavior-preserving may break these assumptions.
     20 ///
     21 //===----------------------------------------------------------------------===//
     22 
     23 #ifndef LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H
     24 #define LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H
     25 
     26 #include "llvm/ADT/StringSwitch.h"
     27 #include "llvm/ADT/Optional.h"
     28 #include "llvm/Analysis/AliasAnalysis.h"
     29 #include "llvm/Analysis/ObjCARCAnalysisUtils.h"
     30 #include "llvm/Analysis/ObjCARCInstKind.h"
     31 #include "llvm/Analysis/Passes.h"
     32 #include "llvm/Analysis/ValueTracking.h"
     33 #include "llvm/IR/CallSite.h"
     34 #include "llvm/IR/InstIterator.h"
     35 #include "llvm/IR/Module.h"
     36 #include "llvm/Pass.h"
     37 #include "llvm/Transforms/ObjCARC.h"
     38 #include "llvm/Transforms/Utils/Local.h"
     39 
     40 namespace llvm {
     41 class raw_ostream;
     42 }
     43 
     44 namespace llvm {
     45 namespace objcarc {
     46 
     47 /// \brief Erase the given instruction.
     48 ///
     49 /// Many ObjC calls return their argument verbatim,
     50 /// so if it's such a call and the return value has users, replace them with the
     51 /// argument value.
     52 ///
     53 static inline void EraseInstruction(Instruction *CI) {
     54   Value *OldArg = cast<CallInst>(CI)->getArgOperand(0);
     55 
     56   bool Unused = CI->use_empty();
     57 
     58   if (!Unused) {
     59     // Replace the return value with the argument.
     60     assert((IsForwarding(GetBasicARCInstKind(CI)) ||
     61             (IsNoopOnNull(GetBasicARCInstKind(CI)) &&
     62              isa<ConstantPointerNull>(OldArg))) &&
     63            "Can't delete non-forwarding instruction with users!");
     64     CI->replaceAllUsesWith(OldArg);
     65   }
     66 
     67   CI->eraseFromParent();
     68 
     69   if (Unused)
     70     RecursivelyDeleteTriviallyDeadInstructions(OldArg);
     71 }
     72 
     73 } // end namespace objcarc
     74 } // end namespace llvm
     75 
     76 #endif
     77