[llvm] [ObjCARCContract] Bail before requesting analyses if !ModuleHasARC (NFC) (PR #216910)

Alex MacLean via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 18 08:58:00 PDT 2026


https://github.com/AlexMaclean updated https://github.com/llvm/llvm-project/pull/216910

>From a6e3183f765c92ef17ee92948cf9b8d0a557df3b Mon Sep 17 00:00:00 2001
From: Alex Maclean <amaclean at nvidia.com>
Date: Mon, 17 Aug 2026 21:34:51 -0700
Subject: [PATCH] [ObjCARCContract] Bail early before requesting analyses if
 !ModuleHasARC (NFC)

---
 .../Transforms/ObjCARC/ObjCARCContract.cpp    | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
index 95a9bcb839ee4..ece134abd43b7 100644
--- a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
+++ b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
@@ -77,9 +77,6 @@ class ObjCARCContract {
   ARCRuntimeEntryPoints EP;
   BundledRetainClaimRVs *BundledInsts = nullptr;
 
-  /// A flag indicating whether this optimization pass should run.
-  bool Run;
-
   /// Whether objc_claimAutoreleasedReturnValue is available.
   bool HasClaimRV = false;
 
@@ -108,6 +105,8 @@ class ObjCARCContract {
       const DenseMap<BasicBlock *, ColorVector> &BlockColors);
 
 public:
+  /// Returns whether \p M contains any ARC calls, i.e. whether run() can do
+  /// anything at all. The rest of the state is only set up in that case.
   bool init(Module &M);
   bool run(Function &F, AAResults *AA, DominatorTree *DT);
   bool hasCFGChanged() const { return CFGChanged; }
@@ -564,8 +563,7 @@ static bool useClaimRuntimeCall(Module &M) {
 //===----------------------------------------------------------------------===//
 
 bool ObjCARCContract::init(Module &M) {
-  Run = ModuleHasARC(M);
-  if (!Run)
+  if (!ModuleHasARC(M))
     return false;
 
   EP.init(&M);
@@ -575,13 +573,10 @@ bool ObjCARCContract::init(Module &M) {
   // Initialize RVInstMarker.
   RVInstMarker = getRVInstMarker(M);
 
-  return false;
+  return true;
 }
 
 bool ObjCARCContract::run(Function &F, AAResults *A, DominatorTree *D) {
-  if (!Run)
-    return false;
-
   if (!EnableARCOpts)
     return false;
 
@@ -769,7 +764,8 @@ Pass *llvm::createObjCARCContractPass() {
 
 bool ObjCARCContractLegacyPass::runOnFunction(Function &F) {
   ObjCARCContract OCARCC;
-  OCARCC.init(*F.getParent());
+  if (!OCARCC.init(*F.getParent()))
+    return false;
   auto *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
   auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
   return OCARCC.run(F, AA, DT);
@@ -778,7 +774,8 @@ bool ObjCARCContractLegacyPass::runOnFunction(Function &F) {
 PreservedAnalyses ObjCARCContractPass::run(Function &F,
                                            FunctionAnalysisManager &AM) {
   ObjCARCContract OCAC;
-  OCAC.init(*F.getParent());
+  if (!OCAC.init(*F.getParent()))
+    return PreservedAnalyses::all();
 
   bool Changed = OCAC.run(F, &AM.getResult<AAManager>(F),
                           &AM.getResult<DominatorTreeAnalysis>(F));



More information about the llvm-commits mailing list