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