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/Analysis/AliasAnalysis.h" 28 #include "llvm/Analysis/ObjCARCAnalysisUtils.h" 29 #include "llvm/Analysis/ObjCARCInstKind.h" 30 #include "llvm/Analysis/Passes.h" 31 #include "llvm/Analysis/ValueTracking.h" 32 #include "llvm/IR/CallSite.h" 33 #include "llvm/IR/InstIterator.h" 34 #include "llvm/IR/Module.h" 35 #include "llvm/Pass.h" 36 #include "llvm/Transforms/ObjCARC.h" 37 #include "llvm/Transforms/Utils/Local.h" 38 39 namespace llvm { 40 class raw_ostream; 41 } 42 43 namespace llvm { 44 namespace objcarc { 45 46 /// \brief Erase the given instruction. 47 /// 48 /// Many ObjC calls return their argument verbatim, 49 /// so if it's such a call and the return value has users, replace them with the 50 /// argument value. 51 /// EraseInstruction(Instruction * CI)52static inline void EraseInstruction(Instruction *CI) { 53 Value *OldArg = cast<CallInst>(CI)->getArgOperand(0); 54 55 bool Unused = CI->use_empty(); 56 57 if (!Unused) { 58 // Replace the return value with the argument. 59 assert((IsForwarding(GetBasicARCInstKind(CI)) || 60 (IsNoopOnNull(GetBasicARCInstKind(CI)) && 61 isa<ConstantPointerNull>(OldArg))) && 62 "Can't delete non-forwarding instruction with users!"); 63 CI->replaceAllUsesWith(OldArg); 64 } 65 66 CI->eraseFromParent(); 67 68 if (Unused) 69 RecursivelyDeleteTriviallyDeadInstructions(OldArg); 70 } 71 72 } // end namespace objcarc 73 } // end namespace llvm 74 75 #endif 76