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 /// EraseInstruction(Instruction * CI)53static 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