[llvm] [ObjCARC] Move autorelease-to-release conversion to pool pop site instead of converting in place (PR #152353)
Akira Hatanaka via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 15 09:21:29 PDT 2026
================
@@ -2592,64 +2685,80 @@ void ObjCARCOpt::OptimizeAutoreleasePools(Function &F) {
case ARCInstKind::AutoreleasepoolPush: {
// Start tracking a new autorelease pool scope
auto *Push = cast<CallInst>(&Inst);
- PoolStack.push_back(
- {Push, false}); // {push_inst, has_autorelease_in_scope}
+ PoolStack.push_back({Push, false});
LLVM_DEBUG(dbgs() << "Found autorelease pool push: " << *Push << "\n");
break;
}
case ARCInstKind::AutoreleasepoolPop: {
auto *Pop = cast<CallInst>(&Inst);
+ // Skip if no matching push found
if (PoolStack.empty())
break;
- auto &TopPool = PoolStack.back();
- CallInst *PendingPush = TopPool.first;
- bool HasAutoreleaseInScope = TopPool.second;
+ // Get the matching push and whether autoreleases were present
+ CallInst *MatchingPush = PoolStack.back().first;
+ bool HadAutoreleaseInScope = PoolStack.back().second;
+
+ // Verify this pop matches the push (handle pointer casts).
+ // The pop's argument should be the push result, possibly cast.
+ if (Pop->getArgOperand(0)->stripPointerCasts() != MatchingPush) {
+ // Mismatched pop.
+ // We can't trust the stack anymore, invalidating optimization for
+ // this block.
+ PoolStack.clear();
----------------
ahatanak wrote:
It seems that the changes made to `ObjCARCOpt::OptimizeAutoreleasePools` aren't needed for the autorelease-to-release conversion. Is that correct? Can you split it out to a separate PR?
https://github.com/llvm/llvm-project/pull/152353
More information about the llvm-commits
mailing list