[llvm] [ObjCARC] Delete empty autoreleasepools with no autoreleases in them (PR #144788)

Jon Roelofs via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 18 16:49:14 PDT 2025


================
@@ -2485,6 +2490,203 @@ bool ObjCARCOpt::run(Function &F, AAResults &AA) {
   return Changed;
 }
 
+/// Helper function to recursively check if a value eventually leads to the
+/// target instruction through pointer casts and uses, up to a specified depth.
+static bool checkLeadsToTarget(Value *Val, User *Target, unsigned MaxDepth,
+                               SmallPtrSet<Value *, 8> &Visited) {
+  if (MaxDepth == 0)
+    return false;
+
+  // Avoid infinite recursion by tracking visited values
+  if (!Visited.insert(Val).second)
+    return false;
+
+  for (User *U : Val->users()) {
+    if (U == Target) {
+      return true;
+    }
+
+    // For pointer casts, recursively check their users
+    if (isa<CastInst>(U) || isa<BitCastInst>(U)) {
+      Value *CastResult = dyn_cast<Value>(U);
----------------
jroelofs wrote:

couple of comments here:
* BitCastInst isa CastInst
* CastInst isa Instruction, which is-a Value (via User)

so the `dyn_cast` is never going to return nullptr, and the `||` is unnecessary.

https://github.com/llvm/llvm-project/pull/144788


More information about the llvm-commits mailing list