ARCInstKind.cpp 23 KB

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