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 39namespace llvm { 40class raw_ostream; 41} 42 43namespace llvm { 44namespace 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/// 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