1 //===- ObjCARC.cpp - ObjC ARC Optimization --------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines ObjC ARC optimizations. ARC stands for
11 // Automatic Reference Counting and is a system for managing reference counts
12 // for objects in Objective C.
14 // The optimizations performed include elimination of redundant, partially
15 // redundant, and inconsequential reference count operations, elimination of
16 // redundant weak pointer operations, pattern-matching and replacement of
17 // low-level operations into higher-level operations, and numerous minor
20 // This file also defines a simple ARC-aware AliasAnalysis.
22 // WARNING: This file knows about certain library functions. It recognizes them
23 // by name, and hardwires knowedge of their semantics.
25 // WARNING: This file knows about how certain Objective-C library functions are
26 // used. Naive LLVM IR transformations which would otherwise be
27 // behavior-preserving may break these assumptions.
29 //===----------------------------------------------------------------------===//
31 #define DEBUG_TYPE "objc-arc"
32 #include "llvm/Function.h"
33 #include "llvm/Intrinsics.h"
34 #include "llvm/GlobalVariable.h"
35 #include "llvm/DerivedTypes.h"
36 #include "llvm/Module.h"
37 #include "llvm/Analysis/ValueTracking.h"
38 #include "llvm/Transforms/Utils/Local.h"
39 #include "llvm/Support/CallSite.h"
40 #include "llvm/Support/CommandLine.h"
41 #include "llvm/ADT/StringSwitch.h"
42 #include "llvm/ADT/DenseMap.h"
43 #include "llvm/ADT/STLExtras.h"
46 // A handy option to enable/disable all optimizations in this file.
47 static cl::opt
<bool> EnableARCOpts("enable-objc-arc-opts", cl::init(true));
49 //===----------------------------------------------------------------------===//
51 //===----------------------------------------------------------------------===//
54 /// MapVector - An associative container with fast insertion-order
55 /// (deterministic) iteration over its elements. Plus the special
57 template<class KeyT
, class ValueT
>
59 /// Map - Map keys to indices in Vector.
60 typedef DenseMap
<KeyT
, size_t> MapTy
;
63 /// Vector - Keys and values.
64 typedef std::vector
<std::pair
<KeyT
, ValueT
> > VectorTy
;
68 typedef typename
VectorTy::iterator iterator
;
69 typedef typename
VectorTy::const_iterator const_iterator
;
70 iterator
begin() { return Vector
.begin(); }
71 iterator
end() { return Vector
.end(); }
72 const_iterator
begin() const { return Vector
.begin(); }
73 const_iterator
end() const { return Vector
.end(); }
77 assert(Vector
.size() >= Map
.size()); // May differ due to blotting.
78 for (typename
MapTy::const_iterator I
= Map
.begin(), E
= Map
.end();
80 assert(I
->second
< Vector
.size());
81 assert(Vector
[I
->second
].first
== I
->first
);
83 for (typename
VectorTy::const_iterator I
= Vector
.begin(),
84 E
= Vector
.end(); I
!= E
; ++I
)
86 (Map
.count(I
->first
) &&
87 Map
[I
->first
] == size_t(I
- Vector
.begin())));
91 ValueT
&operator[](KeyT Arg
) {
92 std::pair
<typename
MapTy::iterator
, bool> Pair
=
93 Map
.insert(std::make_pair(Arg
, size_t(0)));
95 Pair
.first
->second
= Vector
.size();
96 Vector
.push_back(std::make_pair(Arg
, ValueT()));
97 return Vector
.back().second
;
99 return Vector
[Pair
.first
->second
].second
;
102 std::pair
<iterator
, bool>
103 insert(const std::pair
<KeyT
, ValueT
> &InsertPair
) {
104 std::pair
<typename
MapTy::iterator
, bool> Pair
=
105 Map
.insert(std::make_pair(InsertPair
.first
, size_t(0)));
107 Pair
.first
->second
= Vector
.size();
108 Vector
.push_back(InsertPair
);
109 return std::make_pair(llvm::prior(Vector
.end()), true);
111 return std::make_pair(Vector
.begin() + Pair
.first
->second
, false);
114 const_iterator
find(KeyT Key
) const {
115 typename
MapTy::const_iterator It
= Map
.find(Key
);
116 if (It
== Map
.end()) return Vector
.end();
117 return Vector
.begin() + It
->second
;
120 /// blot - This is similar to erase, but instead of removing the element
121 /// from the vector, it just zeros out the key in the vector. This leaves
122 /// iterators intact, but clients must be prepared for zeroed-out keys when
124 void blot(KeyT Key
) {
125 typename
MapTy::iterator It
= Map
.find(Key
);
126 if (It
== Map
.end()) return;
127 Vector
[It
->second
].first
= KeyT();
138 //===----------------------------------------------------------------------===//
140 //===----------------------------------------------------------------------===//
143 /// InstructionClass - A simple classification for instructions.
144 enum InstructionClass
{
145 IC_Retain
, ///< objc_retain
146 IC_RetainRV
, ///< objc_retainAutoreleasedReturnValue
147 IC_RetainBlock
, ///< objc_retainBlock
148 IC_Release
, ///< objc_release
149 IC_Autorelease
, ///< objc_autorelease
150 IC_AutoreleaseRV
, ///< objc_autoreleaseReturnValue
151 IC_AutoreleasepoolPush
, ///< objc_autoreleasePoolPush
152 IC_AutoreleasepoolPop
, ///< objc_autoreleasePoolPop
153 IC_NoopCast
, ///< objc_retainedObject, etc.
154 IC_FusedRetainAutorelease
, ///< objc_retainAutorelease
155 IC_FusedRetainAutoreleaseRV
, ///< objc_retainAutoreleaseReturnValue
156 IC_LoadWeakRetained
, ///< objc_loadWeakRetained (primitive)
157 IC_StoreWeak
, ///< objc_storeWeak (primitive)
158 IC_InitWeak
, ///< objc_initWeak (derived)
159 IC_LoadWeak
, ///< objc_loadWeak (derived)
160 IC_MoveWeak
, ///< objc_moveWeak (derived)
161 IC_CopyWeak
, ///< objc_copyWeak (derived)
162 IC_DestroyWeak
, ///< objc_destroyWeak (derived)
163 IC_CallOrUser
, ///< could call objc_release and/or "use" pointers
164 IC_Call
, ///< could call objc_release
165 IC_User
, ///< could "use" a pointer
166 IC_None
///< anything else
170 /// IsPotentialUse - Test whether the given value is possible a
171 /// reference-counted pointer.
172 static bool IsPotentialUse(const Value
*Op
) {
173 // Pointers to static or stack storage are not reference-counted pointers.
174 if (isa
<Constant
>(Op
) || isa
<AllocaInst
>(Op
))
176 // Special arguments are not reference-counted.
177 if (const Argument
*Arg
= dyn_cast
<Argument
>(Op
))
178 if (Arg
->hasByValAttr() ||
179 Arg
->hasNestAttr() ||
180 Arg
->hasStructRetAttr())
182 // Only consider values with pointer types, and not function pointers.
183 const PointerType
*Ty
= dyn_cast
<PointerType
>(Op
->getType());
184 if (!Ty
|| isa
<FunctionType
>(Ty
->getElementType()))
186 // Conservatively assume anything else is a potential use.
190 /// GetCallSiteClass - Helper for GetInstructionClass. Determines what kind
191 /// of construct CS is.
192 static InstructionClass
GetCallSiteClass(ImmutableCallSite CS
) {
193 for (ImmutableCallSite::arg_iterator I
= CS
.arg_begin(), E
= CS
.arg_end();
195 if (IsPotentialUse(*I
))
196 return CS
.onlyReadsMemory() ? IC_User
: IC_CallOrUser
;
198 return CS
.onlyReadsMemory() ? IC_None
: IC_Call
;
201 /// GetFunctionClass - Determine if F is one of the special known Functions.
202 /// If it isn't, return IC_CallOrUser.
203 static InstructionClass
GetFunctionClass(const Function
*F
) {
204 Function::const_arg_iterator AI
= F
->arg_begin(), AE
= F
->arg_end();
208 return StringSwitch
<InstructionClass
>(F
->getName())
209 .Case("objc_autoreleasePoolPush", IC_AutoreleasepoolPush
)
210 .Default(IC_CallOrUser
);
213 const Argument
*A0
= AI
++;
215 // Argument is a pointer.
216 if (const PointerType
*PTy
= dyn_cast
<PointerType
>(A0
->getType())) {
217 const Type
*ETy
= PTy
->getElementType();
219 if (ETy
->isIntegerTy(8))
220 return StringSwitch
<InstructionClass
>(F
->getName())
221 .Case("objc_retain", IC_Retain
)
222 .Case("objc_retainAutoreleasedReturnValue", IC_RetainRV
)
223 .Case("objc_retainBlock", IC_RetainBlock
)
224 .Case("objc_release", IC_Release
)
225 .Case("objc_autorelease", IC_Autorelease
)
226 .Case("objc_autoreleaseReturnValue", IC_AutoreleaseRV
)
227 .Case("objc_autoreleasePoolPop", IC_AutoreleasepoolPop
)
228 .Case("objc_retainedObject", IC_NoopCast
)
229 .Case("objc_unretainedObject", IC_NoopCast
)
230 .Case("objc_unretainedPointer", IC_NoopCast
)
231 .Case("objc_retain_autorelease", IC_FusedRetainAutorelease
)
232 .Case("objc_retainAutorelease", IC_FusedRetainAutorelease
)
233 .Case("objc_retainAutoreleaseReturnValue",IC_FusedRetainAutoreleaseRV
)
234 .Default(IC_CallOrUser
);
237 if (const PointerType
*Pte
= dyn_cast
<PointerType
>(ETy
))
238 if (Pte
->getElementType()->isIntegerTy(8))
239 return StringSwitch
<InstructionClass
>(F
->getName())
240 .Case("objc_loadWeakRetained", IC_LoadWeakRetained
)
241 .Case("objc_loadWeak", IC_LoadWeak
)
242 .Case("objc_destroyWeak", IC_DestroyWeak
)
243 .Default(IC_CallOrUser
);
246 // Two arguments, first is i8**.
247 const Argument
*A1
= AI
++;
249 if (const PointerType
*PTy
= dyn_cast
<PointerType
>(A0
->getType()))
250 if (const PointerType
*Pte
= dyn_cast
<PointerType
>(PTy
->getElementType()))
251 if (Pte
->getElementType()->isIntegerTy(8))
252 if (const PointerType
*PTy1
= dyn_cast
<PointerType
>(A1
->getType())) {
253 const Type
*ETy1
= PTy1
->getElementType();
254 // Second argument is i8*
255 if (ETy1
->isIntegerTy(8))
256 return StringSwitch
<InstructionClass
>(F
->getName())
257 .Case("objc_storeWeak", IC_StoreWeak
)
258 .Case("objc_initWeak", IC_InitWeak
)
259 .Default(IC_CallOrUser
);
260 // Second argument is i8**.
261 if (const PointerType
*Pte1
= dyn_cast
<PointerType
>(ETy1
))
262 if (Pte1
->getElementType()->isIntegerTy(8))
263 return StringSwitch
<InstructionClass
>(F
->getName())
264 .Case("objc_moveWeak", IC_MoveWeak
)
265 .Case("objc_copyWeak", IC_CopyWeak
)
266 .Default(IC_CallOrUser
);
270 return IC_CallOrUser
;
273 /// GetInstructionClass - Determine what kind of construct V is.
274 static InstructionClass
GetInstructionClass(const Value
*V
) {
275 if (const Instruction
*I
= dyn_cast
<Instruction
>(V
)) {
276 // Any instruction other than bitcast and gep with a pointer operand have a
277 // use of an objc pointer. Bitcasts, GEPs, Selects, PHIs transfer a pointer
278 // to a subsequent use, rather than using it themselves, in this sense.
279 // As a short cut, several other opcodes are known to have no pointer
280 // operands of interest. And ret is never followed by a release, so it's
281 // not interesting to examine.
282 switch (I
->getOpcode()) {
283 case Instruction::Call
: {
284 const CallInst
*CI
= cast
<CallInst
>(I
);
285 // Check for calls to special functions.
286 if (const Function
*F
= CI
->getCalledFunction()) {
287 InstructionClass Class
= GetFunctionClass(F
);
288 if (Class
!= IC_CallOrUser
)
291 // None of the intrinsic functions do objc_release. For intrinsics, the
292 // only question is whether or not they may be users.
293 switch (F
->getIntrinsicID()) {
295 case Intrinsic::bswap
: case Intrinsic::ctpop
:
296 case Intrinsic::ctlz
: case Intrinsic::cttz
:
297 case Intrinsic::returnaddress
: case Intrinsic::frameaddress
:
298 case Intrinsic::stacksave
: case Intrinsic::stackrestore
:
299 case Intrinsic::vastart
: case Intrinsic::vacopy
: case Intrinsic::vaend
:
300 // Don't let dbg info affect our results.
301 case Intrinsic::dbg_declare
: case Intrinsic::dbg_value
:
302 // Short cut: Some intrinsics obviously don't use ObjC pointers.
305 for (Function::const_arg_iterator AI
= F
->arg_begin(),
306 AE
= F
->arg_end(); AI
!= AE
; ++AI
)
307 if (IsPotentialUse(AI
))
312 return GetCallSiteClass(CI
);
314 case Instruction::Invoke
:
315 return GetCallSiteClass(cast
<InvokeInst
>(I
));
316 case Instruction::BitCast
:
317 case Instruction::GetElementPtr
:
318 case Instruction::Select
: case Instruction::PHI
:
319 case Instruction::Ret
: case Instruction::Br
:
320 case Instruction::Switch
: case Instruction::IndirectBr
:
321 case Instruction::Alloca
: case Instruction::VAArg
:
322 case Instruction::Add
: case Instruction::FAdd
:
323 case Instruction::Sub
: case Instruction::FSub
:
324 case Instruction::Mul
: case Instruction::FMul
:
325 case Instruction::SDiv
: case Instruction::UDiv
: case Instruction::FDiv
:
326 case Instruction::SRem
: case Instruction::URem
: case Instruction::FRem
:
327 case Instruction::Shl
: case Instruction::LShr
: case Instruction::AShr
:
328 case Instruction::And
: case Instruction::Or
: case Instruction::Xor
:
329 case Instruction::SExt
: case Instruction::ZExt
: case Instruction::Trunc
:
330 case Instruction::IntToPtr
: case Instruction::FCmp
:
331 case Instruction::FPTrunc
: case Instruction::FPExt
:
332 case Instruction::FPToUI
: case Instruction::FPToSI
:
333 case Instruction::UIToFP
: case Instruction::SIToFP
:
334 case Instruction::InsertElement
: case Instruction::ExtractElement
:
335 case Instruction::ShuffleVector
:
336 case Instruction::ExtractValue
:
338 case Instruction::ICmp
:
339 // Comparing a pointer with null, or any other constant, isn't an
340 // interesting use, because we don't care what the pointer points to, or
341 // about the values of any other dynamic reference-counted pointers.
342 if (IsPotentialUse(I
->getOperand(1)))
346 // For anything else, check all the operands.
347 for (User::const_op_iterator OI
= I
->op_begin(), OE
= I
->op_end();
349 if (IsPotentialUse(*OI
))
354 // Otherwise, it's totally inert for ARC purposes.
358 /// GetBasicInstructionClass - Determine what kind of construct V is. This is
359 /// similar to GetInstructionClass except that it only detects objc runtine
360 /// calls. This allows it to be faster.
361 static InstructionClass
GetBasicInstructionClass(const Value
*V
) {
362 if (const CallInst
*CI
= dyn_cast
<CallInst
>(V
)) {
363 if (const Function
*F
= CI
->getCalledFunction())
364 return GetFunctionClass(F
);
365 // Otherwise, be conservative.
366 return IC_CallOrUser
;
369 // Otherwise, be conservative.
373 /// IsRetain - Test if the the given class is objc_retain or
375 static bool IsRetain(InstructionClass Class
) {
376 return Class
== IC_Retain
||
377 Class
== IC_RetainRV
;
380 /// IsAutorelease - Test if the the given class is objc_autorelease or
382 static bool IsAutorelease(InstructionClass Class
) {
383 return Class
== IC_Autorelease
||
384 Class
== IC_AutoreleaseRV
;
387 /// IsForwarding - Test if the given class represents instructions which return
388 /// their argument verbatim.
389 static bool IsForwarding(InstructionClass Class
) {
390 // objc_retainBlock technically doesn't always return its argument
391 // verbatim, but it doesn't matter for our purposes here.
392 return Class
== IC_Retain
||
393 Class
== IC_RetainRV
||
394 Class
== IC_Autorelease
||
395 Class
== IC_AutoreleaseRV
||
396 Class
== IC_RetainBlock
||
397 Class
== IC_NoopCast
;
400 /// IsNoopOnNull - Test if the given class represents instructions which do
401 /// nothing if passed a null pointer.
402 static bool IsNoopOnNull(InstructionClass Class
) {
403 return Class
== IC_Retain
||
404 Class
== IC_RetainRV
||
405 Class
== IC_Release
||
406 Class
== IC_Autorelease
||
407 Class
== IC_AutoreleaseRV
||
408 Class
== IC_RetainBlock
;
411 /// IsAlwaysTail - Test if the given class represents instructions which are
412 /// always safe to mark with the "tail" keyword.
413 static bool IsAlwaysTail(InstructionClass Class
) {
414 // IC_RetainBlock may be given a stack argument.
415 return Class
== IC_Retain
||
416 Class
== IC_RetainRV
||
417 Class
== IC_Autorelease
||
418 Class
== IC_AutoreleaseRV
;
421 /// IsNoThrow - Test if the given class represents instructions which are always
422 /// safe to mark with the nounwind attribute..
423 static bool IsNoThrow(InstructionClass Class
) {
424 return Class
== IC_Retain
||
425 Class
== IC_RetainRV
||
426 Class
== IC_RetainBlock
||
427 Class
== IC_Release
||
428 Class
== IC_Autorelease
||
429 Class
== IC_AutoreleaseRV
||
430 Class
== IC_AutoreleasepoolPush
||
431 Class
== IC_AutoreleasepoolPop
;
434 /// EraseInstruction - Erase the given instruction. ObjC calls return their
435 /// argument verbatim, so if it's such a call and the return value has users,
436 /// replace them with the argument value.
437 static void EraseInstruction(Instruction
*CI
) {
438 Value
*OldArg
= cast
<CallInst
>(CI
)->getArgOperand(0);
440 bool Unused
= CI
->use_empty();
443 // Replace the return value with the argument.
444 assert(IsForwarding(GetBasicInstructionClass(CI
)) &&
445 "Can't delete non-forwarding instruction with users!");
446 CI
->replaceAllUsesWith(OldArg
);
449 CI
->eraseFromParent();
452 RecursivelyDeleteTriviallyDeadInstructions(OldArg
);
455 /// GetUnderlyingObjCPtr - This is a wrapper around getUnderlyingObject which
456 /// also knows how to look through objc_retain and objc_autorelease calls, which
457 /// we know to return their argument verbatim.
458 static const Value
*GetUnderlyingObjCPtr(const Value
*V
) {
460 V
= GetUnderlyingObject(V
);
461 if (!IsForwarding(GetBasicInstructionClass(V
)))
463 V
= cast
<CallInst
>(V
)->getArgOperand(0);
469 /// StripPointerCastsAndObjCCalls - This is a wrapper around
470 /// Value::stripPointerCasts which also knows how to look through objc_retain
471 /// and objc_autorelease calls, which we know to return their argument verbatim.
472 static const Value
*StripPointerCastsAndObjCCalls(const Value
*V
) {
474 V
= V
->stripPointerCasts();
475 if (!IsForwarding(GetBasicInstructionClass(V
)))
477 V
= cast
<CallInst
>(V
)->getArgOperand(0);
482 /// StripPointerCastsAndObjCCalls - This is a wrapper around
483 /// Value::stripPointerCasts which also knows how to look through objc_retain
484 /// and objc_autorelease calls, which we know to return their argument verbatim.
485 static Value
*StripPointerCastsAndObjCCalls(Value
*V
) {
487 V
= V
->stripPointerCasts();
488 if (!IsForwarding(GetBasicInstructionClass(V
)))
490 V
= cast
<CallInst
>(V
)->getArgOperand(0);
495 /// GetObjCArg - Assuming the given instruction is one of the special calls such
496 /// as objc_retain or objc_release, return the argument value, stripped of no-op
497 /// casts and forwarding calls.
498 static Value
*GetObjCArg(Value
*Inst
) {
499 return StripPointerCastsAndObjCCalls(cast
<CallInst
>(Inst
)->getArgOperand(0));
502 /// IsObjCIdentifiedObject - This is similar to AliasAnalysis'
503 /// isObjCIdentifiedObject, except that it uses special knowledge of
504 /// ObjC conventions...
505 static bool IsObjCIdentifiedObject(const Value
*V
) {
506 // Assume that call results and arguments have their own "provenance".
507 // Constants (including GlobalVariables) and Allocas are never
508 // reference-counted.
509 if (isa
<CallInst
>(V
) || isa
<InvokeInst
>(V
) ||
510 isa
<Argument
>(V
) || isa
<Constant
>(V
) ||
514 if (const LoadInst
*LI
= dyn_cast
<LoadInst
>(V
)) {
515 const Value
*Pointer
=
516 StripPointerCastsAndObjCCalls(LI
->getPointerOperand());
517 if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(Pointer
)) {
518 StringRef Name
= GV
->getName();
519 // These special variables are known to hold values which are not
520 // reference-counted pointers.
521 if (Name
.startswith("\01L_OBJC_SELECTOR_REFERENCES_") ||
522 Name
.startswith("\01L_OBJC_CLASSLIST_REFERENCES_") ||
523 Name
.startswith("\01L_OBJC_CLASSLIST_SUP_REFS_$_") ||
524 Name
.startswith("\01L_OBJC_METH_VAR_NAME_") ||
525 Name
.startswith("\01l_objc_msgSend_fixup_"))
533 /// FindSingleUseIdentifiedObject - This is similar to
534 /// StripPointerCastsAndObjCCalls but it stops as soon as it finds a value
535 /// with multiple uses.
536 static const Value
*FindSingleUseIdentifiedObject(const Value
*Arg
) {
537 if (Arg
->hasOneUse()) {
538 if (const BitCastInst
*BC
= dyn_cast
<BitCastInst
>(Arg
))
539 return FindSingleUseIdentifiedObject(BC
->getOperand(0));
540 if (const GetElementPtrInst
*GEP
= dyn_cast
<GetElementPtrInst
>(Arg
))
541 if (GEP
->hasAllZeroIndices())
542 return FindSingleUseIdentifiedObject(GEP
->getPointerOperand());
543 if (IsForwarding(GetBasicInstructionClass(Arg
)))
544 return FindSingleUseIdentifiedObject(
545 cast
<CallInst
>(Arg
)->getArgOperand(0));
546 if (!IsObjCIdentifiedObject(Arg
))
551 // If we found an identifiable object but it has multiple uses, but they
552 // are trivial uses, we can still consider this to be a single-use
554 if (IsObjCIdentifiedObject(Arg
)) {
555 for (Value::const_use_iterator UI
= Arg
->use_begin(), UE
= Arg
->use_end();
558 if (!U
->use_empty() || StripPointerCastsAndObjCCalls(U
) != Arg
)
568 /// ModuleHasARC - Test if the given module looks interesting to run ARC
570 static bool ModuleHasARC(const Module
&M
) {
572 M
.getNamedValue("objc_retain") ||
573 M
.getNamedValue("objc_release") ||
574 M
.getNamedValue("objc_autorelease") ||
575 M
.getNamedValue("objc_retainAutoreleasedReturnValue") ||
576 M
.getNamedValue("objc_retainBlock") ||
577 M
.getNamedValue("objc_autoreleaseReturnValue") ||
578 M
.getNamedValue("objc_autoreleasePoolPush") ||
579 M
.getNamedValue("objc_loadWeakRetained") ||
580 M
.getNamedValue("objc_loadWeak") ||
581 M
.getNamedValue("objc_destroyWeak") ||
582 M
.getNamedValue("objc_storeWeak") ||
583 M
.getNamedValue("objc_initWeak") ||
584 M
.getNamedValue("objc_moveWeak") ||
585 M
.getNamedValue("objc_copyWeak") ||
586 M
.getNamedValue("objc_retainedObject") ||
587 M
.getNamedValue("objc_unretainedObject") ||
588 M
.getNamedValue("objc_unretainedPointer");
591 //===----------------------------------------------------------------------===//
592 // ARC AliasAnalysis.
593 //===----------------------------------------------------------------------===//
595 #include "llvm/Pass.h"
596 #include "llvm/Analysis/AliasAnalysis.h"
597 #include "llvm/Analysis/Passes.h"
600 /// ObjCARCAliasAnalysis - This is a simple alias analysis
601 /// implementation that uses knowledge of ARC constructs to answer queries.
603 /// TODO: This class could be generalized to know about other ObjC-specific
604 /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing
605 /// even though their offsets are dynamic.
606 class ObjCARCAliasAnalysis
: public ImmutablePass
,
607 public AliasAnalysis
{
609 static char ID
; // Class identification, replacement for typeinfo
610 ObjCARCAliasAnalysis() : ImmutablePass(ID
) {
611 initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry());
615 virtual void initializePass() {
616 InitializeAliasAnalysis(this);
619 /// getAdjustedAnalysisPointer - This method is used when a pass implements
620 /// an analysis interface through multiple inheritance. If needed, it
621 /// should override this to adjust the this pointer as needed for the
622 /// specified pass info.
623 virtual void *getAdjustedAnalysisPointer(const void *PI
) {
624 if (PI
== &AliasAnalysis::ID
)
625 return (AliasAnalysis
*)this;
629 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
630 virtual AliasResult
alias(const Location
&LocA
, const Location
&LocB
);
631 virtual bool pointsToConstantMemory(const Location
&Loc
, bool OrLocal
);
632 virtual ModRefBehavior
getModRefBehavior(ImmutableCallSite CS
);
633 virtual ModRefBehavior
getModRefBehavior(const Function
*F
);
634 virtual ModRefResult
getModRefInfo(ImmutableCallSite CS
,
635 const Location
&Loc
);
636 virtual ModRefResult
getModRefInfo(ImmutableCallSite CS1
,
637 ImmutableCallSite CS2
);
639 } // End of anonymous namespace
641 // Register this pass...
642 char ObjCARCAliasAnalysis::ID
= 0;
643 INITIALIZE_AG_PASS(ObjCARCAliasAnalysis
, AliasAnalysis
, "objc-arc-aa",
644 "ObjC-ARC-Based Alias Analysis", false, true, false)
646 ImmutablePass
*llvm::createObjCARCAliasAnalysisPass() {
647 return new ObjCARCAliasAnalysis();
651 ObjCARCAliasAnalysis::getAnalysisUsage(AnalysisUsage
&AU
) const {
652 AU
.setPreservesAll();
653 AliasAnalysis::getAnalysisUsage(AU
);
656 AliasAnalysis::AliasResult
657 ObjCARCAliasAnalysis::alias(const Location
&LocA
, const Location
&LocB
) {
659 return AliasAnalysis::alias(LocA
, LocB
);
661 // First, strip off no-ops, including ObjC-specific no-ops, and try making a
662 // precise alias query.
663 const Value
*SA
= StripPointerCastsAndObjCCalls(LocA
.Ptr
);
664 const Value
*SB
= StripPointerCastsAndObjCCalls(LocB
.Ptr
);
666 AliasAnalysis::alias(Location(SA
, LocA
.Size
, LocA
.TBAATag
),
667 Location(SB
, LocB
.Size
, LocB
.TBAATag
));
668 if (Result
!= MayAlias
)
671 // If that failed, climb to the underlying object, including climbing through
672 // ObjC-specific no-ops, and try making an imprecise alias query.
673 const Value
*UA
= GetUnderlyingObjCPtr(SA
);
674 const Value
*UB
= GetUnderlyingObjCPtr(SB
);
675 if (UA
!= SA
|| UB
!= SB
) {
676 Result
= AliasAnalysis::alias(Location(UA
), Location(UB
));
677 // We can't use MustAlias or PartialAlias results here because
678 // GetUnderlyingObjCPtr may return an offsetted pointer value.
679 if (Result
== NoAlias
)
683 // If that failed, fail. We don't need to chain here, since that's covered
684 // by the earlier precise query.
689 ObjCARCAliasAnalysis::pointsToConstantMemory(const Location
&Loc
,
692 return AliasAnalysis::pointsToConstantMemory(Loc
, OrLocal
);
694 // First, strip off no-ops, including ObjC-specific no-ops, and try making
695 // a precise alias query.
696 const Value
*S
= StripPointerCastsAndObjCCalls(Loc
.Ptr
);
697 if (AliasAnalysis::pointsToConstantMemory(Location(S
, Loc
.Size
, Loc
.TBAATag
),
701 // If that failed, climb to the underlying object, including climbing through
702 // ObjC-specific no-ops, and try making an imprecise alias query.
703 const Value
*U
= GetUnderlyingObjCPtr(S
);
705 return AliasAnalysis::pointsToConstantMemory(Location(U
), OrLocal
);
707 // If that failed, fail. We don't need to chain here, since that's covered
708 // by the earlier precise query.
712 AliasAnalysis::ModRefBehavior
713 ObjCARCAliasAnalysis::getModRefBehavior(ImmutableCallSite CS
) {
714 // We have nothing to do. Just chain to the next AliasAnalysis.
715 return AliasAnalysis::getModRefBehavior(CS
);
718 AliasAnalysis::ModRefBehavior
719 ObjCARCAliasAnalysis::getModRefBehavior(const Function
*F
) {
721 return AliasAnalysis::getModRefBehavior(F
);
723 switch (GetFunctionClass(F
)) {
725 return DoesNotAccessMemory
;
730 return AliasAnalysis::getModRefBehavior(F
);
733 AliasAnalysis::ModRefResult
734 ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS
, const Location
&Loc
) {
736 return AliasAnalysis::getModRefInfo(CS
, Loc
);
738 switch (GetBasicInstructionClass(CS
.getInstruction())) {
743 case IC_AutoreleaseRV
:
745 case IC_AutoreleasepoolPush
:
746 case IC_FusedRetainAutorelease
:
747 case IC_FusedRetainAutoreleaseRV
:
748 // These functions don't access any memory visible to the compiler.
754 return AliasAnalysis::getModRefInfo(CS
, Loc
);
757 AliasAnalysis::ModRefResult
758 ObjCARCAliasAnalysis::getModRefInfo(ImmutableCallSite CS1
,
759 ImmutableCallSite CS2
) {
760 // TODO: Theoretically we could check for dependencies between objc_* calls
761 // and OnlyAccessesArgumentPointees calls or other well-behaved calls.
762 return AliasAnalysis::getModRefInfo(CS1
, CS2
);
765 //===----------------------------------------------------------------------===//
767 //===----------------------------------------------------------------------===//
769 #include "llvm/Support/InstIterator.h"
770 #include "llvm/Transforms/Scalar.h"
773 /// ObjCARCExpand - Early ARC transformations.
774 class ObjCARCExpand
: public FunctionPass
{
775 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
776 virtual bool doInitialization(Module
&M
);
777 virtual bool runOnFunction(Function
&F
);
779 /// Run - A flag indicating whether this optimization pass should run.
784 ObjCARCExpand() : FunctionPass(ID
) {
785 initializeObjCARCExpandPass(*PassRegistry::getPassRegistry());
790 char ObjCARCExpand::ID
= 0;
791 INITIALIZE_PASS(ObjCARCExpand
,
792 "objc-arc-expand", "ObjC ARC expansion", false, false)
794 Pass
*llvm::createObjCARCExpandPass() {
795 return new ObjCARCExpand();
798 void ObjCARCExpand::getAnalysisUsage(AnalysisUsage
&AU
) const {
799 AU
.setPreservesCFG();
802 bool ObjCARCExpand::doInitialization(Module
&M
) {
803 Run
= ModuleHasARC(M
);
807 bool ObjCARCExpand::runOnFunction(Function
&F
) {
811 // If nothing in the Module uses ARC, don't do anything.
815 bool Changed
= false;
817 for (inst_iterator I
= inst_begin(&F
), E
= inst_end(&F
); I
!= E
; ++I
) {
818 Instruction
*Inst
= &*I
;
820 switch (GetBasicInstructionClass(Inst
)) {
824 case IC_AutoreleaseRV
:
825 case IC_FusedRetainAutorelease
:
826 case IC_FusedRetainAutoreleaseRV
:
827 // These calls return their argument verbatim, as a low-level
828 // optimization. However, this makes high-level optimizations
829 // harder. Undo any uses of this optimization that the front-end
830 // emitted here. We'll redo them in a later pass.
832 Inst
->replaceAllUsesWith(cast
<CallInst
>(Inst
)->getArgOperand(0));
842 //===----------------------------------------------------------------------===//
844 //===----------------------------------------------------------------------===//
846 // TODO: On code like this:
849 // stuff_that_cannot_release()
850 // objc_autorelease(%x)
851 // stuff_that_cannot_release()
853 // stuff_that_cannot_release()
854 // objc_autorelease(%x)
856 // The second retain and autorelease can be deleted.
858 // TODO: It should be possible to delete
859 // objc_autoreleasePoolPush and objc_autoreleasePoolPop
860 // pairs if nothing is actually autoreleased between them. Also, autorelease
861 // calls followed by objc_autoreleasePoolPop calls (perhaps in ObjC++ code
862 // after inlining) can be turned into plain release calls.
864 // TODO: Critical-edge splitting. If the optimial insertion point is
865 // a critical edge, the current algorithm has to fail, because it doesn't
866 // know how to split edges. It should be possible to make the optimizer
867 // think in terms of edges, rather than blocks, and then split critical
870 // TODO: OptimizeSequences could generalized to be Interprocedural.
872 // TODO: Recognize that a bunch of other objc runtime calls have
873 // non-escaping arguments and non-releasing arguments, and may be
874 // non-autoreleasing.
876 // TODO: Sink autorelease calls as far as possible. Unfortunately we
877 // usually can't sink them past other calls, which would be the main
878 // case where it would be useful.
880 /// TODO: The pointer returned from objc_loadWeakRetained is retained.
882 #include "llvm/GlobalAlias.h"
883 #include "llvm/Constants.h"
884 #include "llvm/LLVMContext.h"
885 #include "llvm/Support/ErrorHandling.h"
886 #include "llvm/Support/CFG.h"
887 #include "llvm/ADT/PostOrderIterator.h"
888 #include "llvm/ADT/Statistic.h"
890 STATISTIC(NumNoops
, "Number of no-op objc calls eliminated");
891 STATISTIC(NumPartialNoops
, "Number of partially no-op objc calls eliminated");
892 STATISTIC(NumAutoreleases
,"Number of autoreleases converted to releases");
893 STATISTIC(NumRets
, "Number of return value forwarding "
894 "retain+autoreleaes eliminated");
895 STATISTIC(NumRRs
, "Number of retain+release paths eliminated");
896 STATISTIC(NumPeeps
, "Number of calls peephole-optimized");
899 /// ProvenanceAnalysis - This is similar to BasicAliasAnalysis, and it
900 /// uses many of the same techniques, except it uses special ObjC-specific
901 /// reasoning about pointer relationships.
902 class ProvenanceAnalysis
{
905 typedef std::pair
<const Value
*, const Value
*> ValuePairTy
;
906 typedef DenseMap
<ValuePairTy
, bool> CachedResultsTy
;
907 CachedResultsTy CachedResults
;
909 bool relatedCheck(const Value
*A
, const Value
*B
);
910 bool relatedSelect(const SelectInst
*A
, const Value
*B
);
911 bool relatedPHI(const PHINode
*A
, const Value
*B
);
914 void operator=(const ProvenanceAnalysis
&);
915 ProvenanceAnalysis(const ProvenanceAnalysis
&);
918 ProvenanceAnalysis() {}
920 void setAA(AliasAnalysis
*aa
) { AA
= aa
; }
922 AliasAnalysis
*getAA() const { return AA
; }
924 bool related(const Value
*A
, const Value
*B
);
927 CachedResults
.clear();
932 bool ProvenanceAnalysis::relatedSelect(const SelectInst
*A
, const Value
*B
) {
933 // If the values are Selects with the same condition, we can do a more precise
934 // check: just check for relations between the values on corresponding arms.
935 if (const SelectInst
*SB
= dyn_cast
<SelectInst
>(B
))
936 if (A
->getCondition() == SB
->getCondition()) {
937 if (related(A
->getTrueValue(), SB
->getTrueValue()))
939 if (related(A
->getFalseValue(), SB
->getFalseValue()))
944 // Check both arms of the Select node individually.
945 if (related(A
->getTrueValue(), B
))
947 if (related(A
->getFalseValue(), B
))
950 // The arms both checked out.
954 bool ProvenanceAnalysis::relatedPHI(const PHINode
*A
, const Value
*B
) {
955 // If the values are PHIs in the same block, we can do a more precise as well
956 // as efficient check: just check for relations between the values on
957 // corresponding edges.
958 if (const PHINode
*PNB
= dyn_cast
<PHINode
>(B
))
959 if (PNB
->getParent() == A
->getParent()) {
960 for (unsigned i
= 0, e
= A
->getNumIncomingValues(); i
!= e
; ++i
)
961 if (related(A
->getIncomingValue(i
),
962 PNB
->getIncomingValueForBlock(A
->getIncomingBlock(i
))))
967 // Check each unique source of the PHI node against B.
968 SmallPtrSet
<const Value
*, 4> UniqueSrc
;
969 for (unsigned i
= 0, e
= A
->getNumIncomingValues(); i
!= e
; ++i
) {
970 const Value
*PV1
= A
->getIncomingValue(i
);
971 if (UniqueSrc
.insert(PV1
) && related(PV1
, B
))
975 // All of the arms checked out.
979 /// isStoredObjCPointer - Test if the value of P, or any value covered by its
980 /// provenance, is ever stored within the function (not counting callees).
981 static bool isStoredObjCPointer(const Value
*P
) {
982 SmallPtrSet
<const Value
*, 8> Visited
;
983 SmallVector
<const Value
*, 8> Worklist
;
984 Worklist
.push_back(P
);
987 P
= Worklist
.pop_back_val();
988 for (Value::const_use_iterator UI
= P
->use_begin(), UE
= P
->use_end();
990 const User
*Ur
= *UI
;
991 if (isa
<StoreInst
>(Ur
)) {
992 if (UI
.getOperandNo() == 0)
993 // The pointer is stored.
995 // The pointed is stored through.
998 if (isa
<CallInst
>(Ur
))
999 // The pointer is passed as an argument, ignore this.
1001 if (isa
<PtrToIntInst
>(P
))
1002 // Assume the worst.
1004 if (Visited
.insert(Ur
))
1005 Worklist
.push_back(Ur
);
1007 } while (!Worklist
.empty());
1009 // Everything checked out.
1013 bool ProvenanceAnalysis::relatedCheck(const Value
*A
, const Value
*B
) {
1014 // Skip past provenance pass-throughs.
1015 A
= GetUnderlyingObjCPtr(A
);
1016 B
= GetUnderlyingObjCPtr(B
);
1022 // Ask regular AliasAnalysis, for a first approximation.
1023 switch (AA
->alias(A
, B
)) {
1024 case AliasAnalysis::NoAlias
:
1026 case AliasAnalysis::MustAlias
:
1027 case AliasAnalysis::PartialAlias
:
1029 case AliasAnalysis::MayAlias
:
1033 bool AIsIdentified
= IsObjCIdentifiedObject(A
);
1034 bool BIsIdentified
= IsObjCIdentifiedObject(B
);
1036 // An ObjC-Identified object can't alias a load if it is never locally stored.
1037 if (AIsIdentified
) {
1038 if (BIsIdentified
) {
1039 // If both pointers have provenance, they can be directly compared.
1043 if (isa
<LoadInst
>(B
))
1044 return isStoredObjCPointer(A
);
1047 if (BIsIdentified
&& isa
<LoadInst
>(A
))
1048 return isStoredObjCPointer(B
);
1051 // Special handling for PHI and Select.
1052 if (const PHINode
*PN
= dyn_cast
<PHINode
>(A
))
1053 return relatedPHI(PN
, B
);
1054 if (const PHINode
*PN
= dyn_cast
<PHINode
>(B
))
1055 return relatedPHI(PN
, A
);
1056 if (const SelectInst
*S
= dyn_cast
<SelectInst
>(A
))
1057 return relatedSelect(S
, B
);
1058 if (const SelectInst
*S
= dyn_cast
<SelectInst
>(B
))
1059 return relatedSelect(S
, A
);
1065 bool ProvenanceAnalysis::related(const Value
*A
, const Value
*B
) {
1066 // Begin by inserting a conservative value into the map. If the insertion
1067 // fails, we have the answer already. If it succeeds, leave it there until we
1068 // compute the real answer to guard against recursive queries.
1069 if (A
> B
) std::swap(A
, B
);
1070 std::pair
<CachedResultsTy::iterator
, bool> Pair
=
1071 CachedResults
.insert(std::make_pair(ValuePairTy(A
, B
), true));
1073 return Pair
.first
->second
;
1075 bool Result
= relatedCheck(A
, B
);
1076 CachedResults
[ValuePairTy(A
, B
)] = Result
;
1081 // Sequence - A sequence of states that a pointer may go through in which an
1082 // objc_retain and objc_release are actually needed.
1085 S_Retain
, ///< objc_retain(x)
1086 S_CanRelease
, ///< foo(x) -- x could possibly see a ref count decrement
1087 S_Use
, ///< any use of x
1088 S_Stop
, ///< like S_Release, but code motion is stopped
1089 S_Release
, ///< objc_release(x)
1090 S_MovableRelease
///< objc_release(x), !clang.imprecise_release
1094 static Sequence
MergeSeqs(Sequence A
, Sequence B
, bool TopDown
) {
1098 if (A
== S_None
|| B
== S_None
)
1101 // Note that we can't merge S_CanRelease and S_Use.
1102 if (A
> B
) std::swap(A
, B
);
1104 // Choose the side which is further along in the sequence.
1105 if (A
== S_Retain
&& (B
== S_CanRelease
|| B
== S_Use
))
1108 // Choose the side which is further along in the sequence.
1109 if ((A
== S_Use
|| A
== S_CanRelease
) &&
1110 (B
== S_Release
|| B
== S_Stop
|| B
== S_MovableRelease
))
1112 // If both sides are releases, choose the more conservative one.
1113 if (A
== S_Stop
&& (B
== S_Release
|| B
== S_MovableRelease
))
1115 if (A
== S_Release
&& B
== S_MovableRelease
)
1123 /// RRInfo - Unidirectional information about either a
1124 /// retain-decrement-use-release sequence or release-use-decrement-retain
1125 /// reverese sequence.
1127 /// KnownIncremented - After an objc_retain, the reference count of the
1128 /// referenced object is known to be positive. Similarly, before an
1129 /// objc_release, the reference count of the referenced object is known to
1130 /// be positive. If there are retain-release pairs in code regions where the
1131 /// retain count is known to be positive, they can be eliminated, regardless
1132 /// of any side effects between them.
1133 bool KnownIncremented
;
1135 /// IsRetainBlock - True if the Calls are objc_retainBlock calls (as
1136 /// opposed to objc_retain calls).
1139 /// IsTailCallRelease - True of the objc_release calls are all marked
1140 /// with the "tail" keyword.
1141 bool IsTailCallRelease
;
1143 /// ReleaseMetadata - If the Calls are objc_release calls and they all have
1144 /// a clang.imprecise_release tag, this is the metadata tag.
1145 MDNode
*ReleaseMetadata
;
1147 /// Calls - For a top-down sequence, the set of objc_retains or
1148 /// objc_retainBlocks. For bottom-up, the set of objc_releases.
1149 SmallPtrSet
<Instruction
*, 2> Calls
;
1151 /// ReverseInsertPts - The set of optimal insert positions for
1152 /// moving calls in the opposite sequence.
1153 SmallPtrSet
<Instruction
*, 2> ReverseInsertPts
;
1156 KnownIncremented(false), IsRetainBlock(false), IsTailCallRelease(false),
1157 ReleaseMetadata(0) {}
1163 void RRInfo::clear() {
1164 KnownIncremented
= false;
1165 IsRetainBlock
= false;
1166 IsTailCallRelease
= false;
1167 ReleaseMetadata
= 0;
1169 ReverseInsertPts
.clear();
1173 /// PtrState - This class summarizes several per-pointer runtime properties
1174 /// which are propogated through the flow graph.
1176 /// RefCount - The known minimum number of reference count increments.
1179 /// Seq - The current position in the sequence.
1183 /// RRI - Unidirectional information about the current sequence.
1184 /// TODO: Encapsulate this better.
1187 PtrState() : RefCount(0), Seq(S_None
) {}
1189 void IncrementRefCount() {
1190 if (RefCount
!= UINT_MAX
) ++RefCount
;
1193 void DecrementRefCount() {
1194 if (RefCount
!= 0) --RefCount
;
1197 void ClearRefCount() {
1201 bool IsKnownIncremented() const {
1202 return RefCount
> 0;
1205 void SetSeq(Sequence NewSeq
) {
1209 void SetSeqToRelease(MDNode
*M
) {
1210 if (Seq
== S_None
|| Seq
== S_Use
) {
1211 Seq
= M
? S_MovableRelease
: S_Release
;
1212 RRI
.ReleaseMetadata
= M
;
1213 } else if (Seq
!= S_MovableRelease
|| RRI
.ReleaseMetadata
!= M
) {
1215 RRI
.ReleaseMetadata
= 0;
1219 Sequence
GetSeq() const {
1223 void ClearSequenceProgress() {
1228 void Merge(const PtrState
&Other
, bool TopDown
);
1233 PtrState::Merge(const PtrState
&Other
, bool TopDown
) {
1234 Seq
= MergeSeqs(Seq
, Other
.Seq
, TopDown
);
1235 RefCount
= std::min(RefCount
, Other
.RefCount
);
1237 // We can't merge a plain objc_retain with an objc_retainBlock.
1238 if (RRI
.IsRetainBlock
!= Other
.RRI
.IsRetainBlock
)
1241 if (Seq
== S_None
) {
1244 // Conservatively merge the ReleaseMetadata information.
1245 if (RRI
.ReleaseMetadata
!= Other
.RRI
.ReleaseMetadata
)
1246 RRI
.ReleaseMetadata
= 0;
1248 RRI
.KnownIncremented
= RRI
.KnownIncremented
&& Other
.RRI
.KnownIncremented
;
1249 RRI
.IsTailCallRelease
= RRI
.IsTailCallRelease
&& Other
.RRI
.IsTailCallRelease
;
1250 RRI
.Calls
.insert(Other
.RRI
.Calls
.begin(), Other
.RRI
.Calls
.end());
1251 RRI
.ReverseInsertPts
.insert(Other
.RRI
.ReverseInsertPts
.begin(),
1252 Other
.RRI
.ReverseInsertPts
.end());
1257 /// BBState - Per-BasicBlock state.
1259 /// TopDownPathCount - The number of unique control paths from the entry
1260 /// which can reach this block.
1261 unsigned TopDownPathCount
;
1263 /// BottomUpPathCount - The number of unique control paths to exits
1264 /// from this block.
1265 unsigned BottomUpPathCount
;
1267 /// MapTy - A type for PerPtrTopDown and PerPtrBottomUp.
1268 typedef MapVector
<const Value
*, PtrState
> MapTy
;
1270 /// PerPtrTopDown - The top-down traversal uses this to record information
1271 /// known about a pointer at the bottom of each block.
1272 MapTy PerPtrTopDown
;
1274 /// PerPtrBottomUp - The bottom-up traversal uses this to record information
1275 /// known about a pointer at the top of each block.
1276 MapTy PerPtrBottomUp
;
1279 BBState() : TopDownPathCount(0), BottomUpPathCount(0) {}
1281 typedef MapTy::iterator ptr_iterator
;
1282 typedef MapTy::const_iterator ptr_const_iterator
;
1284 ptr_iterator
top_down_ptr_begin() { return PerPtrTopDown
.begin(); }
1285 ptr_iterator
top_down_ptr_end() { return PerPtrTopDown
.end(); }
1286 ptr_const_iterator
top_down_ptr_begin() const {
1287 return PerPtrTopDown
.begin();
1289 ptr_const_iterator
top_down_ptr_end() const {
1290 return PerPtrTopDown
.end();
1293 ptr_iterator
bottom_up_ptr_begin() { return PerPtrBottomUp
.begin(); }
1294 ptr_iterator
bottom_up_ptr_end() { return PerPtrBottomUp
.end(); }
1295 ptr_const_iterator
bottom_up_ptr_begin() const {
1296 return PerPtrBottomUp
.begin();
1298 ptr_const_iterator
bottom_up_ptr_end() const {
1299 return PerPtrBottomUp
.end();
1302 /// SetAsEntry - Mark this block as being an entry block, which has one
1303 /// path from the entry by definition.
1304 void SetAsEntry() { TopDownPathCount
= 1; }
1306 /// SetAsExit - Mark this block as being an exit block, which has one
1307 /// path to an exit by definition.
1308 void SetAsExit() { BottomUpPathCount
= 1; }
1310 PtrState
&getPtrTopDownState(const Value
*Arg
) {
1311 return PerPtrTopDown
[Arg
];
1314 PtrState
&getPtrBottomUpState(const Value
*Arg
) {
1315 return PerPtrBottomUp
[Arg
];
1318 void clearBottomUpPointers() {
1319 PerPtrTopDown
.clear();
1322 void clearTopDownPointers() {
1323 PerPtrTopDown
.clear();
1326 void InitFromPred(const BBState
&Other
);
1327 void InitFromSucc(const BBState
&Other
);
1328 void MergePred(const BBState
&Other
);
1329 void MergeSucc(const BBState
&Other
);
1331 /// GetAllPathCount - Return the number of possible unique paths from an
1332 /// entry to an exit which pass through this block. This is only valid
1333 /// after both the top-down and bottom-up traversals are complete.
1334 unsigned GetAllPathCount() const {
1335 return TopDownPathCount
* BottomUpPathCount
;
1340 void BBState::InitFromPred(const BBState
&Other
) {
1341 PerPtrTopDown
= Other
.PerPtrTopDown
;
1342 TopDownPathCount
= Other
.TopDownPathCount
;
1345 void BBState::InitFromSucc(const BBState
&Other
) {
1346 PerPtrBottomUp
= Other
.PerPtrBottomUp
;
1347 BottomUpPathCount
= Other
.BottomUpPathCount
;
1350 /// MergePred - The top-down traversal uses this to merge information about
1351 /// predecessors to form the initial state for a new block.
1352 void BBState::MergePred(const BBState
&Other
) {
1353 // Other.TopDownPathCount can be 0, in which case it is either dead or a
1354 // loop backedge. Loop backedges are special.
1355 TopDownPathCount
+= Other
.TopDownPathCount
;
1357 // For each entry in the other set, if our set has an entry with the same key,
1358 // merge the entries. Otherwise, copy the entry and merge it with an empty
1360 for (ptr_const_iterator MI
= Other
.top_down_ptr_begin(),
1361 ME
= Other
.top_down_ptr_end(); MI
!= ME
; ++MI
) {
1362 std::pair
<ptr_iterator
, bool> Pair
= PerPtrTopDown
.insert(*MI
);
1363 Pair
.first
->second
.Merge(Pair
.second
? PtrState() : MI
->second
,
1367 // For each entry in our set, if the other set doens't have an entry with the
1368 // same key, force it to merge with an empty entry.
1369 for (ptr_iterator MI
= top_down_ptr_begin(),
1370 ME
= top_down_ptr_end(); MI
!= ME
; ++MI
)
1371 if (Other
.PerPtrTopDown
.find(MI
->first
) == Other
.PerPtrTopDown
.end())
1372 MI
->second
.Merge(PtrState(), /*TopDown=*/true);
1375 /// MergeSucc - The bottom-up traversal uses this to merge information about
1376 /// successors to form the initial state for a new block.
1377 void BBState::MergeSucc(const BBState
&Other
) {
1378 // Other.BottomUpPathCount can be 0, in which case it is either dead or a
1379 // loop backedge. Loop backedges are special.
1380 BottomUpPathCount
+= Other
.BottomUpPathCount
;
1382 // For each entry in the other set, if our set has an entry with the
1383 // same key, merge the entries. Otherwise, copy the entry and merge
1384 // it with an empty entry.
1385 for (ptr_const_iterator MI
= Other
.bottom_up_ptr_begin(),
1386 ME
= Other
.bottom_up_ptr_end(); MI
!= ME
; ++MI
) {
1387 std::pair
<ptr_iterator
, bool> Pair
= PerPtrBottomUp
.insert(*MI
);
1388 Pair
.first
->second
.Merge(Pair
.second
? PtrState() : MI
->second
,
1392 // For each entry in our set, if the other set doens't have an entry
1393 // with the same key, force it to merge with an empty entry.
1394 for (ptr_iterator MI
= bottom_up_ptr_begin(),
1395 ME
= bottom_up_ptr_end(); MI
!= ME
; ++MI
)
1396 if (Other
.PerPtrBottomUp
.find(MI
->first
) == Other
.PerPtrBottomUp
.end())
1397 MI
->second
.Merge(PtrState(), /*TopDown=*/false);
1401 /// ObjCARCOpt - The main ARC optimization pass.
1402 class ObjCARCOpt
: public FunctionPass
{
1404 ProvenanceAnalysis PA
;
1406 /// Run - A flag indicating whether this optimization pass should run.
1409 /// RetainFunc, RelaseFunc - Declarations for objc_retain,
1410 /// objc_retainBlock, and objc_release.
1411 Function
*RetainFunc
, *RetainBlockFunc
, *RetainRVFunc
, *ReleaseFunc
;
1413 /// RetainRVCallee, etc. - Declarations for ObjC runtime
1414 /// functions, for use in creating calls to them. These are initialized
1415 /// lazily to avoid cluttering up the Module with unused declarations.
1416 Constant
*RetainRVCallee
, *AutoreleaseRVCallee
, *ReleaseCallee
,
1417 *RetainCallee
, *AutoreleaseCallee
;
1419 /// UsedInThisFunciton - Flags which determine whether each of the
1420 /// interesting runtine functions is in fact used in the current function.
1421 unsigned UsedInThisFunction
;
1423 /// ImpreciseReleaseMDKind - The Metadata Kind for clang.imprecise_release
1425 unsigned ImpreciseReleaseMDKind
;
1427 Constant
*getRetainRVCallee(Module
*M
);
1428 Constant
*getAutoreleaseRVCallee(Module
*M
);
1429 Constant
*getReleaseCallee(Module
*M
);
1430 Constant
*getRetainCallee(Module
*M
);
1431 Constant
*getAutoreleaseCallee(Module
*M
);
1433 void OptimizeRetainCall(Function
&F
, Instruction
*Retain
);
1434 bool OptimizeRetainRVCall(Function
&F
, Instruction
*RetainRV
);
1435 void OptimizeAutoreleaseRVCall(Function
&F
, Instruction
*AutoreleaseRV
);
1436 void OptimizeIndividualCalls(Function
&F
);
1438 void CheckForCFGHazards(const BasicBlock
*BB
,
1439 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
1440 BBState
&MyStates
) const;
1441 bool VisitBottomUp(BasicBlock
*BB
,
1442 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
1443 MapVector
<Value
*, RRInfo
> &Retains
);
1444 bool VisitTopDown(BasicBlock
*BB
,
1445 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
1446 DenseMap
<Value
*, RRInfo
> &Releases
);
1447 bool Visit(Function
&F
,
1448 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
1449 MapVector
<Value
*, RRInfo
> &Retains
,
1450 DenseMap
<Value
*, RRInfo
> &Releases
);
1452 void MoveCalls(Value
*Arg
, RRInfo
&RetainsToMove
, RRInfo
&ReleasesToMove
,
1453 MapVector
<Value
*, RRInfo
> &Retains
,
1454 DenseMap
<Value
*, RRInfo
> &Releases
,
1455 SmallVectorImpl
<Instruction
*> &DeadInsts
);
1457 bool PerformCodePlacement(DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
1458 MapVector
<Value
*, RRInfo
> &Retains
,
1459 DenseMap
<Value
*, RRInfo
> &Releases
);
1461 void OptimizeWeakCalls(Function
&F
);
1463 bool OptimizeSequences(Function
&F
);
1465 void OptimizeReturns(Function
&F
);
1467 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
1468 virtual bool doInitialization(Module
&M
);
1469 virtual bool runOnFunction(Function
&F
);
1470 virtual void releaseMemory();
1474 ObjCARCOpt() : FunctionPass(ID
) {
1475 initializeObjCARCOptPass(*PassRegistry::getPassRegistry());
1480 char ObjCARCOpt::ID
= 0;
1481 INITIALIZE_PASS_BEGIN(ObjCARCOpt
,
1482 "objc-arc", "ObjC ARC optimization", false, false)
1483 INITIALIZE_PASS_DEPENDENCY(ObjCARCAliasAnalysis
)
1484 INITIALIZE_PASS_END(ObjCARCOpt
,
1485 "objc-arc", "ObjC ARC optimization", false, false)
1487 Pass
*llvm::createObjCARCOptPass() {
1488 return new ObjCARCOpt();
1491 void ObjCARCOpt::getAnalysisUsage(AnalysisUsage
&AU
) const {
1492 AU
.addRequired
<ObjCARCAliasAnalysis
>();
1493 AU
.addRequired
<AliasAnalysis
>();
1494 // ARC optimization doesn't currently split critical edges.
1495 AU
.setPreservesCFG();
1498 Constant
*ObjCARCOpt::getRetainRVCallee(Module
*M
) {
1499 if (!RetainRVCallee
) {
1500 LLVMContext
&C
= M
->getContext();
1501 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
1502 std::vector
<const Type
*> Params
;
1503 Params
.push_back(I8X
);
1504 const FunctionType
*FTy
=
1505 FunctionType::get(I8X
, Params
, /*isVarArg=*/false);
1506 AttrListPtr Attributes
;
1507 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
1509 M
->getOrInsertFunction("objc_retainAutoreleasedReturnValue", FTy
,
1512 return RetainRVCallee
;
1515 Constant
*ObjCARCOpt::getAutoreleaseRVCallee(Module
*M
) {
1516 if (!AutoreleaseRVCallee
) {
1517 LLVMContext
&C
= M
->getContext();
1518 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
1519 std::vector
<const Type
*> Params
;
1520 Params
.push_back(I8X
);
1521 const FunctionType
*FTy
=
1522 FunctionType::get(I8X
, Params
, /*isVarArg=*/false);
1523 AttrListPtr Attributes
;
1524 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
1525 AutoreleaseRVCallee
=
1526 M
->getOrInsertFunction("objc_autoreleaseReturnValue", FTy
,
1529 return AutoreleaseRVCallee
;
1532 Constant
*ObjCARCOpt::getReleaseCallee(Module
*M
) {
1533 if (!ReleaseCallee
) {
1534 LLVMContext
&C
= M
->getContext();
1535 std::vector
<const Type
*> Params
;
1536 Params
.push_back(PointerType::getUnqual(Type::getInt8Ty(C
)));
1537 AttrListPtr Attributes
;
1538 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
1540 M
->getOrInsertFunction(
1542 FunctionType::get(Type::getVoidTy(C
), Params
, /*isVarArg=*/false),
1545 return ReleaseCallee
;
1548 Constant
*ObjCARCOpt::getRetainCallee(Module
*M
) {
1549 if (!RetainCallee
) {
1550 LLVMContext
&C
= M
->getContext();
1551 std::vector
<const Type
*> Params
;
1552 Params
.push_back(PointerType::getUnqual(Type::getInt8Ty(C
)));
1553 AttrListPtr Attributes
;
1554 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
1556 M
->getOrInsertFunction(
1558 FunctionType::get(Params
[0], Params
, /*isVarArg=*/false),
1561 return RetainCallee
;
1564 Constant
*ObjCARCOpt::getAutoreleaseCallee(Module
*M
) {
1565 if (!AutoreleaseCallee
) {
1566 LLVMContext
&C
= M
->getContext();
1567 std::vector
<const Type
*> Params
;
1568 Params
.push_back(PointerType::getUnqual(Type::getInt8Ty(C
)));
1569 AttrListPtr Attributes
;
1570 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
1572 M
->getOrInsertFunction(
1574 FunctionType::get(Params
[0], Params
, /*isVarArg=*/false),
1577 return AutoreleaseCallee
;
1580 /// CanAlterRefCount - Test whether the given instruction can result in a
1581 /// reference count modification (positive or negative) for the pointer's
1584 CanAlterRefCount(const Instruction
*Inst
, const Value
*Ptr
,
1585 ProvenanceAnalysis
&PA
, InstructionClass Class
) {
1587 case IC_Autorelease
:
1588 case IC_AutoreleaseRV
:
1590 // These operations never directly modify a reference count.
1595 ImmutableCallSite CS
= static_cast<const Value
*>(Inst
);
1596 assert(CS
&& "Only calls can alter reference counts!");
1598 // See if AliasAnalysis can help us with the call.
1599 AliasAnalysis::ModRefBehavior MRB
= PA
.getAA()->getModRefBehavior(CS
);
1600 if (AliasAnalysis::onlyReadsMemory(MRB
))
1602 if (AliasAnalysis::onlyAccessesArgPointees(MRB
)) {
1603 for (ImmutableCallSite::arg_iterator I
= CS
.arg_begin(), E
= CS
.arg_end();
1605 const Value
*Op
= *I
;
1606 if (IsPotentialUse(Op
) && PA
.related(Ptr
, Op
))
1612 // Assume the worst.
1616 /// CanUse - Test whether the given instruction can "use" the given pointer's
1617 /// object in a way that requires the reference count to be positive.
1619 CanUse(const Instruction
*Inst
, const Value
*Ptr
, ProvenanceAnalysis
&PA
,
1620 InstructionClass Class
) {
1621 // IC_Call operations (as opposed to IC_CallOrUser) never "use" objc pointers.
1622 if (Class
== IC_Call
)
1625 // Consider various instructions which may have pointer arguments which are
1627 if (const ICmpInst
*ICI
= dyn_cast
<ICmpInst
>(Inst
)) {
1628 // Comparing a pointer with null, or any other constant, isn't really a use,
1629 // because we don't care what the pointer points to, or about the values
1630 // of any other dynamic reference-counted pointers.
1631 if (!IsPotentialUse(ICI
->getOperand(1)))
1633 } else if (ImmutableCallSite CS
= static_cast<const Value
*>(Inst
)) {
1634 // For calls, just check the arguments (and not the callee operand).
1635 for (ImmutableCallSite::arg_iterator OI
= CS
.arg_begin(),
1636 OE
= CS
.arg_end(); OI
!= OE
; ++OI
) {
1637 const Value
*Op
= *OI
;
1638 if (IsPotentialUse(Op
) && PA
.related(Ptr
, Op
))
1642 } else if (const StoreInst
*SI
= dyn_cast
<StoreInst
>(Inst
)) {
1643 // Special-case stores, because we don't care about the stored value, just
1644 // the store address.
1645 const Value
*Op
= GetUnderlyingObjCPtr(SI
->getPointerOperand());
1646 // If we can't tell what the underlying object was, assume there is a
1648 return IsPotentialUse(Op
) && PA
.related(Op
, Ptr
);
1651 // Check each operand for a match.
1652 for (User::const_op_iterator OI
= Inst
->op_begin(), OE
= Inst
->op_end();
1654 const Value
*Op
= *OI
;
1655 if (IsPotentialUse(Op
) && PA
.related(Ptr
, Op
))
1661 /// CanInterruptRV - Test whether the given instruction can autorelease
1662 /// any pointer or cause an autoreleasepool pop.
1664 CanInterruptRV(InstructionClass Class
) {
1666 case IC_AutoreleasepoolPop
:
1669 case IC_Autorelease
:
1670 case IC_AutoreleaseRV
:
1671 case IC_FusedRetainAutorelease
:
1672 case IC_FusedRetainAutoreleaseRV
:
1680 /// DependenceKind - There are several kinds of dependence-like concepts in
1682 enum DependenceKind
{
1683 NeedsPositiveRetainCount
,
1684 CanChangeRetainCount
,
1685 RetainAutoreleaseDep
, ///< Blocks objc_retainAutorelease.
1686 RetainAutoreleaseRVDep
, ///< Blocks objc_retainAutoreleaseReturnValue.
1687 RetainRVDep
///< Blocks objc_retainAutoreleasedReturnValue.
1691 /// Depends - Test if there can be dependencies on Inst through Arg. This
1692 /// function only tests dependencies relevant for removing pairs of calls.
1694 Depends(DependenceKind Flavor
, Instruction
*Inst
, const Value
*Arg
,
1695 ProvenanceAnalysis
&PA
) {
1696 // If we've reached the definition of Arg, stop.
1701 case NeedsPositiveRetainCount
: {
1702 InstructionClass Class
= GetInstructionClass(Inst
);
1704 case IC_AutoreleasepoolPop
:
1705 case IC_AutoreleasepoolPush
:
1709 return CanUse(Inst
, Arg
, PA
, Class
);
1713 case CanChangeRetainCount
: {
1714 InstructionClass Class
= GetInstructionClass(Inst
);
1716 case IC_AutoreleasepoolPop
:
1717 // Conservatively assume this can decrement any count.
1719 case IC_AutoreleasepoolPush
:
1723 return CanAlterRefCount(Inst
, Arg
, PA
, Class
);
1727 case RetainAutoreleaseDep
:
1728 switch (GetBasicInstructionClass(Inst
)) {
1729 case IC_AutoreleasepoolPop
:
1730 // Don't merge an objc_autorelease with an objc_retain inside a different
1731 // autoreleasepool scope.
1735 // Check for a retain of the same pointer for merging.
1736 return GetObjCArg(Inst
) == Arg
;
1738 // Nothing else matters for objc_retainAutorelease formation.
1743 case RetainAutoreleaseRVDep
: {
1744 InstructionClass Class
= GetBasicInstructionClass(Inst
);
1748 // Check for a retain of the same pointer for merging.
1749 return GetObjCArg(Inst
) == Arg
;
1751 // Anything that can autorelease interrupts
1752 // retainAutoreleaseReturnValue formation.
1753 return CanInterruptRV(Class
);
1759 return CanInterruptRV(GetBasicInstructionClass(Inst
));
1762 llvm_unreachable("Invalid dependence flavor");
1766 /// FindDependencies - Walk up the CFG from StartPos (which is in StartBB) and
1767 /// find local and non-local dependencies on Arg.
1768 /// TODO: Cache results?
1770 FindDependencies(DependenceKind Flavor
,
1772 BasicBlock
*StartBB
, Instruction
*StartInst
,
1773 SmallPtrSet
<Instruction
*, 4> &DependingInstructions
,
1774 SmallPtrSet
<const BasicBlock
*, 4> &Visited
,
1775 ProvenanceAnalysis
&PA
) {
1776 BasicBlock::iterator StartPos
= StartInst
;
1778 SmallVector
<std::pair
<BasicBlock
*, BasicBlock::iterator
>, 4> Worklist
;
1779 Worklist
.push_back(std::make_pair(StartBB
, StartPos
));
1781 std::pair
<BasicBlock
*, BasicBlock::iterator
> Pair
=
1782 Worklist
.pop_back_val();
1783 BasicBlock
*LocalStartBB
= Pair
.first
;
1784 BasicBlock::iterator LocalStartPos
= Pair
.second
;
1785 BasicBlock::iterator StartBBBegin
= LocalStartBB
->begin();
1787 if (LocalStartPos
== StartBBBegin
) {
1788 pred_iterator
PI(LocalStartBB
), PE(LocalStartBB
, false);
1790 // If we've reached the function entry, produce a null dependence.
1791 DependingInstructions
.insert(0);
1793 // Add the predecessors to the worklist.
1795 BasicBlock
*PredBB
= *PI
;
1796 if (Visited
.insert(PredBB
))
1797 Worklist
.push_back(std::make_pair(PredBB
, PredBB
->end()));
1798 } while (++PI
!= PE
);
1802 Instruction
*Inst
= --LocalStartPos
;
1803 if (Depends(Flavor
, Inst
, Arg
, PA
)) {
1804 DependingInstructions
.insert(Inst
);
1808 } while (!Worklist
.empty());
1810 // Determine whether the original StartBB post-dominates all of the blocks we
1811 // visited. If not, insert a sentinal indicating that most optimizations are
1813 for (SmallPtrSet
<const BasicBlock
*, 4>::const_iterator I
= Visited
.begin(),
1814 E
= Visited
.end(); I
!= E
; ++I
) {
1815 const BasicBlock
*BB
= *I
;
1818 const TerminatorInst
*TI
= cast
<TerminatorInst
>(&BB
->back());
1819 for (succ_const_iterator
SI(TI
), SE(TI
, false); SI
!= SE
; ++SI
) {
1820 const BasicBlock
*Succ
= *SI
;
1821 if (Succ
!= StartBB
&& !Visited
.count(Succ
)) {
1822 DependingInstructions
.insert(reinterpret_cast<Instruction
*>(-1));
1829 static bool isNullOrUndef(const Value
*V
) {
1830 return isa
<ConstantPointerNull
>(V
) || isa
<UndefValue
>(V
);
1833 static bool isNoopInstruction(const Instruction
*I
) {
1834 return isa
<BitCastInst
>(I
) ||
1835 (isa
<GetElementPtrInst
>(I
) &&
1836 cast
<GetElementPtrInst
>(I
)->hasAllZeroIndices());
1839 /// OptimizeRetainCall - Turn objc_retain into
1840 /// objc_retainAutoreleasedReturnValue if the operand is a return value.
1842 ObjCARCOpt::OptimizeRetainCall(Function
&F
, Instruction
*Retain
) {
1843 CallSite
CS(GetObjCArg(Retain
));
1844 Instruction
*Call
= CS
.getInstruction();
1846 if (Call
->getParent() != Retain
->getParent()) return;
1848 // Check that the call is next to the retain.
1849 BasicBlock::iterator I
= Call
;
1851 while (isNoopInstruction(I
)) ++I
;
1855 // Turn it to an objc_retainAutoreleasedReturnValue..
1858 cast
<CallInst
>(Retain
)->setCalledFunction(getRetainRVCallee(F
.getParent()));
1861 /// OptimizeRetainRVCall - Turn objc_retainAutoreleasedReturnValue into
1862 /// objc_retain if the operand is not a return value. Or, if it can be
1863 /// paired with an objc_autoreleaseReturnValue, delete the pair and
1866 ObjCARCOpt::OptimizeRetainRVCall(Function
&F
, Instruction
*RetainRV
) {
1867 // Check for the argument being from an immediately preceding call.
1868 Value
*Arg
= GetObjCArg(RetainRV
);
1870 if (Instruction
*Call
= CS
.getInstruction())
1871 if (Call
->getParent() == RetainRV
->getParent()) {
1872 BasicBlock::iterator I
= Call
;
1874 while (isNoopInstruction(I
)) ++I
;
1875 if (&*I
== RetainRV
)
1879 // Check for being preceded by an objc_autoreleaseReturnValue on the same
1880 // pointer. In this case, we can delete the pair.
1881 BasicBlock::iterator I
= RetainRV
, Begin
= RetainRV
->getParent()->begin();
1883 do --I
; while (I
!= Begin
&& isNoopInstruction(I
));
1884 if (GetBasicInstructionClass(I
) == IC_AutoreleaseRV
&&
1885 GetObjCArg(I
) == Arg
) {
1888 EraseInstruction(I
);
1889 EraseInstruction(RetainRV
);
1894 // Turn it to a plain objc_retain.
1897 cast
<CallInst
>(RetainRV
)->setCalledFunction(getRetainCallee(F
.getParent()));
1901 /// OptimizeAutoreleaseRVCall - Turn objc_autoreleaseReturnValue into
1902 /// objc_autorelease if the result is not used as a return value.
1904 ObjCARCOpt::OptimizeAutoreleaseRVCall(Function
&F
, Instruction
*AutoreleaseRV
) {
1905 // Check for a return of the pointer value.
1906 const Value
*Ptr
= GetObjCArg(AutoreleaseRV
);
1907 for (Value::const_use_iterator UI
= Ptr
->use_begin(), UE
= Ptr
->use_end();
1909 const User
*I
= *UI
;
1910 if (isa
<ReturnInst
>(I
) || GetBasicInstructionClass(I
) == IC_RetainRV
)
1916 cast
<CallInst
>(AutoreleaseRV
)->
1917 setCalledFunction(getAutoreleaseCallee(F
.getParent()));
1920 /// OptimizeIndividualCalls - Visit each call, one at a time, and make
1921 /// simplifications without doing any additional analysis.
1922 void ObjCARCOpt::OptimizeIndividualCalls(Function
&F
) {
1923 // Reset all the flags in preparation for recomputing them.
1924 UsedInThisFunction
= 0;
1926 // Visit all objc_* calls in F.
1927 for (inst_iterator I
= inst_begin(&F
), E
= inst_end(&F
); I
!= E
; ) {
1928 Instruction
*Inst
= &*I
++;
1929 InstructionClass Class
= GetBasicInstructionClass(Inst
);
1934 // Delete no-op casts. These function calls have special semantics, but
1935 // the semantics are entirely implemented via lowering in the front-end,
1936 // so by the time they reach the optimizer, they are just no-op calls
1937 // which return their argument.
1939 // There are gray areas here, as the ability to cast reference-counted
1940 // pointers to raw void* and back allows code to break ARC assumptions,
1941 // however these are currently considered to be unimportant.
1945 EraseInstruction(Inst
);
1948 // If the pointer-to-weak-pointer is null, it's undefined behavior.
1951 case IC_LoadWeakRetained
:
1953 case IC_DestroyWeak
: {
1954 CallInst
*CI
= cast
<CallInst
>(Inst
);
1955 if (isNullOrUndef(CI
->getArgOperand(0))) {
1956 const Type
*Ty
= CI
->getArgOperand(0)->getType();
1957 new StoreInst(UndefValue::get(cast
<PointerType
>(Ty
)->getElementType()),
1958 Constant::getNullValue(Ty
),
1960 CI
->replaceAllUsesWith(UndefValue::get(CI
->getType()));
1961 CI
->eraseFromParent();
1968 CallInst
*CI
= cast
<CallInst
>(Inst
);
1969 if (isNullOrUndef(CI
->getArgOperand(0)) ||
1970 isNullOrUndef(CI
->getArgOperand(1))) {
1971 const Type
*Ty
= CI
->getArgOperand(0)->getType();
1972 new StoreInst(UndefValue::get(cast
<PointerType
>(Ty
)->getElementType()),
1973 Constant::getNullValue(Ty
),
1975 CI
->replaceAllUsesWith(UndefValue::get(CI
->getType()));
1976 CI
->eraseFromParent();
1982 OptimizeRetainCall(F
, Inst
);
1985 if (OptimizeRetainRVCall(F
, Inst
))
1988 case IC_AutoreleaseRV
:
1989 OptimizeAutoreleaseRVCall(F
, Inst
);
1993 // objc_autorelease(x) -> objc_release(x) if x is otherwise unused.
1994 if (IsAutorelease(Class
) && Inst
->use_empty()) {
1995 CallInst
*Call
= cast
<CallInst
>(Inst
);
1996 const Value
*Arg
= Call
->getArgOperand(0);
1997 Arg
= FindSingleUseIdentifiedObject(Arg
);
2002 // Create the declaration lazily.
2003 LLVMContext
&C
= Inst
->getContext();
2005 CallInst::Create(getReleaseCallee(F
.getParent()),
2006 Call
->getArgOperand(0), "", Call
);
2007 NewCall
->setMetadata(ImpreciseReleaseMDKind
,
2008 MDNode::get(C
, ArrayRef
<Value
*>()));
2009 EraseInstruction(Call
);
2015 // For functions which can never be passed stack arguments, add
2017 if (IsAlwaysTail(Class
)) {
2019 cast
<CallInst
>(Inst
)->setTailCall();
2022 // Set nounwind as needed.
2023 if (IsNoThrow(Class
)) {
2025 cast
<CallInst
>(Inst
)->setDoesNotThrow();
2028 if (!IsNoopOnNull(Class
)) {
2029 UsedInThisFunction
|= 1 << Class
;
2033 const Value
*Arg
= GetObjCArg(Inst
);
2035 // ARC calls with null are no-ops. Delete them.
2036 if (isNullOrUndef(Arg
)) {
2039 EraseInstruction(Inst
);
2043 // Keep track of which of retain, release, autorelease, and retain_block
2044 // are actually present in this function.
2045 UsedInThisFunction
|= 1 << Class
;
2047 // If Arg is a PHI, and one or more incoming values to the
2048 // PHI are null, and the call is control-equivalent to the PHI, and there
2049 // are no relevant side effects between the PHI and the call, the call
2050 // could be pushed up to just those paths with non-null incoming values.
2051 // For now, don't bother splitting critical edges for this.
2052 SmallVector
<std::pair
<Instruction
*, const Value
*>, 4> Worklist
;
2053 Worklist
.push_back(std::make_pair(Inst
, Arg
));
2055 std::pair
<Instruction
*, const Value
*> Pair
= Worklist
.pop_back_val();
2059 const PHINode
*PN
= dyn_cast
<PHINode
>(Arg
);
2062 // Determine if the PHI has any null operands, or any incoming
2064 bool HasNull
= false;
2065 bool HasCriticalEdges
= false;
2066 for (unsigned i
= 0, e
= PN
->getNumIncomingValues(); i
!= e
; ++i
) {
2068 StripPointerCastsAndObjCCalls(PN
->getIncomingValue(i
));
2069 if (isNullOrUndef(Incoming
))
2071 else if (cast
<TerminatorInst
>(PN
->getIncomingBlock(i
)->back())
2072 .getNumSuccessors() != 1) {
2073 HasCriticalEdges
= true;
2077 // If we have null operands and no critical edges, optimize.
2078 if (!HasCriticalEdges
&& HasNull
) {
2079 SmallPtrSet
<Instruction
*, 4> DependingInstructions
;
2080 SmallPtrSet
<const BasicBlock
*, 4> Visited
;
2082 // Check that there is nothing that cares about the reference
2083 // count between the call and the phi.
2084 FindDependencies(NeedsPositiveRetainCount
, Arg
,
2085 Inst
->getParent(), Inst
,
2086 DependingInstructions
, Visited
, PA
);
2087 if (DependingInstructions
.size() == 1 &&
2088 *DependingInstructions
.begin() == PN
) {
2091 // Clone the call into each predecessor that has a non-null value.
2092 CallInst
*CInst
= cast
<CallInst
>(Inst
);
2093 const Type
*ParamTy
= CInst
->getArgOperand(0)->getType();
2094 for (unsigned i
= 0, e
= PN
->getNumIncomingValues(); i
!= e
; ++i
) {
2096 StripPointerCastsAndObjCCalls(PN
->getIncomingValue(i
));
2097 if (!isNullOrUndef(Incoming
)) {
2098 CallInst
*Clone
= cast
<CallInst
>(CInst
->clone());
2099 Value
*Op
= PN
->getIncomingValue(i
);
2100 Instruction
*InsertPos
= &PN
->getIncomingBlock(i
)->back();
2101 if (Op
->getType() != ParamTy
)
2102 Op
= new BitCastInst(Op
, ParamTy
, "", InsertPos
);
2103 Clone
->setArgOperand(0, Op
);
2104 Clone
->insertBefore(InsertPos
);
2105 Worklist
.push_back(std::make_pair(Clone
, Incoming
));
2108 // Erase the original call.
2109 EraseInstruction(CInst
);
2113 } while (!Worklist
.empty());
2117 /// CheckForCFGHazards - Check for critical edges, loop boundaries, irreducible
2118 /// control flow, or other CFG structures where moving code across the edge
2119 /// would result in it being executed more.
2121 ObjCARCOpt::CheckForCFGHazards(const BasicBlock
*BB
,
2122 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
2123 BBState
&MyStates
) const {
2124 // If any top-down local-use or possible-dec has a succ which is earlier in
2125 // the sequence, forget it.
2126 for (BBState::ptr_const_iterator I
= MyStates
.top_down_ptr_begin(),
2127 E
= MyStates
.top_down_ptr_end(); I
!= E
; ++I
)
2128 switch (I
->second
.GetSeq()) {
2131 const Value
*Arg
= I
->first
;
2132 const TerminatorInst
*TI
= cast
<TerminatorInst
>(&BB
->back());
2133 bool SomeSuccHasSame
= false;
2134 bool AllSuccsHaveSame
= true;
2135 for (succ_const_iterator
SI(TI
), SE(TI
, false); SI
!= SE
; ++SI
)
2136 switch (BBStates
[*SI
].getPtrBottomUpState(Arg
).GetSeq()) {
2139 MyStates
.getPtrTopDownState(Arg
).ClearSequenceProgress();
2140 SomeSuccHasSame
= false;
2143 SomeSuccHasSame
= true;
2147 case S_MovableRelease
:
2148 AllSuccsHaveSame
= false;
2151 llvm_unreachable("bottom-up pointer in retain state!");
2153 // If the state at the other end of any of the successor edges
2154 // matches the current state, require all edges to match. This
2155 // guards against loops in the middle of a sequence.
2156 if (SomeSuccHasSame
&& !AllSuccsHaveSame
)
2157 MyStates
.getPtrTopDownState(Arg
).ClearSequenceProgress();
2159 case S_CanRelease
: {
2160 const Value
*Arg
= I
->first
;
2161 const TerminatorInst
*TI
= cast
<TerminatorInst
>(&BB
->back());
2162 bool SomeSuccHasSame
= false;
2163 bool AllSuccsHaveSame
= true;
2164 for (succ_const_iterator
SI(TI
), SE(TI
, false); SI
!= SE
; ++SI
)
2165 switch (BBStates
[*SI
].getPtrBottomUpState(Arg
).GetSeq()) {
2167 MyStates
.getPtrTopDownState(Arg
).ClearSequenceProgress();
2168 SomeSuccHasSame
= false;
2171 SomeSuccHasSame
= true;
2175 case S_MovableRelease
:
2177 AllSuccsHaveSame
= false;
2180 llvm_unreachable("bottom-up pointer in retain state!");
2182 // If the state at the other end of any of the successor edges
2183 // matches the current state, require all edges to match. This
2184 // guards against loops in the middle of a sequence.
2185 if (SomeSuccHasSame
&& !AllSuccsHaveSame
)
2186 MyStates
.getPtrTopDownState(Arg
).ClearSequenceProgress();
2192 ObjCARCOpt::VisitBottomUp(BasicBlock
*BB
,
2193 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
2194 MapVector
<Value
*, RRInfo
> &Retains
) {
2195 bool NestingDetected
= false;
2196 BBState
&MyStates
= BBStates
[BB
];
2198 // Merge the states from each successor to compute the initial state
2199 // for the current block.
2200 const TerminatorInst
*TI
= cast
<TerminatorInst
>(&BB
->back());
2201 succ_const_iterator
SI(TI
), SE(TI
, false);
2203 MyStates
.SetAsExit();
2206 const BasicBlock
*Succ
= *SI
++;
2209 DenseMap
<const BasicBlock
*, BBState
>::iterator I
= BBStates
.find(Succ
);
2210 if (I
== BBStates
.end())
2212 MyStates
.InitFromSucc(I
->second
);
2216 I
= BBStates
.find(Succ
);
2217 if (I
!= BBStates
.end())
2218 MyStates
.MergeSucc(I
->second
);
2224 // Visit all the instructions, bottom-up.
2225 for (BasicBlock::iterator I
= BB
->end(), E
= BB
->begin(); I
!= E
; --I
) {
2226 Instruction
*Inst
= llvm::prior(I
);
2227 InstructionClass Class
= GetInstructionClass(Inst
);
2228 const Value
*Arg
= 0;
2232 Arg
= GetObjCArg(Inst
);
2234 PtrState
&S
= MyStates
.getPtrBottomUpState(Arg
);
2236 // If we see two releases in a row on the same pointer. If so, make
2237 // a note, and we'll cicle back to revisit it after we've
2238 // hopefully eliminated the second release, which may allow us to
2239 // eliminate the first release too.
2240 // Theoretically we could implement removal of nested retain+release
2241 // pairs by making PtrState hold a stack of states, but this is
2242 // simple and avoids adding overhead for the non-nested case.
2243 if (S
.GetSeq() == S_Release
|| S
.GetSeq() == S_MovableRelease
)
2244 NestingDetected
= true;
2246 S
.SetSeqToRelease(Inst
->getMetadata(ImpreciseReleaseMDKind
));
2248 S
.RRI
.KnownIncremented
= S
.IsKnownIncremented();
2249 S
.RRI
.IsTailCallRelease
= cast
<CallInst
>(Inst
)->isTailCall();
2250 S
.RRI
.Calls
.insert(Inst
);
2252 S
.IncrementRefCount();
2255 case IC_RetainBlock
:
2258 Arg
= GetObjCArg(Inst
);
2260 PtrState
&S
= MyStates
.getPtrBottomUpState(Arg
);
2261 S
.DecrementRefCount();
2263 switch (S
.GetSeq()) {
2266 case S_MovableRelease
:
2268 S
.RRI
.ReverseInsertPts
.clear();
2271 // Don't do retain+release tracking for IC_RetainRV, because it's
2272 // better to let it remain as the first instruction after a call.
2273 if (Class
!= IC_RetainRV
) {
2274 S
.RRI
.IsRetainBlock
= Class
== IC_RetainBlock
;
2275 Retains
[Inst
] = S
.RRI
;
2277 S
.ClearSequenceProgress();
2282 llvm_unreachable("bottom-up pointer in retain state!");
2286 case IC_AutoreleasepoolPop
:
2287 // Conservatively, clear MyStates for all known pointers.
2288 MyStates
.clearBottomUpPointers();
2290 case IC_AutoreleasepoolPush
:
2292 // These are irrelevant.
2298 // Consider any other possible effects of this instruction on each
2299 // pointer being tracked.
2300 for (BBState::ptr_iterator MI
= MyStates
.bottom_up_ptr_begin(),
2301 ME
= MyStates
.bottom_up_ptr_end(); MI
!= ME
; ++MI
) {
2302 const Value
*Ptr
= MI
->first
;
2304 continue; // Handled above.
2305 PtrState
&S
= MI
->second
;
2306 Sequence Seq
= S
.GetSeq();
2308 // Check for possible retains and releases.
2309 if (CanAlterRefCount(Inst
, Ptr
, PA
, Class
)) {
2310 // Check for a retain (we're going bottom-up here).
2311 S
.DecrementRefCount();
2313 // Check for a release.
2314 if (!IsRetain(Class
) && Class
!= IC_RetainBlock
)
2317 S
.SetSeq(S_CanRelease
);
2321 case S_MovableRelease
:
2326 llvm_unreachable("bottom-up pointer in retain state!");
2330 // Check for possible direct uses.
2333 case S_MovableRelease
:
2334 if (CanUse(Inst
, Ptr
, PA
, Class
)) {
2335 S
.RRI
.ReverseInsertPts
.clear();
2336 S
.RRI
.ReverseInsertPts
.insert(Inst
);
2338 } else if (Seq
== S_Release
&&
2339 (Class
== IC_User
|| Class
== IC_CallOrUser
)) {
2340 // Non-movable releases depend on any possible objc pointer use.
2342 S
.RRI
.ReverseInsertPts
.clear();
2343 S
.RRI
.ReverseInsertPts
.insert(Inst
);
2347 if (CanUse(Inst
, Ptr
, PA
, Class
))
2355 llvm_unreachable("bottom-up pointer in retain state!");
2360 return NestingDetected
;
2364 ObjCARCOpt::VisitTopDown(BasicBlock
*BB
,
2365 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
2366 DenseMap
<Value
*, RRInfo
> &Releases
) {
2367 bool NestingDetected
= false;
2368 BBState
&MyStates
= BBStates
[BB
];
2370 // Merge the states from each predecessor to compute the initial state
2371 // for the current block.
2372 const_pred_iterator
PI(BB
), PE(BB
, false);
2374 MyStates
.SetAsEntry();
2377 const BasicBlock
*Pred
= *PI
++;
2380 DenseMap
<const BasicBlock
*, BBState
>::iterator I
= BBStates
.find(Pred
);
2381 if (I
== BBStates
.end())
2383 MyStates
.InitFromPred(I
->second
);
2387 I
= BBStates
.find(Pred
);
2388 if (I
!= BBStates
.end())
2389 MyStates
.MergePred(I
->second
);
2395 // Visit all the instructions, top-down.
2396 for (BasicBlock::iterator I
= BB
->begin(), E
= BB
->end(); I
!= E
; ++I
) {
2397 Instruction
*Inst
= I
;
2398 InstructionClass Class
= GetInstructionClass(Inst
);
2399 const Value
*Arg
= 0;
2402 case IC_RetainBlock
:
2405 Arg
= GetObjCArg(Inst
);
2407 PtrState
&S
= MyStates
.getPtrTopDownState(Arg
);
2409 // Don't do retain+release tracking for IC_RetainRV, because it's
2410 // better to let it remain as the first instruction after a call.
2411 if (Class
!= IC_RetainRV
) {
2412 // If we see two retains in a row on the same pointer. If so, make
2413 // a note, and we'll cicle back to revisit it after we've
2414 // hopefully eliminated the second retain, which may allow us to
2415 // eliminate the first retain too.
2416 // Theoretically we could implement removal of nested retain+release
2417 // pairs by making PtrState hold a stack of states, but this is
2418 // simple and avoids adding overhead for the non-nested case.
2419 if (S
.GetSeq() == S_Retain
)
2420 NestingDetected
= true;
2424 S
.RRI
.IsRetainBlock
= Class
== IC_RetainBlock
;
2425 S
.RRI
.KnownIncremented
= S
.IsKnownIncremented();
2426 S
.RRI
.Calls
.insert(Inst
);
2429 S
.IncrementRefCount();
2433 Arg
= GetObjCArg(Inst
);
2435 PtrState
&S
= MyStates
.getPtrTopDownState(Arg
);
2436 S
.DecrementRefCount();
2438 switch (S
.GetSeq()) {
2441 S
.RRI
.ReverseInsertPts
.clear();
2444 S
.RRI
.ReleaseMetadata
= Inst
->getMetadata(ImpreciseReleaseMDKind
);
2445 S
.RRI
.IsTailCallRelease
= cast
<CallInst
>(Inst
)->isTailCall();
2446 Releases
[Inst
] = S
.RRI
;
2447 S
.ClearSequenceProgress();
2453 case S_MovableRelease
:
2454 llvm_unreachable("top-down pointer in release state!");
2458 case IC_AutoreleasepoolPop
:
2459 // Conservatively, clear MyStates for all known pointers.
2460 MyStates
.clearTopDownPointers();
2462 case IC_AutoreleasepoolPush
:
2464 // These are irrelevant.
2470 // Consider any other possible effects of this instruction on each
2471 // pointer being tracked.
2472 for (BBState::ptr_iterator MI
= MyStates
.top_down_ptr_begin(),
2473 ME
= MyStates
.top_down_ptr_end(); MI
!= ME
; ++MI
) {
2474 const Value
*Ptr
= MI
->first
;
2476 continue; // Handled above.
2477 PtrState
&S
= MI
->second
;
2478 Sequence Seq
= S
.GetSeq();
2480 // Check for possible releases.
2481 if (!IsRetain(Class
) && Class
!= IC_RetainBlock
&&
2482 CanAlterRefCount(Inst
, Ptr
, PA
, Class
)) {
2483 // Check for a release.
2484 S
.DecrementRefCount();
2486 // Check for a release.
2489 S
.SetSeq(S_CanRelease
);
2490 S
.RRI
.ReverseInsertPts
.clear();
2491 S
.RRI
.ReverseInsertPts
.insert(Inst
);
2493 // One call can't cause a transition from S_Retain to S_CanRelease
2494 // and S_CanRelease to S_Use. If we've made the first transition,
2503 case S_MovableRelease
:
2504 llvm_unreachable("top-down pointer in release state!");
2508 // Check for possible direct uses.
2511 if (CanUse(Inst
, Ptr
, PA
, Class
))
2520 case S_MovableRelease
:
2521 llvm_unreachable("top-down pointer in release state!");
2526 CheckForCFGHazards(BB
, BBStates
, MyStates
);
2527 return NestingDetected
;
2530 // Visit - Visit the function both top-down and bottom-up.
2532 ObjCARCOpt::Visit(Function
&F
,
2533 DenseMap
<const BasicBlock
*, BBState
> &BBStates
,
2534 MapVector
<Value
*, RRInfo
> &Retains
,
2535 DenseMap
<Value
*, RRInfo
> &Releases
) {
2536 // Use postorder for bottom-up, and reverse-postorder for top-down, because we
2537 // magically know that loops will be well behaved, i.e. they won't repeatedly
2538 // call retain on a single pointer without doing a release.
2539 bool BottomUpNestingDetected
= false;
2540 SmallVector
<BasicBlock
*, 8> PostOrder
;
2541 for (po_iterator
<Function
*> I
= po_begin(&F
), E
= po_end(&F
); I
!= E
; ++I
) {
2542 BasicBlock
*BB
= *I
;
2543 PostOrder
.push_back(BB
);
2545 BottomUpNestingDetected
|= VisitBottomUp(BB
, BBStates
, Retains
);
2548 // Iterate through the post-order in reverse order, achieving a
2549 // reverse-postorder traversal. We don't use the ReversePostOrderTraversal
2550 // class here because it works by computing its own full postorder iteration,
2551 // recording the sequence, and playing it back in reverse. Since we're already
2552 // doing a full iteration above, we can just record the sequence manually and
2553 // avoid the cost of having ReversePostOrderTraversal compute it.
2554 bool TopDownNestingDetected
= false;
2555 for (SmallVectorImpl
<BasicBlock
*>::const_reverse_iterator
2556 RI
= PostOrder
.rbegin(), RE
= PostOrder
.rend(); RI
!= RE
; ++RI
)
2557 TopDownNestingDetected
|= VisitTopDown(*RI
, BBStates
, Releases
);
2559 return TopDownNestingDetected
&& BottomUpNestingDetected
;
2562 /// MoveCalls - Move the calls in RetainsToMove and ReleasesToMove.
2563 void ObjCARCOpt::MoveCalls(Value
*Arg
,
2564 RRInfo
&RetainsToMove
,
2565 RRInfo
&ReleasesToMove
,
2566 MapVector
<Value
*, RRInfo
> &Retains
,
2567 DenseMap
<Value
*, RRInfo
> &Releases
,
2568 SmallVectorImpl
<Instruction
*> &DeadInsts
) {
2569 const Type
*ArgTy
= Arg
->getType();
2570 const Type
*ParamTy
=
2571 (RetainRVFunc
? RetainRVFunc
:
2572 RetainFunc
? RetainFunc
:
2573 RetainBlockFunc
)->arg_begin()->getType();
2575 // Insert the new retain and release calls.
2576 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2577 PI
= ReleasesToMove
.ReverseInsertPts
.begin(),
2578 PE
= ReleasesToMove
.ReverseInsertPts
.end(); PI
!= PE
; ++PI
) {
2579 Instruction
*InsertPt
= *PI
;
2580 Value
*MyArg
= ArgTy
== ParamTy
? Arg
:
2581 new BitCastInst(Arg
, ParamTy
, "", InsertPt
);
2583 CallInst::Create(RetainsToMove
.IsRetainBlock
?
2584 RetainBlockFunc
: RetainFunc
,
2585 MyArg
, "", InsertPt
);
2586 Call
->setDoesNotThrow();
2587 if (!RetainsToMove
.IsRetainBlock
)
2588 Call
->setTailCall();
2590 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2591 PI
= RetainsToMove
.ReverseInsertPts
.begin(),
2592 PE
= RetainsToMove
.ReverseInsertPts
.end(); PI
!= PE
; ++PI
) {
2593 Instruction
*LastUse
= *PI
;
2594 Instruction
*InsertPts
[] = { 0, 0, 0 };
2595 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(LastUse
)) {
2596 // We can't insert code immediately after an invoke instruction, so
2597 // insert code at the beginning of both successor blocks instead.
2598 // The invoke's return value isn't available in the unwind block,
2599 // but our releases will never depend on it, because they must be
2600 // paired with retains from before the invoke.
2601 InsertPts
[0] = II
->getNormalDest()->getFirstNonPHI();
2602 InsertPts
[1] = II
->getUnwindDest()->getFirstNonPHI();
2604 // Insert code immediately after the last use.
2605 InsertPts
[0] = llvm::next(BasicBlock::iterator(LastUse
));
2608 for (Instruction
**I
= InsertPts
; *I
; ++I
) {
2609 Instruction
*InsertPt
= *I
;
2610 Value
*MyArg
= ArgTy
== ParamTy
? Arg
:
2611 new BitCastInst(Arg
, ParamTy
, "", InsertPt
);
2612 CallInst
*Call
= CallInst::Create(ReleaseFunc
, MyArg
, "", InsertPt
);
2613 // Attach a clang.imprecise_release metadata tag, if appropriate.
2614 if (MDNode
*M
= ReleasesToMove
.ReleaseMetadata
)
2615 Call
->setMetadata(ImpreciseReleaseMDKind
, M
);
2616 Call
->setDoesNotThrow();
2617 if (ReleasesToMove
.IsTailCallRelease
)
2618 Call
->setTailCall();
2622 // Delete the original retain and release calls.
2623 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2624 AI
= RetainsToMove
.Calls
.begin(),
2625 AE
= RetainsToMove
.Calls
.end(); AI
!= AE
; ++AI
) {
2626 Instruction
*OrigRetain
= *AI
;
2627 Retains
.blot(OrigRetain
);
2628 DeadInsts
.push_back(OrigRetain
);
2630 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2631 AI
= ReleasesToMove
.Calls
.begin(),
2632 AE
= ReleasesToMove
.Calls
.end(); AI
!= AE
; ++AI
) {
2633 Instruction
*OrigRelease
= *AI
;
2634 Releases
.erase(OrigRelease
);
2635 DeadInsts
.push_back(OrigRelease
);
2640 ObjCARCOpt::PerformCodePlacement(DenseMap
<const BasicBlock
*, BBState
>
2642 MapVector
<Value
*, RRInfo
> &Retains
,
2643 DenseMap
<Value
*, RRInfo
> &Releases
) {
2644 bool AnyPairsCompletelyEliminated
= false;
2645 RRInfo RetainsToMove
;
2646 RRInfo ReleasesToMove
;
2647 SmallVector
<Instruction
*, 4> NewRetains
;
2648 SmallVector
<Instruction
*, 4> NewReleases
;
2649 SmallVector
<Instruction
*, 8> DeadInsts
;
2651 for (MapVector
<Value
*, RRInfo
>::const_iterator I
= Retains
.begin(),
2652 E
= Retains
.end(); I
!= E
; ) {
2653 Value
*V
= (I
++)->first
;
2654 if (!V
) continue; // blotted
2656 Instruction
*Retain
= cast
<Instruction
>(V
);
2657 Value
*Arg
= GetObjCArg(Retain
);
2659 // If the object being released is in static or stack storage, we know it's
2660 // not being managed by ObjC reference counting, so we can delete pairs
2661 // regardless of what possible decrements or uses lie between them.
2662 bool KnownSafe
= isa
<Constant
>(Arg
) || isa
<AllocaInst
>(Arg
);
2664 // If a pair happens in a region where it is known that the reference count
2665 // is already incremented, we can similarly ignore possible decrements.
2666 bool KnownIncrementedTD
= true, KnownIncrementedBU
= true;
2668 // Connect the dots between the top-down-collected RetainsToMove and
2669 // bottom-up-collected ReleasesToMove to form sets of related calls.
2670 // This is an iterative process so that we connect multiple releases
2671 // to multiple retains if needed.
2672 unsigned OldDelta
= 0;
2673 unsigned NewDelta
= 0;
2674 unsigned OldCount
= 0;
2675 unsigned NewCount
= 0;
2676 bool FirstRelease
= true;
2677 bool FirstRetain
= true;
2678 NewRetains
.push_back(Retain
);
2680 for (SmallVectorImpl
<Instruction
*>::const_iterator
2681 NI
= NewRetains
.begin(), NE
= NewRetains
.end(); NI
!= NE
; ++NI
) {
2682 Instruction
*NewRetain
= *NI
;
2683 MapVector
<Value
*, RRInfo
>::const_iterator It
= Retains
.find(NewRetain
);
2684 assert(It
!= Retains
.end());
2685 const RRInfo
&NewRetainRRI
= It
->second
;
2686 KnownIncrementedTD
&= NewRetainRRI
.KnownIncremented
;
2687 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2688 LI
= NewRetainRRI
.Calls
.begin(),
2689 LE
= NewRetainRRI
.Calls
.end(); LI
!= LE
; ++LI
) {
2690 Instruction
*NewRetainRelease
= *LI
;
2691 DenseMap
<Value
*, RRInfo
>::const_iterator Jt
=
2692 Releases
.find(NewRetainRelease
);
2693 if (Jt
== Releases
.end())
2695 const RRInfo
&NewRetainReleaseRRI
= Jt
->second
;
2696 assert(NewRetainReleaseRRI
.Calls
.count(NewRetain
));
2697 if (ReleasesToMove
.Calls
.insert(NewRetainRelease
)) {
2699 BBStates
[NewRetainRelease
->getParent()].GetAllPathCount();
2701 // Merge the ReleaseMetadata and IsTailCallRelease values.
2703 ReleasesToMove
.ReleaseMetadata
=
2704 NewRetainReleaseRRI
.ReleaseMetadata
;
2705 ReleasesToMove
.IsTailCallRelease
=
2706 NewRetainReleaseRRI
.IsTailCallRelease
;
2707 FirstRelease
= false;
2709 if (ReleasesToMove
.ReleaseMetadata
!=
2710 NewRetainReleaseRRI
.ReleaseMetadata
)
2711 ReleasesToMove
.ReleaseMetadata
= 0;
2712 if (ReleasesToMove
.IsTailCallRelease
!=
2713 NewRetainReleaseRRI
.IsTailCallRelease
)
2714 ReleasesToMove
.IsTailCallRelease
= false;
2717 // Collect the optimal insertion points.
2719 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2720 RI
= NewRetainReleaseRRI
.ReverseInsertPts
.begin(),
2721 RE
= NewRetainReleaseRRI
.ReverseInsertPts
.end();
2723 Instruction
*RIP
= *RI
;
2724 if (ReleasesToMove
.ReverseInsertPts
.insert(RIP
))
2725 NewDelta
-= BBStates
[RIP
->getParent()].GetAllPathCount();
2727 NewReleases
.push_back(NewRetainRelease
);
2732 if (NewReleases
.empty()) break;
2734 // Back the other way.
2735 for (SmallVectorImpl
<Instruction
*>::const_iterator
2736 NI
= NewReleases
.begin(), NE
= NewReleases
.end(); NI
!= NE
; ++NI
) {
2737 Instruction
*NewRelease
= *NI
;
2738 DenseMap
<Value
*, RRInfo
>::const_iterator It
=
2739 Releases
.find(NewRelease
);
2740 assert(It
!= Releases
.end());
2741 const RRInfo
&NewReleaseRRI
= It
->second
;
2742 KnownIncrementedBU
&= NewReleaseRRI
.KnownIncremented
;
2743 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2744 LI
= NewReleaseRRI
.Calls
.begin(),
2745 LE
= NewReleaseRRI
.Calls
.end(); LI
!= LE
; ++LI
) {
2746 Instruction
*NewReleaseRetain
= *LI
;
2747 MapVector
<Value
*, RRInfo
>::const_iterator Jt
=
2748 Retains
.find(NewReleaseRetain
);
2749 if (Jt
== Retains
.end())
2751 const RRInfo
&NewReleaseRetainRRI
= Jt
->second
;
2752 assert(NewReleaseRetainRRI
.Calls
.count(NewRelease
));
2753 if (RetainsToMove
.Calls
.insert(NewReleaseRetain
)) {
2754 unsigned PathCount
=
2755 BBStates
[NewReleaseRetain
->getParent()].GetAllPathCount();
2756 OldDelta
+= PathCount
;
2757 OldCount
+= PathCount
;
2759 // Merge the IsRetainBlock values.
2761 RetainsToMove
.IsRetainBlock
= NewReleaseRetainRRI
.IsRetainBlock
;
2762 FirstRetain
= false;
2763 } else if (ReleasesToMove
.IsRetainBlock
!=
2764 NewReleaseRetainRRI
.IsRetainBlock
)
2765 // It's not possible to merge the sequences if one uses
2766 // objc_retain and the other uses objc_retainBlock.
2769 // Collect the optimal insertion points.
2771 for (SmallPtrSet
<Instruction
*, 2>::const_iterator
2772 RI
= NewReleaseRetainRRI
.ReverseInsertPts
.begin(),
2773 RE
= NewReleaseRetainRRI
.ReverseInsertPts
.end();
2775 Instruction
*RIP
= *RI
;
2776 if (RetainsToMove
.ReverseInsertPts
.insert(RIP
)) {
2777 PathCount
= BBStates
[RIP
->getParent()].GetAllPathCount();
2778 NewDelta
+= PathCount
;
2779 NewCount
+= PathCount
;
2782 NewRetains
.push_back(NewReleaseRetain
);
2786 NewReleases
.clear();
2787 if (NewRetains
.empty()) break;
2790 // If the pointer is known incremented, we can safely delete the pair
2791 // regardless of what's between them.
2792 if (KnownIncrementedTD
|| KnownIncrementedBU
) {
2793 RetainsToMove
.ReverseInsertPts
.clear();
2794 ReleasesToMove
.ReverseInsertPts
.clear();
2798 // Determine whether the original call points are balanced in the retain and
2799 // release calls through the program. If not, conservatively don't touch
2801 // TODO: It's theoretically possible to do code motion in this case, as
2802 // long as the existing imbalances are maintained.
2806 // Determine whether the new insertion points we computed preserve the
2807 // balance of retain and release calls through the program.
2808 // TODO: If the fully aggressive solution isn't valid, try to find a
2809 // less aggressive solution which is.
2813 // Ok, everything checks out and we're all set. Let's move some code!
2815 AnyPairsCompletelyEliminated
= NewCount
== 0;
2816 NumRRs
+= OldCount
- NewCount
;
2817 MoveCalls(Arg
, RetainsToMove
, ReleasesToMove
, Retains
, Releases
, DeadInsts
);
2820 NewReleases
.clear();
2822 RetainsToMove
.clear();
2823 ReleasesToMove
.clear();
2826 // Now that we're done moving everything, we can delete the newly dead
2827 // instructions, as we no longer need them as insert points.
2828 while (!DeadInsts
.empty())
2829 EraseInstruction(DeadInsts
.pop_back_val());
2831 return AnyPairsCompletelyEliminated
;
2834 /// OptimizeWeakCalls - Weak pointer optimizations.
2835 void ObjCARCOpt::OptimizeWeakCalls(Function
&F
) {
2836 // First, do memdep-style RLE and S2L optimizations. We can't use memdep
2837 // itself because it uses AliasAnalysis and we need to do provenance
2839 for (inst_iterator I
= inst_begin(&F
), E
= inst_end(&F
); I
!= E
; ) {
2840 Instruction
*Inst
= &*I
++;
2841 InstructionClass Class
= GetBasicInstructionClass(Inst
);
2842 if (Class
!= IC_LoadWeak
&& Class
!= IC_LoadWeakRetained
)
2845 // Delete objc_loadWeak calls with no users.
2846 if (Class
== IC_LoadWeak
&& Inst
->use_empty()) {
2847 Inst
->eraseFromParent();
2851 // TODO: For now, just look for an earlier available version of this value
2852 // within the same block. Theoretically, we could do memdep-style non-local
2853 // analysis too, but that would want caching. A better approach would be to
2854 // use the technique that EarlyCSE uses.
2855 inst_iterator Current
= llvm::prior(I
);
2856 BasicBlock
*CurrentBB
= Current
.getBasicBlockIterator();
2857 for (BasicBlock::iterator B
= CurrentBB
->begin(),
2858 J
= Current
.getInstructionIterator();
2860 Instruction
*EarlierInst
= &*llvm::prior(J
);
2861 InstructionClass EarlierClass
= GetInstructionClass(EarlierInst
);
2862 switch (EarlierClass
) {
2864 case IC_LoadWeakRetained
: {
2865 // If this is loading from the same pointer, replace this load's value
2867 CallInst
*Call
= cast
<CallInst
>(Inst
);
2868 CallInst
*EarlierCall
= cast
<CallInst
>(EarlierInst
);
2869 Value
*Arg
= Call
->getArgOperand(0);
2870 Value
*EarlierArg
= EarlierCall
->getArgOperand(0);
2871 switch (PA
.getAA()->alias(Arg
, EarlierArg
)) {
2872 case AliasAnalysis::MustAlias
:
2874 // If the load has a builtin retain, insert a plain retain for it.
2875 if (Class
== IC_LoadWeakRetained
) {
2877 CallInst::Create(getRetainCallee(F
.getParent()), EarlierCall
,
2881 // Zap the fully redundant load.
2882 Call
->replaceAllUsesWith(EarlierCall
);
2883 Call
->eraseFromParent();
2885 case AliasAnalysis::MayAlias
:
2886 case AliasAnalysis::PartialAlias
:
2888 case AliasAnalysis::NoAlias
:
2895 // If this is storing to the same pointer and has the same size etc.
2896 // replace this load's value with the stored value.
2897 CallInst
*Call
= cast
<CallInst
>(Inst
);
2898 CallInst
*EarlierCall
= cast
<CallInst
>(EarlierInst
);
2899 Value
*Arg
= Call
->getArgOperand(0);
2900 Value
*EarlierArg
= EarlierCall
->getArgOperand(0);
2901 switch (PA
.getAA()->alias(Arg
, EarlierArg
)) {
2902 case AliasAnalysis::MustAlias
:
2904 // If the load has a builtin retain, insert a plain retain for it.
2905 if (Class
== IC_LoadWeakRetained
) {
2907 CallInst::Create(getRetainCallee(F
.getParent()), EarlierCall
,
2911 // Zap the fully redundant load.
2912 Call
->replaceAllUsesWith(EarlierCall
->getArgOperand(1));
2913 Call
->eraseFromParent();
2915 case AliasAnalysis::MayAlias
:
2916 case AliasAnalysis::PartialAlias
:
2918 case AliasAnalysis::NoAlias
:
2925 // TOOD: Grab the copied value.
2927 case IC_AutoreleasepoolPush
:
2930 // Weak pointers are only modified through the weak entry points
2931 // (and arbitrary calls, which could call the weak entry points).
2934 // Anything else could modify the weak pointer.
2941 // Then, for each destroyWeak with an alloca operand, check to see if
2942 // the alloca and all its users can be zapped.
2943 for (inst_iterator I
= inst_begin(&F
), E
= inst_end(&F
); I
!= E
; ) {
2944 Instruction
*Inst
= &*I
++;
2945 InstructionClass Class
= GetBasicInstructionClass(Inst
);
2946 if (Class
!= IC_DestroyWeak
)
2949 CallInst
*Call
= cast
<CallInst
>(Inst
);
2950 Value
*Arg
= Call
->getArgOperand(0);
2951 if (AllocaInst
*Alloca
= dyn_cast
<AllocaInst
>(Arg
)) {
2952 for (Value::use_iterator UI
= Alloca
->use_begin(),
2953 UE
= Alloca
->use_end(); UI
!= UE
; ++UI
) {
2954 Instruction
*UserInst
= cast
<Instruction
>(*UI
);
2955 switch (GetBasicInstructionClass(UserInst
)) {
2958 case IC_DestroyWeak
:
2965 for (Value::use_iterator UI
= Alloca
->use_begin(),
2966 UE
= Alloca
->use_end(); UI
!= UE
; ) {
2967 CallInst
*UserInst
= cast
<CallInst
>(*UI
++);
2968 if (!UserInst
->use_empty())
2969 UserInst
->replaceAllUsesWith(UserInst
->getOperand(1));
2970 UserInst
->eraseFromParent();
2972 Alloca
->eraseFromParent();
2978 /// OptimizeSequences - Identify program paths which execute sequences of
2979 /// retains and releases which can be eliminated.
2980 bool ObjCARCOpt::OptimizeSequences(Function
&F
) {
2981 /// Releases, Retains - These are used to store the results of the main flow
2982 /// analysis. These use Value* as the key instead of Instruction* so that the
2983 /// map stays valid when we get around to rewriting code and calls get
2984 /// replaced by arguments.
2985 DenseMap
<Value
*, RRInfo
> Releases
;
2986 MapVector
<Value
*, RRInfo
> Retains
;
2988 /// BBStates, This is used during the traversal of the function to track the
2989 /// states for each identified object at each block.
2990 DenseMap
<const BasicBlock
*, BBState
> BBStates
;
2992 // Analyze the CFG of the function, and all instructions.
2993 bool NestingDetected
= Visit(F
, BBStates
, Retains
, Releases
);
2996 return PerformCodePlacement(BBStates
, Retains
, Releases
) && NestingDetected
;
2999 /// OptimizeReturns - Look for this pattern:
3001 /// %call = call i8* @something(...)
3002 /// %2 = call i8* @objc_retain(i8* %call)
3003 /// %3 = call i8* @objc_autorelease(i8* %2)
3006 /// And delete the retain and autorelease.
3008 /// Otherwise if it's just this:
3010 /// %3 = call i8* @objc_autorelease(i8* %2)
3013 /// convert the autorelease to autoreleaseRV.
3014 void ObjCARCOpt::OptimizeReturns(Function
&F
) {
3015 if (!F
.getReturnType()->isPointerTy())
3018 SmallPtrSet
<Instruction
*, 4> DependingInstructions
;
3019 SmallPtrSet
<const BasicBlock
*, 4> Visited
;
3020 for (Function::iterator FI
= F
.begin(), FE
= F
.end(); FI
!= FE
; ++FI
) {
3021 BasicBlock
*BB
= FI
;
3022 ReturnInst
*Ret
= dyn_cast
<ReturnInst
>(&BB
->back());
3025 const Value
*Arg
= StripPointerCastsAndObjCCalls(Ret
->getOperand(0));
3026 FindDependencies(NeedsPositiveRetainCount
, Arg
,
3027 BB
, Ret
, DependingInstructions
, Visited
, PA
);
3028 if (DependingInstructions
.size() != 1)
3032 CallInst
*Autorelease
=
3033 dyn_cast_or_null
<CallInst
>(*DependingInstructions
.begin());
3036 InstructionClass AutoreleaseClass
=
3037 GetBasicInstructionClass(Autorelease
);
3038 if (!IsAutorelease(AutoreleaseClass
))
3040 if (GetObjCArg(Autorelease
) != Arg
)
3043 DependingInstructions
.clear();
3046 // Check that there is nothing that can affect the reference
3047 // count between the autorelease and the retain.
3048 FindDependencies(CanChangeRetainCount
, Arg
,
3049 BB
, Autorelease
, DependingInstructions
, Visited
, PA
);
3050 if (DependingInstructions
.size() != 1)
3055 dyn_cast_or_null
<CallInst
>(*DependingInstructions
.begin());
3057 // Check that we found a retain with the same argument.
3059 !IsRetain(GetBasicInstructionClass(Retain
)) ||
3060 GetObjCArg(Retain
) != Arg
)
3063 DependingInstructions
.clear();
3066 // Convert the autorelease to an autoreleaseRV, since it's
3067 // returning the value.
3068 if (AutoreleaseClass
== IC_Autorelease
) {
3069 Autorelease
->setCalledFunction(getAutoreleaseRVCallee(F
.getParent()));
3070 AutoreleaseClass
= IC_AutoreleaseRV
;
3073 // Check that there is nothing that can affect the reference
3074 // count between the retain and the call.
3075 FindDependencies(CanChangeRetainCount
, Arg
, BB
, Retain
,
3076 DependingInstructions
, Visited
, PA
);
3077 if (DependingInstructions
.size() != 1)
3082 dyn_cast_or_null
<CallInst
>(*DependingInstructions
.begin());
3084 // Check that the pointer is the return value of the call.
3085 if (!Call
|| Arg
!= Call
)
3088 // Check that the call is a regular call.
3089 InstructionClass Class
= GetBasicInstructionClass(Call
);
3090 if (Class
!= IC_CallOrUser
&& Class
!= IC_Call
)
3093 // If so, we can zap the retain and autorelease.
3096 EraseInstruction(Retain
);
3097 EraseInstruction(Autorelease
);
3103 DependingInstructions
.clear();
3108 bool ObjCARCOpt::doInitialization(Module
&M
) {
3112 Run
= ModuleHasARC(M
);
3116 // Identify the imprecise release metadata kind.
3117 ImpreciseReleaseMDKind
=
3118 M
.getContext().getMDKindID("clang.imprecise_release");
3120 // Identify the declarations for objc_retain and friends.
3121 RetainFunc
= M
.getFunction("objc_retain");
3122 RetainBlockFunc
= M
.getFunction("objc_retainBlock");
3123 RetainRVFunc
= M
.getFunction("objc_retainAutoreleasedReturnValue");
3124 ReleaseFunc
= M
.getFunction("objc_release");
3126 // Intuitively, objc_retain and others are nocapture, however in practice
3127 // they are not, because they return their argument value. And objc_release
3128 // calls finalizers.
3130 // These are initialized lazily.
3132 AutoreleaseRVCallee
= 0;
3135 AutoreleaseCallee
= 0;
3140 bool ObjCARCOpt::runOnFunction(Function
&F
) {
3144 // If nothing in the Module uses ARC, don't do anything.
3150 PA
.setAA(&getAnalysis
<AliasAnalysis
>());
3152 // This pass performs several distinct transformations. As a compile-time aid
3153 // when compiling code that isn't ObjC, skip these if the relevant ObjC
3154 // library functions aren't declared.
3156 // Preliminary optimizations. This also computs UsedInThisFunction.
3157 OptimizeIndividualCalls(F
);
3159 // Optimizations for weak pointers.
3160 if (UsedInThisFunction
& ((1 << IC_LoadWeak
) |
3161 (1 << IC_LoadWeakRetained
) |
3162 (1 << IC_StoreWeak
) |
3163 (1 << IC_InitWeak
) |
3164 (1 << IC_CopyWeak
) |
3165 (1 << IC_MoveWeak
) |
3166 (1 << IC_DestroyWeak
)))
3167 OptimizeWeakCalls(F
);
3169 // Optimizations for retain+release pairs.
3170 if (UsedInThisFunction
& ((1 << IC_Retain
) |
3171 (1 << IC_RetainRV
) |
3172 (1 << IC_RetainBlock
)))
3173 if (UsedInThisFunction
& (1 << IC_Release
))
3174 // Run OptimizeSequences until it either stops making changes or
3175 // no retain+release pair nesting is detected.
3176 while (OptimizeSequences(F
)) {}
3178 // Optimizations if objc_autorelease is used.
3179 if (UsedInThisFunction
&
3180 ((1 << IC_Autorelease
) | (1 << IC_AutoreleaseRV
)))
3186 void ObjCARCOpt::releaseMemory() {
3190 //===----------------------------------------------------------------------===//
3192 //===----------------------------------------------------------------------===//
3194 // TODO: ObjCARCContract could insert PHI nodes when uses aren't
3195 // dominated by single calls.
3197 #include "llvm/Operator.h"
3198 #include "llvm/InlineAsm.h"
3199 #include "llvm/Analysis/Dominators.h"
3201 STATISTIC(NumStoreStrongs
, "Number objc_storeStrong calls formed");
3204 /// ObjCARCContract - Late ARC optimizations. These change the IR in a way
3205 /// that makes it difficult to be analyzed by ObjCARCOpt, so it's run late.
3206 class ObjCARCContract
: public FunctionPass
{
3210 ProvenanceAnalysis PA
;
3212 /// Run - A flag indicating whether this optimization pass should run.
3215 /// StoreStrongCallee, etc. - Declarations for ObjC runtime
3216 /// functions, for use in creating calls to them. These are initialized
3217 /// lazily to avoid cluttering up the Module with unused declarations.
3218 Constant
*StoreStrongCallee
,
3219 *RetainAutoreleaseCallee
, *RetainAutoreleaseRVCallee
;
3221 /// RetainRVMarker - The inline asm string to insert between calls and
3222 /// RetainRV calls to make the optimization work on targets which need it.
3223 const MDString
*RetainRVMarker
;
3225 Constant
*getStoreStrongCallee(Module
*M
);
3226 Constant
*getRetainAutoreleaseCallee(Module
*M
);
3227 Constant
*getRetainAutoreleaseRVCallee(Module
*M
);
3229 bool ContractAutorelease(Function
&F
, Instruction
*Autorelease
,
3230 InstructionClass Class
,
3231 SmallPtrSet
<Instruction
*, 4>
3232 &DependingInstructions
,
3233 SmallPtrSet
<const BasicBlock
*, 4>
3236 void ContractRelease(Instruction
*Release
,
3237 inst_iterator
&Iter
);
3239 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
3240 virtual bool doInitialization(Module
&M
);
3241 virtual bool runOnFunction(Function
&F
);
3245 ObjCARCContract() : FunctionPass(ID
) {
3246 initializeObjCARCContractPass(*PassRegistry::getPassRegistry());
3251 char ObjCARCContract::ID
= 0;
3252 INITIALIZE_PASS_BEGIN(ObjCARCContract
,
3253 "objc-arc-contract", "ObjC ARC contraction", false, false)
3254 INITIALIZE_AG_DEPENDENCY(AliasAnalysis
)
3255 INITIALIZE_PASS_DEPENDENCY(DominatorTree
)
3256 INITIALIZE_PASS_END(ObjCARCContract
,
3257 "objc-arc-contract", "ObjC ARC contraction", false, false)
3259 Pass
*llvm::createObjCARCContractPass() {
3260 return new ObjCARCContract();
3263 void ObjCARCContract::getAnalysisUsage(AnalysisUsage
&AU
) const {
3264 AU
.addRequired
<AliasAnalysis
>();
3265 AU
.addRequired
<DominatorTree
>();
3266 AU
.setPreservesCFG();
3269 Constant
*ObjCARCContract::getStoreStrongCallee(Module
*M
) {
3270 if (!StoreStrongCallee
) {
3271 LLVMContext
&C
= M
->getContext();
3272 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
3273 const Type
*I8XX
= PointerType::getUnqual(I8X
);
3274 std::vector
<const Type
*> Params
;
3275 Params
.push_back(I8XX
);
3276 Params
.push_back(I8X
);
3278 AttrListPtr Attributes
;
3279 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
3280 Attributes
.addAttr(1, Attribute::NoCapture
);
3283 M
->getOrInsertFunction(
3285 FunctionType::get(Type::getVoidTy(C
), Params
, /*isVarArg=*/false),
3288 return StoreStrongCallee
;
3291 Constant
*ObjCARCContract::getRetainAutoreleaseCallee(Module
*M
) {
3292 if (!RetainAutoreleaseCallee
) {
3293 LLVMContext
&C
= M
->getContext();
3294 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
3295 std::vector
<const Type
*> Params
;
3296 Params
.push_back(I8X
);
3297 const FunctionType
*FTy
=
3298 FunctionType::get(I8X
, Params
, /*isVarArg=*/false);
3299 AttrListPtr Attributes
;
3300 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
3301 RetainAutoreleaseCallee
=
3302 M
->getOrInsertFunction("objc_retainAutorelease", FTy
, Attributes
);
3304 return RetainAutoreleaseCallee
;
3307 Constant
*ObjCARCContract::getRetainAutoreleaseRVCallee(Module
*M
) {
3308 if (!RetainAutoreleaseRVCallee
) {
3309 LLVMContext
&C
= M
->getContext();
3310 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
3311 std::vector
<const Type
*> Params
;
3312 Params
.push_back(I8X
);
3313 const FunctionType
*FTy
=
3314 FunctionType::get(I8X
, Params
, /*isVarArg=*/false);
3315 AttrListPtr Attributes
;
3316 Attributes
.addAttr(~0u, Attribute::NoUnwind
);
3317 RetainAutoreleaseRVCallee
=
3318 M
->getOrInsertFunction("objc_retainAutoreleaseReturnValue", FTy
,
3321 return RetainAutoreleaseRVCallee
;
3324 /// ContractAutorelease - Merge an autorelease with a retain into a fused
3327 ObjCARCContract::ContractAutorelease(Function
&F
, Instruction
*Autorelease
,
3328 InstructionClass Class
,
3329 SmallPtrSet
<Instruction
*, 4>
3330 &DependingInstructions
,
3331 SmallPtrSet
<const BasicBlock
*, 4>
3333 const Value
*Arg
= GetObjCArg(Autorelease
);
3335 // Check that there are no instructions between the retain and the autorelease
3336 // (such as an autorelease_pop) which may change the count.
3337 CallInst
*Retain
= 0;
3338 if (Class
== IC_AutoreleaseRV
)
3339 FindDependencies(RetainAutoreleaseRVDep
, Arg
,
3340 Autorelease
->getParent(), Autorelease
,
3341 DependingInstructions
, Visited
, PA
);
3343 FindDependencies(RetainAutoreleaseDep
, Arg
,
3344 Autorelease
->getParent(), Autorelease
,
3345 DependingInstructions
, Visited
, PA
);
3348 if (DependingInstructions
.size() != 1) {
3349 DependingInstructions
.clear();
3353 Retain
= dyn_cast_or_null
<CallInst
>(*DependingInstructions
.begin());
3354 DependingInstructions
.clear();
3357 GetBasicInstructionClass(Retain
) != IC_Retain
||
3358 GetObjCArg(Retain
) != Arg
)
3364 if (Class
== IC_AutoreleaseRV
)
3365 Retain
->setCalledFunction(getRetainAutoreleaseRVCallee(F
.getParent()));
3367 Retain
->setCalledFunction(getRetainAutoreleaseCallee(F
.getParent()));
3369 EraseInstruction(Autorelease
);
3373 /// ContractRelease - Attempt to merge an objc_release with a store, load, and
3374 /// objc_retain to form an objc_storeStrong. This can be a little tricky because
3375 /// the instructions don't always appear in order, and there may be unrelated
3376 /// intervening instructions.
3377 void ObjCARCContract::ContractRelease(Instruction
*Release
,
3378 inst_iterator
&Iter
) {
3379 LoadInst
*Load
= dyn_cast
<LoadInst
>(GetObjCArg(Release
));
3380 if (!Load
|| Load
->isVolatile()) return;
3382 // For now, require everything to be in one basic block.
3383 BasicBlock
*BB
= Release
->getParent();
3384 if (Load
->getParent() != BB
) return;
3386 // Walk down to find the store.
3387 BasicBlock::iterator I
= Load
, End
= BB
->end();
3389 AliasAnalysis::Location Loc
= AA
->getLocation(Load
);
3392 IsRetain(GetBasicInstructionClass(I
)) ||
3393 !(AA
->getModRefInfo(I
, Loc
) & AliasAnalysis::Mod
)))
3395 StoreInst
*Store
= dyn_cast
<StoreInst
>(I
);
3396 if (!Store
|| Store
->isVolatile()) return;
3397 if (Store
->getPointerOperand() != Loc
.Ptr
) return;
3399 Value
*New
= StripPointerCastsAndObjCCalls(Store
->getValueOperand());
3401 // Walk up to find the retain.
3403 BasicBlock::iterator Begin
= BB
->begin();
3404 while (I
!= Begin
&& GetBasicInstructionClass(I
) != IC_Retain
)
3406 Instruction
*Retain
= I
;
3407 if (GetBasicInstructionClass(Retain
) != IC_Retain
) return;
3408 if (GetObjCArg(Retain
) != New
) return;
3413 LLVMContext
&C
= Release
->getContext();
3414 const Type
*I8X
= PointerType::getUnqual(Type::getInt8Ty(C
));
3415 const Type
*I8XX
= PointerType::getUnqual(I8X
);
3417 Value
*Args
[] = { Load
->getPointerOperand(), New
};
3418 if (Args
[0]->getType() != I8XX
)
3419 Args
[0] = new BitCastInst(Args
[0], I8XX
, "", Store
);
3420 if (Args
[1]->getType() != I8X
)
3421 Args
[1] = new BitCastInst(Args
[1], I8X
, "", Store
);
3422 CallInst
*StoreStrong
=
3423 CallInst::Create(getStoreStrongCallee(BB
->getParent()->getParent()),
3424 Args
, array_endof(Args
), "", Store
);
3425 StoreStrong
->setDoesNotThrow();
3426 StoreStrong
->setDebugLoc(Store
->getDebugLoc());
3428 if (&*Iter
== Store
) ++Iter
;
3429 Store
->eraseFromParent();
3430 Release
->eraseFromParent();
3431 EraseInstruction(Retain
);
3432 if (Load
->use_empty())
3433 Load
->eraseFromParent();
3436 bool ObjCARCContract::doInitialization(Module
&M
) {
3437 Run
= ModuleHasARC(M
);
3441 // These are initialized lazily.
3442 StoreStrongCallee
= 0;
3443 RetainAutoreleaseCallee
= 0;
3444 RetainAutoreleaseRVCallee
= 0;
3446 // Initialize RetainRVMarker.
3448 if (NamedMDNode
*NMD
=
3449 M
.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"))
3450 if (NMD
->getNumOperands() == 1) {
3451 const MDNode
*N
= NMD
->getOperand(0);
3452 if (N
->getNumOperands() == 1)
3453 if (const MDString
*S
= dyn_cast
<MDString
>(N
->getOperand(0)))
3460 bool ObjCARCContract::runOnFunction(Function
&F
) {
3464 // If nothing in the Module uses ARC, don't do anything.
3469 AA
= &getAnalysis
<AliasAnalysis
>();
3470 DT
= &getAnalysis
<DominatorTree
>();
3472 PA
.setAA(&getAnalysis
<AliasAnalysis
>());
3474 // For ObjC library calls which return their argument, replace uses of the
3475 // argument with uses of the call return value, if it dominates the use. This
3476 // reduces register pressure.
3477 SmallPtrSet
<Instruction
*, 4> DependingInstructions
;
3478 SmallPtrSet
<const BasicBlock
*, 4> Visited
;
3479 for (inst_iterator I
= inst_begin(&F
), E
= inst_end(&F
); I
!= E
; ) {
3480 Instruction
*Inst
= &*I
++;
3482 // Only these library routines return their argument. In particular,
3483 // objc_retainBlock does not necessarily return its argument.
3484 InstructionClass Class
= GetBasicInstructionClass(Inst
);
3487 case IC_FusedRetainAutorelease
:
3488 case IC_FusedRetainAutoreleaseRV
:
3490 case IC_Autorelease
:
3491 case IC_AutoreleaseRV
:
3492 if (ContractAutorelease(F
, Inst
, Class
, DependingInstructions
, Visited
))
3496 // If we're compiling for a target which needs a special inline-asm
3497 // marker to do the retainAutoreleasedReturnValue optimization,
3499 if (!RetainRVMarker
)
3501 BasicBlock::iterator BBI
= Inst
;
3503 while (isNoopInstruction(BBI
)) --BBI
;
3504 if (&*BBI
== GetObjCArg(Inst
)) {
3506 InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst
->getContext()),
3507 /*isVarArg=*/false),
3508 RetainRVMarker
->getString(),
3509 /*Constraints=*/"", /*hasSideEffects=*/true);
3510 CallInst::Create(IA
, "", Inst
);
3515 // objc_initWeak(p, null) => *p = null
3516 CallInst
*CI
= cast
<CallInst
>(Inst
);
3517 if (isNullOrUndef(CI
->getArgOperand(1))) {
3519 ConstantPointerNull::get(cast
<PointerType
>(CI
->getType()));
3521 new StoreInst(Null
, CI
->getArgOperand(0), CI
);
3522 CI
->replaceAllUsesWith(Null
);
3523 CI
->eraseFromParent();
3528 ContractRelease(Inst
, I
);
3534 // Don't use GetObjCArg because we don't want to look through bitcasts
3535 // and such; to do the replacement, the argument must have type i8*.
3536 const Value
*Arg
= cast
<CallInst
>(Inst
)->getArgOperand(0);
3538 // If we're compiling bugpointed code, don't get in trouble.
3539 if (!isa
<Instruction
>(Arg
) && !isa
<Argument
>(Arg
))
3541 // Look through the uses of the pointer.
3542 for (Value::const_use_iterator UI
= Arg
->use_begin(), UE
= Arg
->use_end();
3544 Use
&U
= UI
.getUse();
3545 unsigned OperandNo
= UI
.getOperandNo();
3546 ++UI
; // Increment UI now, because we may unlink its element.
3547 if (Instruction
*UserInst
= dyn_cast
<Instruction
>(U
.getUser()))
3548 if (Inst
!= UserInst
&& DT
->dominates(Inst
, UserInst
)) {
3550 Instruction
*Replacement
= Inst
;
3551 const Type
*UseTy
= U
.get()->getType();
3552 if (PHINode
*PHI
= dyn_cast
<PHINode
>(UserInst
)) {
3553 // For PHI nodes, insert the bitcast in the predecessor block.
3555 PHINode::getIncomingValueNumForOperand(OperandNo
);
3557 PHI
->getIncomingBlock(ValNo
);
3558 if (Replacement
->getType() != UseTy
)
3559 Replacement
= new BitCastInst(Replacement
, UseTy
, "",
3561 for (unsigned i
= 0, e
= PHI
->getNumIncomingValues();
3563 if (PHI
->getIncomingBlock(i
) == BB
) {
3564 // Keep the UI iterator valid.
3565 if (&PHI
->getOperandUse(
3566 PHINode::getOperandNumForIncomingValue(i
)) ==
3569 PHI
->setIncomingValue(i
, Replacement
);
3572 if (Replacement
->getType() != UseTy
)
3573 Replacement
= new BitCastInst(Replacement
, UseTy
, "", UserInst
);
3579 // If Arg is a no-op casted pointer, strip one level of casts and
3581 if (const BitCastInst
*BI
= dyn_cast
<BitCastInst
>(Arg
))
3582 Arg
= BI
->getOperand(0);
3583 else if (isa
<GEPOperator
>(Arg
) &&
3584 cast
<GEPOperator
>(Arg
)->hasAllZeroIndices())
3585 Arg
= cast
<GEPOperator
>(Arg
)->getPointerOperand();
3586 else if (isa
<GlobalAlias
>(Arg
) &&
3587 !cast
<GlobalAlias
>(Arg
)->mayBeOverridden())
3588 Arg
= cast
<GlobalAlias
>(Arg
)->getAliasee();