diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1199,6 +1199,25 @@ bool IsThinLTO = CodeGenOpts.PrepareForThinLTO; bool IsLTO = CodeGenOpts.PrepareForLTO; + if (LangOpts.ObjCAutoRefCount) { + PB.registerPipelineStartEPCallback( + [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + if (Level != PassBuilder::OptimizationLevel::O0) + MPM.addPass( + createModuleToFunctionPassAdaptor(ObjCARCExpandPass())); + }); + PB.registerPipelineEarlySimplificationEPCallback( + [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + if (Level != PassBuilder::OptimizationLevel::O0) + MPM.addPass(ObjCARCAPElimPass()); + }); + PB.registerScalarOptimizerLateEPCallback( + [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) { + if (Level != PassBuilder::OptimizationLevel::O0) + FPM.addPass(ObjCARCOptPass()); + }); + } + // If we reached here with a non-empty index file name, then the index // file was empty and we are not performing ThinLTO backend compilation // (used in testing in a distributed build environment). Drop any the type diff --git a/llvm/include/llvm/Transforms/ObjCARC.h b/llvm/include/llvm/Transforms/ObjCARC.h --- a/llvm/include/llvm/Transforms/ObjCARC.h +++ b/llvm/include/llvm/Transforms/ObjCARC.h @@ -45,11 +45,11 @@ Pass *createObjCARCOptPass(); struct ObjCARCOptPass : public PassInfoMixin { - PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; struct ObjCARCContractPass : public PassInfoMixin { - PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; struct ObjCARCAPElimPass : public PassInfoMixin { diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -80,9 +80,7 @@ MODULE_PASS("mergefunc", MergeFunctionsPass()) MODULE_PASS("name-anon-globals", NameAnonGlobalPass()) MODULE_PASS("no-op-module", NoOpModulePass()) -MODULE_PASS("objc-arc", ObjCARCOptPass()) MODULE_PASS("objc-arc-apelim", ObjCARCAPElimPass()) -MODULE_PASS("objc-arc-contract", ObjCARCContractPass()) MODULE_PASS("partial-inliner", PartialInlinerPass()) MODULE_PASS("pgo-icall-prom", PGOIndirectCallPromotion()) MODULE_PASS("pgo-instr-gen", PGOInstrumentationGen()) @@ -268,6 +266,8 @@ FUNCTION_PASS("loop-fusion", LoopFusePass()) FUNCTION_PASS("loop-distribute", LoopDistributePass()) FUNCTION_PASS("loop-versioning", LoopVersioningPass()) +FUNCTION_PASS("objc-arc", ObjCARCOptPass()) +FUNCTION_PASS("objc-arc-contract", ObjCARCContractPass()) FUNCTION_PASS("objc-arc-expand", ObjCARCExpandPass()) FUNCTION_PASS("pgo-memop-opt", PGOMemOPSizeOpt()) FUNCTION_PASS("print", PrintFunctionPass(dbgs())) diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp --- a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp @@ -750,19 +750,13 @@ return OCARCC.run(F, AA, DT); } -PreservedAnalyses ObjCARCContractPass::run(Module &M, - ModuleAnalysisManager &AM) { +PreservedAnalyses ObjCARCContractPass::run(Function &F, + FunctionAnalysisManager &AM) { ObjCARCContract OCAC; - OCAC.init(M); + OCAC.init(*F.getParent()); - auto &FAM = AM.getResult(M).getManager(); - bool Changed = false; - for (Function &F : M) { - if (F.isDeclaration()) - continue; - Changed |= OCAC.run(F, &FAM.getResult(F), - &FAM.getResult(F)); - } + bool Changed = OCAC.run(F, &AM.getResult(F), + &AM.getResult(F)); if (Changed) { PreservedAnalyses PA; PA.preserveSet(); diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -2462,17 +2462,12 @@ /// @} /// -PreservedAnalyses ObjCARCOptPass::run(Module &M, ModuleAnalysisManager &AM) { +PreservedAnalyses ObjCARCOptPass::run(Function &F, + FunctionAnalysisManager &AM) { ObjCARCOpt OCAO; - OCAO.init(M); + OCAO.init(*F.getParent()); - auto &FAM = AM.getResult(M).getManager(); - bool Changed = false; - for (Function &F : M) { - if (F.isDeclaration()) - continue; - Changed |= OCAO.run(F, FAM.getResult(F)); - } + bool Changed = OCAO.run(F, AM.getResult(F)); if (Changed) { PreservedAnalyses PA; PA.preserveSet();