]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Analysis/ObjCARCInstKind.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Analysis / ObjCARCInstKind.cpp
1 //===- ARCInstKind.cpp - ObjC ARC Optimization ----------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 /// \file
10 /// This file defines several utility functions used by various ARC
11 /// optimizations which are IMHO too big to be in a header file.
12 ///
13 /// WARNING: This file knows about certain library functions. It recognizes them
14 /// by name, and hardwires knowledge of their semantics.
15 ///
16 /// WARNING: This file knows about how certain Objective-C library functions are
17 /// used. Naive LLVM IR transformations which would otherwise be
18 /// behavior-preserving may break these assumptions.
19 ///
20 //===----------------------------------------------------------------------===//
21
22 #include "llvm/Analysis/ObjCARCInstKind.h"
23 #include "llvm/ADT/StringSwitch.h"
24 #include "llvm/Analysis/ObjCARCAnalysisUtils.h"
25 #include "llvm/IR/Intrinsics.h"
26
27 using namespace llvm;
28 using namespace llvm::objcarc;
29
30 raw_ostream &llvm::objcarc::operator<<(raw_ostream &OS,
31                                        const ARCInstKind Class) {
32   switch (Class) {
33   case ARCInstKind::Retain:
34     return OS << "ARCInstKind::Retain";
35   case ARCInstKind::RetainRV:
36     return OS << "ARCInstKind::RetainRV";
37   case ARCInstKind::ClaimRV:
38     return OS << "ARCInstKind::ClaimRV";
39   case ARCInstKind::RetainBlock:
40     return OS << "ARCInstKind::RetainBlock";
41   case ARCInstKind::Release:
42     return OS << "ARCInstKind::Release";
43   case ARCInstKind::Autorelease:
44     return OS << "ARCInstKind::Autorelease";
45   case ARCInstKind::AutoreleaseRV:
46     return OS << "ARCInstKind::AutoreleaseRV";
47   case ARCInstKind::AutoreleasepoolPush:
48     return OS << "ARCInstKind::AutoreleasepoolPush";
49   case ARCInstKind::AutoreleasepoolPop:
50     return OS << "ARCInstKind::AutoreleasepoolPop";
51   case ARCInstKind::NoopCast:
52     return OS << "ARCInstKind::NoopCast";
53   case ARCInstKind::FusedRetainAutorelease:
54     return OS << "ARCInstKind::FusedRetainAutorelease";
55   case ARCInstKind::FusedRetainAutoreleaseRV:
56     return OS << "ARCInstKind::FusedRetainAutoreleaseRV";
57   case ARCInstKind::LoadWeakRetained:
58     return OS << "ARCInstKind::LoadWeakRetained";
59   case ARCInstKind::StoreWeak:
60     return OS << "ARCInstKind::StoreWeak";
61   case ARCInstKind::InitWeak:
62     return OS << "ARCInstKind::InitWeak";
63   case ARCInstKind::LoadWeak:
64     return OS << "ARCInstKind::LoadWeak";
65   case ARCInstKind::MoveWeak:
66     return OS << "ARCInstKind::MoveWeak";
67   case ARCInstKind::CopyWeak:
68     return OS << "ARCInstKind::CopyWeak";
69   case ARCInstKind::DestroyWeak:
70     return OS << "ARCInstKind::DestroyWeak";
71   case ARCInstKind::StoreStrong:
72     return OS << "ARCInstKind::StoreStrong";
73   case ARCInstKind::CallOrUser:
74     return OS << "ARCInstKind::CallOrUser";
75   case ARCInstKind::Call:
76     return OS << "ARCInstKind::Call";
77   case ARCInstKind::User:
78     return OS << "ARCInstKind::User";
79   case ARCInstKind::IntrinsicUser:
80     return OS << "ARCInstKind::IntrinsicUser";
81   case ARCInstKind::None:
82     return OS << "ARCInstKind::None";
83   }
84   llvm_unreachable("Unknown instruction class!");
85 }
86
87 ARCInstKind llvm::objcarc::GetFunctionClass(const Function *F) {
88
89   Intrinsic::ID ID = F->getIntrinsicID();
90   switch (ID) {
91   default:
92     return ARCInstKind::CallOrUser;
93   case Intrinsic::objc_autorelease:
94     return ARCInstKind::Autorelease;
95   case Intrinsic::objc_autoreleasePoolPop:
96     return ARCInstKind::AutoreleasepoolPop;
97   case Intrinsic::objc_autoreleasePoolPush:
98     return ARCInstKind::AutoreleasepoolPush;
99   case Intrinsic::objc_autoreleaseReturnValue:
100     return ARCInstKind::AutoreleaseRV;
101   case Intrinsic::objc_copyWeak:
102     return ARCInstKind::CopyWeak;
103   case Intrinsic::objc_destroyWeak:
104     return ARCInstKind::DestroyWeak;
105   case Intrinsic::objc_initWeak:
106     return ARCInstKind::InitWeak;
107   case Intrinsic::objc_loadWeak:
108     return ARCInstKind::LoadWeak;
109   case Intrinsic::objc_loadWeakRetained:
110     return ARCInstKind::LoadWeakRetained;
111   case Intrinsic::objc_moveWeak:
112     return ARCInstKind::MoveWeak;
113   case Intrinsic::objc_release:
114     return ARCInstKind::Release;
115   case Intrinsic::objc_retain:
116     return ARCInstKind::Retain;
117   case Intrinsic::objc_retainAutorelease:
118     return ARCInstKind::FusedRetainAutorelease;
119   case Intrinsic::objc_retainAutoreleaseReturnValue:
120     return ARCInstKind::FusedRetainAutoreleaseRV;
121   case Intrinsic::objc_retainAutoreleasedReturnValue:
122     return ARCInstKind::RetainRV;
123   case Intrinsic::objc_retainBlock:
124     return ARCInstKind::RetainBlock;
125   case Intrinsic::objc_storeStrong:
126     return ARCInstKind::StoreStrong;
127   case Intrinsic::objc_storeWeak:
128     return ARCInstKind::StoreWeak;
129   case Intrinsic::objc_clang_arc_use:
130     return ARCInstKind::IntrinsicUser;
131   case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
132     return ARCInstKind::ClaimRV;
133   case Intrinsic::objc_retainedObject:
134     return ARCInstKind::NoopCast;
135   case Intrinsic::objc_unretainedObject:
136     return ARCInstKind::NoopCast;
137   case Intrinsic::objc_unretainedPointer:
138     return ARCInstKind::NoopCast;
139   case Intrinsic::objc_retain_autorelease:
140     return ARCInstKind::FusedRetainAutorelease;
141   case Intrinsic::objc_sync_enter:
142     return ARCInstKind::User;
143   case Intrinsic::objc_sync_exit:
144     return ARCInstKind::User;
145   case Intrinsic::objc_arc_annotation_topdown_bbstart:
146   case Intrinsic::objc_arc_annotation_topdown_bbend:
147   case Intrinsic::objc_arc_annotation_bottomup_bbstart:
148   case Intrinsic::objc_arc_annotation_bottomup_bbend:
149     // Ignore annotation calls. This is important to stop the
150     // optimizer from treating annotations as uses which would
151     // make the state of the pointers they are attempting to
152     // elucidate to be incorrect.
153     return ARCInstKind::None;
154   }
155 }
156
157 // A whitelist of intrinsics that we know do not use objc pointers or decrement
158 // ref counts.
159 static bool isInertIntrinsic(unsigned ID) {
160   // TODO: Make this into a covered switch.
161   switch (ID) {
162   case Intrinsic::returnaddress:
163   case Intrinsic::addressofreturnaddress:
164   case Intrinsic::frameaddress:
165   case Intrinsic::stacksave:
166   case Intrinsic::stackrestore:
167   case Intrinsic::vastart:
168   case Intrinsic::vacopy:
169   case Intrinsic::vaend:
170   case Intrinsic::objectsize:
171   case Intrinsic::prefetch:
172   case Intrinsic::stackprotector:
173   case Intrinsic::eh_return_i32:
174   case Intrinsic::eh_return_i64:
175   case Intrinsic::eh_typeid_for:
176   case Intrinsic::eh_dwarf_cfa:
177   case Intrinsic::eh_sjlj_lsda:
178   case Intrinsic::eh_sjlj_functioncontext:
179   case Intrinsic::init_trampoline:
180   case Intrinsic::adjust_trampoline:
181   case Intrinsic::lifetime_start:
182   case Intrinsic::lifetime_end:
183   case Intrinsic::invariant_start:
184   case Intrinsic::invariant_end:
185   // Don't let dbg info affect our results.
186   case Intrinsic::dbg_declare:
187   case Intrinsic::dbg_value:
188   case Intrinsic::dbg_label:
189     // Short cut: Some intrinsics obviously don't use ObjC pointers.
190     return true;
191   default:
192     return false;
193   }
194 }
195
196 // A whitelist of intrinsics that we know do not use objc pointers or decrement
197 // ref counts.
198 static bool isUseOnlyIntrinsic(unsigned ID) {
199   // We are conservative and even though intrinsics are unlikely to touch
200   // reference counts, we white list them for safety.
201   //
202   // TODO: Expand this into a covered switch. There is a lot more here.
203   switch (ID) {
204   case Intrinsic::memcpy:
205   case Intrinsic::memmove:
206   case Intrinsic::memset:
207     return true;
208   default:
209     return false;
210   }
211 }
212
213 /// Determine what kind of construct V is.
214 ARCInstKind llvm::objcarc::GetARCInstKind(const Value *V) {
215   if (const Instruction *I = dyn_cast<Instruction>(V)) {
216     // Any instruction other than bitcast and gep with a pointer operand have a
217     // use of an objc pointer. Bitcasts, GEPs, Selects, PHIs transfer a pointer
218     // to a subsequent use, rather than using it themselves, in this sense.
219     // As a short cut, several other opcodes are known to have no pointer
220     // operands of interest. And ret is never followed by a release, so it's
221     // not interesting to examine.
222     switch (I->getOpcode()) {
223     case Instruction::Call: {
224       const CallInst *CI = cast<CallInst>(I);
225       // See if we have a function that we know something about.
226       if (const Function *F = CI->getCalledFunction()) {
227         ARCInstKind Class = GetFunctionClass(F);
228         if (Class != ARCInstKind::CallOrUser)
229           return Class;
230         Intrinsic::ID ID = F->getIntrinsicID();
231         if (isInertIntrinsic(ID))
232           return ARCInstKind::None;
233         if (isUseOnlyIntrinsic(ID))
234           return ARCInstKind::User;
235       }
236
237       // Otherwise, be conservative.
238       return GetCallSiteClass(CI);
239     }
240     case Instruction::Invoke:
241       // Otherwise, be conservative.
242       return GetCallSiteClass(cast<InvokeInst>(I));
243     case Instruction::BitCast:
244     case Instruction::GetElementPtr:
245     case Instruction::Select:
246     case Instruction::PHI:
247     case Instruction::Ret:
248     case Instruction::Br:
249     case Instruction::Switch:
250     case Instruction::IndirectBr:
251     case Instruction::Alloca:
252     case Instruction::VAArg:
253     case Instruction::Add:
254     case Instruction::FAdd:
255     case Instruction::Sub:
256     case Instruction::FSub:
257     case Instruction::Mul:
258     case Instruction::FMul:
259     case Instruction::SDiv:
260     case Instruction::UDiv:
261     case Instruction::FDiv:
262     case Instruction::SRem:
263     case Instruction::URem:
264     case Instruction::FRem:
265     case Instruction::Shl:
266     case Instruction::LShr:
267     case Instruction::AShr:
268     case Instruction::And:
269     case Instruction::Or:
270     case Instruction::Xor:
271     case Instruction::SExt:
272     case Instruction::ZExt:
273     case Instruction::Trunc:
274     case Instruction::IntToPtr:
275     case Instruction::FCmp:
276     case Instruction::FPTrunc:
277     case Instruction::FPExt:
278     case Instruction::FPToUI:
279     case Instruction::FPToSI:
280     case Instruction::UIToFP:
281     case Instruction::SIToFP:
282     case Instruction::InsertElement:
283     case Instruction::ExtractElement:
284     case Instruction::ShuffleVector:
285     case Instruction::ExtractValue:
286       break;
287     case Instruction::ICmp:
288       // Comparing a pointer with null, or any other constant, isn't an
289       // interesting use, because we don't care what the pointer points to, or
290       // about the values of any other dynamic reference-counted pointers.
291       if (IsPotentialRetainableObjPtr(I->getOperand(1)))
292         return ARCInstKind::User;
293       break;
294     default:
295       // For anything else, check all the operands.
296       // Note that this includes both operands of a Store: while the first
297       // operand isn't actually being dereferenced, it is being stored to
298       // memory where we can no longer track who might read it and dereference
299       // it, so we have to consider it potentially used.
300       for (User::const_op_iterator OI = I->op_begin(), OE = I->op_end();
301            OI != OE; ++OI)
302         if (IsPotentialRetainableObjPtr(*OI))
303           return ARCInstKind::User;
304     }
305   }
306
307   // Otherwise, it's totally inert for ARC purposes.
308   return ARCInstKind::None;
309 }
310
311 /// Test if the given class is a kind of user.
312 bool llvm::objcarc::IsUser(ARCInstKind Class) {
313   switch (Class) {
314   case ARCInstKind::User:
315   case ARCInstKind::CallOrUser:
316   case ARCInstKind::IntrinsicUser:
317     return true;
318   case ARCInstKind::Retain:
319   case ARCInstKind::RetainRV:
320   case ARCInstKind::RetainBlock:
321   case ARCInstKind::Release:
322   case ARCInstKind::Autorelease:
323   case ARCInstKind::AutoreleaseRV:
324   case ARCInstKind::AutoreleasepoolPush:
325   case ARCInstKind::AutoreleasepoolPop:
326   case ARCInstKind::NoopCast:
327   case ARCInstKind::FusedRetainAutorelease:
328   case ARCInstKind::FusedRetainAutoreleaseRV:
329   case ARCInstKind::LoadWeakRetained:
330   case ARCInstKind::StoreWeak:
331   case ARCInstKind::InitWeak:
332   case ARCInstKind::LoadWeak:
333   case ARCInstKind::MoveWeak:
334   case ARCInstKind::CopyWeak:
335   case ARCInstKind::DestroyWeak:
336   case ARCInstKind::StoreStrong:
337   case ARCInstKind::Call:
338   case ARCInstKind::None:
339   case ARCInstKind::ClaimRV:
340     return false;
341   }
342   llvm_unreachable("covered switch isn't covered?");
343 }
344
345 /// Test if the given class is objc_retain or equivalent.
346 bool llvm::objcarc::IsRetain(ARCInstKind Class) {
347   switch (Class) {
348   case ARCInstKind::Retain:
349   case ARCInstKind::RetainRV:
350     return true;
351   // I believe we treat retain block as not a retain since it can copy its
352   // block.
353   case ARCInstKind::RetainBlock:
354   case ARCInstKind::Release:
355   case ARCInstKind::Autorelease:
356   case ARCInstKind::AutoreleaseRV:
357   case ARCInstKind::AutoreleasepoolPush:
358   case ARCInstKind::AutoreleasepoolPop:
359   case ARCInstKind::NoopCast:
360   case ARCInstKind::FusedRetainAutorelease:
361   case ARCInstKind::FusedRetainAutoreleaseRV:
362   case ARCInstKind::LoadWeakRetained:
363   case ARCInstKind::StoreWeak:
364   case ARCInstKind::InitWeak:
365   case ARCInstKind::LoadWeak:
366   case ARCInstKind::MoveWeak:
367   case ARCInstKind::CopyWeak:
368   case ARCInstKind::DestroyWeak:
369   case ARCInstKind::StoreStrong:
370   case ARCInstKind::IntrinsicUser:
371   case ARCInstKind::CallOrUser:
372   case ARCInstKind::Call:
373   case ARCInstKind::User:
374   case ARCInstKind::None:
375   case ARCInstKind::ClaimRV:
376     return false;
377   }
378   llvm_unreachable("covered switch isn't covered?");
379 }
380
381 /// Test if the given class is objc_autorelease or equivalent.
382 bool llvm::objcarc::IsAutorelease(ARCInstKind Class) {
383   switch (Class) {
384   case ARCInstKind::Autorelease:
385   case ARCInstKind::AutoreleaseRV:
386     return true;
387   case ARCInstKind::Retain:
388   case ARCInstKind::RetainRV:
389   case ARCInstKind::ClaimRV:
390   case ARCInstKind::RetainBlock:
391   case ARCInstKind::Release:
392   case ARCInstKind::AutoreleasepoolPush:
393   case ARCInstKind::AutoreleasepoolPop:
394   case ARCInstKind::NoopCast:
395   case ARCInstKind::FusedRetainAutorelease:
396   case ARCInstKind::FusedRetainAutoreleaseRV:
397   case ARCInstKind::LoadWeakRetained:
398   case ARCInstKind::StoreWeak:
399   case ARCInstKind::InitWeak:
400   case ARCInstKind::LoadWeak:
401   case ARCInstKind::MoveWeak:
402   case ARCInstKind::CopyWeak:
403   case ARCInstKind::DestroyWeak:
404   case ARCInstKind::StoreStrong:
405   case ARCInstKind::IntrinsicUser:
406   case ARCInstKind::CallOrUser:
407   case ARCInstKind::Call:
408   case ARCInstKind::User:
409   case ARCInstKind::None:
410     return false;
411   }
412   llvm_unreachable("covered switch isn't covered?");
413 }
414
415 /// Test if the given class represents instructions which return their
416 /// argument verbatim.
417 bool llvm::objcarc::IsForwarding(ARCInstKind Class) {
418   switch (Class) {
419   case ARCInstKind::Retain:
420   case ARCInstKind::RetainRV:
421   case ARCInstKind::ClaimRV:
422   case ARCInstKind::Autorelease:
423   case ARCInstKind::AutoreleaseRV:
424   case ARCInstKind::NoopCast:
425     return true;
426   case ARCInstKind::RetainBlock:
427   case ARCInstKind::Release:
428   case ARCInstKind::AutoreleasepoolPush:
429   case ARCInstKind::AutoreleasepoolPop:
430   case ARCInstKind::FusedRetainAutorelease:
431   case ARCInstKind::FusedRetainAutoreleaseRV:
432   case ARCInstKind::LoadWeakRetained:
433   case ARCInstKind::StoreWeak:
434   case ARCInstKind::InitWeak:
435   case ARCInstKind::LoadWeak:
436   case ARCInstKind::MoveWeak:
437   case ARCInstKind::CopyWeak:
438   case ARCInstKind::DestroyWeak:
439   case ARCInstKind::StoreStrong:
440   case ARCInstKind::IntrinsicUser:
441   case ARCInstKind::CallOrUser:
442   case ARCInstKind::Call:
443   case ARCInstKind::User:
444   case ARCInstKind::None:
445     return false;
446   }
447   llvm_unreachable("covered switch isn't covered?");
448 }
449
450 /// Test if the given class represents instructions which do nothing if
451 /// passed a null pointer.
452 bool llvm::objcarc::IsNoopOnNull(ARCInstKind Class) {
453   switch (Class) {
454   case ARCInstKind::Retain:
455   case ARCInstKind::RetainRV:
456   case ARCInstKind::ClaimRV:
457   case ARCInstKind::Release:
458   case ARCInstKind::Autorelease:
459   case ARCInstKind::AutoreleaseRV:
460   case ARCInstKind::RetainBlock:
461     return true;
462   case ARCInstKind::AutoreleasepoolPush:
463   case ARCInstKind::AutoreleasepoolPop:
464   case ARCInstKind::FusedRetainAutorelease:
465   case ARCInstKind::FusedRetainAutoreleaseRV:
466   case ARCInstKind::LoadWeakRetained:
467   case ARCInstKind::StoreWeak:
468   case ARCInstKind::InitWeak:
469   case ARCInstKind::LoadWeak:
470   case ARCInstKind::MoveWeak:
471   case ARCInstKind::CopyWeak:
472   case ARCInstKind::DestroyWeak:
473   case ARCInstKind::StoreStrong:
474   case ARCInstKind::IntrinsicUser:
475   case ARCInstKind::CallOrUser:
476   case ARCInstKind::Call:
477   case ARCInstKind::User:
478   case ARCInstKind::None:
479   case ARCInstKind::NoopCast:
480     return false;
481   }
482   llvm_unreachable("covered switch isn't covered?");
483 }
484
485 /// Test if the given class represents instructions which are always safe
486 /// to mark with the "tail" keyword.
487 bool llvm::objcarc::IsAlwaysTail(ARCInstKind Class) {
488   // ARCInstKind::RetainBlock may be given a stack argument.
489   switch (Class) {
490   case ARCInstKind::Retain:
491   case ARCInstKind::RetainRV:
492   case ARCInstKind::ClaimRV:
493   case ARCInstKind::AutoreleaseRV:
494     return true;
495   case ARCInstKind::Release:
496   case ARCInstKind::Autorelease:
497   case ARCInstKind::RetainBlock:
498   case ARCInstKind::AutoreleasepoolPush:
499   case ARCInstKind::AutoreleasepoolPop:
500   case ARCInstKind::FusedRetainAutorelease:
501   case ARCInstKind::FusedRetainAutoreleaseRV:
502   case ARCInstKind::LoadWeakRetained:
503   case ARCInstKind::StoreWeak:
504   case ARCInstKind::InitWeak:
505   case ARCInstKind::LoadWeak:
506   case ARCInstKind::MoveWeak:
507   case ARCInstKind::CopyWeak:
508   case ARCInstKind::DestroyWeak:
509   case ARCInstKind::StoreStrong:
510   case ARCInstKind::IntrinsicUser:
511   case ARCInstKind::CallOrUser:
512   case ARCInstKind::Call:
513   case ARCInstKind::User:
514   case ARCInstKind::None:
515   case ARCInstKind::NoopCast:
516     return false;
517   }
518   llvm_unreachable("covered switch isn't covered?");
519 }
520
521 /// Test if the given class represents instructions which are never safe
522 /// to mark with the "tail" keyword.
523 bool llvm::objcarc::IsNeverTail(ARCInstKind Class) {
524   /// It is never safe to tail call objc_autorelease since by tail calling
525   /// objc_autorelease: fast autoreleasing causing our object to be potentially
526   /// reclaimed from the autorelease pool which violates the semantics of
527   /// __autoreleasing types in ARC.
528   switch (Class) {
529   case ARCInstKind::Autorelease:
530     return true;
531   case ARCInstKind::Retain:
532   case ARCInstKind::RetainRV:
533   case ARCInstKind::ClaimRV:
534   case ARCInstKind::AutoreleaseRV:
535   case ARCInstKind::Release:
536   case ARCInstKind::RetainBlock:
537   case ARCInstKind::AutoreleasepoolPush:
538   case ARCInstKind::AutoreleasepoolPop:
539   case ARCInstKind::FusedRetainAutorelease:
540   case ARCInstKind::FusedRetainAutoreleaseRV:
541   case ARCInstKind::LoadWeakRetained:
542   case ARCInstKind::StoreWeak:
543   case ARCInstKind::InitWeak:
544   case ARCInstKind::LoadWeak:
545   case ARCInstKind::MoveWeak:
546   case ARCInstKind::CopyWeak:
547   case ARCInstKind::DestroyWeak:
548   case ARCInstKind::StoreStrong:
549   case ARCInstKind::IntrinsicUser:
550   case ARCInstKind::CallOrUser:
551   case ARCInstKind::Call:
552   case ARCInstKind::User:
553   case ARCInstKind::None:
554   case ARCInstKind::NoopCast:
555     return false;
556   }
557   llvm_unreachable("covered switch isn't covered?");
558 }
559
560 /// Test if the given class represents instructions which are always safe
561 /// to mark with the nounwind attribute.
562 bool llvm::objcarc::IsNoThrow(ARCInstKind Class) {
563   // objc_retainBlock is not nounwind because it calls user copy constructors
564   // which could theoretically throw.
565   switch (Class) {
566   case ARCInstKind::Retain:
567   case ARCInstKind::RetainRV:
568   case ARCInstKind::ClaimRV:
569   case ARCInstKind::Release:
570   case ARCInstKind::Autorelease:
571   case ARCInstKind::AutoreleaseRV:
572   case ARCInstKind::AutoreleasepoolPush:
573   case ARCInstKind::AutoreleasepoolPop:
574     return true;
575   case ARCInstKind::RetainBlock:
576   case ARCInstKind::FusedRetainAutorelease:
577   case ARCInstKind::FusedRetainAutoreleaseRV:
578   case ARCInstKind::LoadWeakRetained:
579   case ARCInstKind::StoreWeak:
580   case ARCInstKind::InitWeak:
581   case ARCInstKind::LoadWeak:
582   case ARCInstKind::MoveWeak:
583   case ARCInstKind::CopyWeak:
584   case ARCInstKind::DestroyWeak:
585   case ARCInstKind::StoreStrong:
586   case ARCInstKind::IntrinsicUser:
587   case ARCInstKind::CallOrUser:
588   case ARCInstKind::Call:
589   case ARCInstKind::User:
590   case ARCInstKind::None:
591   case ARCInstKind::NoopCast:
592     return false;
593   }
594   llvm_unreachable("covered switch isn't covered?");
595 }
596
597 /// Test whether the given instruction can autorelease any pointer or cause an
598 /// autoreleasepool pop.
599 ///
600 /// This means that it *could* interrupt the RV optimization.
601 bool llvm::objcarc::CanInterruptRV(ARCInstKind Class) {
602   switch (Class) {
603   case ARCInstKind::AutoreleasepoolPop:
604   case ARCInstKind::CallOrUser:
605   case ARCInstKind::Call:
606   case ARCInstKind::Autorelease:
607   case ARCInstKind::AutoreleaseRV:
608   case ARCInstKind::FusedRetainAutorelease:
609   case ARCInstKind::FusedRetainAutoreleaseRV:
610     return true;
611   case ARCInstKind::Retain:
612   case ARCInstKind::RetainRV:
613   case ARCInstKind::ClaimRV:
614   case ARCInstKind::Release:
615   case ARCInstKind::AutoreleasepoolPush:
616   case ARCInstKind::RetainBlock:
617   case ARCInstKind::LoadWeakRetained:
618   case ARCInstKind::StoreWeak:
619   case ARCInstKind::InitWeak:
620   case ARCInstKind::LoadWeak:
621   case ARCInstKind::MoveWeak:
622   case ARCInstKind::CopyWeak:
623   case ARCInstKind::DestroyWeak:
624   case ARCInstKind::StoreStrong:
625   case ARCInstKind::IntrinsicUser:
626   case ARCInstKind::User:
627   case ARCInstKind::None:
628   case ARCInstKind::NoopCast:
629     return false;
630   }
631   llvm_unreachable("covered switch isn't covered?");
632 }
633
634 bool llvm::objcarc::CanDecrementRefCount(ARCInstKind Kind) {
635   switch (Kind) {
636   case ARCInstKind::Retain:
637   case ARCInstKind::RetainRV:
638   case ARCInstKind::Autorelease:
639   case ARCInstKind::AutoreleaseRV:
640   case ARCInstKind::NoopCast:
641   case ARCInstKind::FusedRetainAutorelease:
642   case ARCInstKind::FusedRetainAutoreleaseRV:
643   case ARCInstKind::IntrinsicUser:
644   case ARCInstKind::User:
645   case ARCInstKind::None:
646     return false;
647
648   // The cases below are conservative.
649
650   // RetainBlock can result in user defined copy constructors being called
651   // implying releases may occur.
652   case ARCInstKind::RetainBlock:
653   case ARCInstKind::Release:
654   case ARCInstKind::AutoreleasepoolPush:
655   case ARCInstKind::AutoreleasepoolPop:
656   case ARCInstKind::LoadWeakRetained:
657   case ARCInstKind::StoreWeak:
658   case ARCInstKind::InitWeak:
659   case ARCInstKind::LoadWeak:
660   case ARCInstKind::MoveWeak:
661   case ARCInstKind::CopyWeak:
662   case ARCInstKind::DestroyWeak:
663   case ARCInstKind::StoreStrong:
664   case ARCInstKind::CallOrUser:
665   case ARCInstKind::Call:
666   case ARCInstKind::ClaimRV:
667     return true;
668   }
669
670   llvm_unreachable("covered switch isn't covered?");
671 }