Skip to content

Commit 756dd70

Browse files
committed
[NewPM] Run ObjC ARC passes
Match the legacy PM in running various ObjC ARC passes. This requires making some module passes into function passes. These were initially ported as module passes since they add function declarations (e.g. https://reviews.llvm.org/D86178), but that's still up for debate and other passes do so. Reviewed By: ahatanak Differential Revision: https://reviews.llvm.org/D93743
1 parent bc8acf2 commit 756dd70

File tree

5 files changed

+32
-24
lines changed

5 files changed

+32
-24
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,25 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
11991199
bool IsThinLTO = CodeGenOpts.PrepareForThinLTO;
12001200
bool IsLTO = CodeGenOpts.PrepareForLTO;
12011201

1202+
if (LangOpts.ObjCAutoRefCount) {
1203+
PB.registerPipelineStartEPCallback(
1204+
[](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
1205+
if (Level != PassBuilder::OptimizationLevel::O0)
1206+
MPM.addPass(
1207+
createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
1208+
});
1209+
PB.registerPipelineEarlySimplificationEPCallback(
1210+
[](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
1211+
if (Level != PassBuilder::OptimizationLevel::O0)
1212+
MPM.addPass(ObjCARCAPElimPass());
1213+
});
1214+
PB.registerScalarOptimizerLateEPCallback(
1215+
[](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
1216+
if (Level != PassBuilder::OptimizationLevel::O0)
1217+
FPM.addPass(ObjCARCOptPass());
1218+
});
1219+
}
1220+
12021221
// If we reached here with a non-empty index file name, then the index
12031222
// file was empty and we are not performing ThinLTO backend compilation
12041223
// (used in testing in a distributed build environment). Drop any the type

llvm/include/llvm/Transforms/ObjCARC.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ Pass *createObjCARCContractPass();
4545
Pass *createObjCARCOptPass();
4646

4747
struct ObjCARCOptPass : public PassInfoMixin<ObjCARCOptPass> {
48-
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
48+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
4949
};
5050

5151
struct ObjCARCContractPass : public PassInfoMixin<ObjCARCContractPass> {
52-
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
52+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
5353
};
5454

5555
struct ObjCARCAPElimPass : public PassInfoMixin<ObjCARCAPElimPass> {

llvm/lib/Passes/PassRegistry.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ MODULE_PASS("metarenamer", MetaRenamerPass())
8080
MODULE_PASS("mergefunc", MergeFunctionsPass())
8181
MODULE_PASS("name-anon-globals", NameAnonGlobalPass())
8282
MODULE_PASS("no-op-module", NoOpModulePass())
83-
MODULE_PASS("objc-arc", ObjCARCOptPass())
8483
MODULE_PASS("objc-arc-apelim", ObjCARCAPElimPass())
85-
MODULE_PASS("objc-arc-contract", ObjCARCContractPass())
8684
MODULE_PASS("partial-inliner", PartialInlinerPass())
8785
MODULE_PASS("pgo-icall-prom", PGOIndirectCallPromotion())
8886
MODULE_PASS("pgo-instr-gen", PGOInstrumentationGen())
@@ -268,6 +266,8 @@ FUNCTION_PASS("loop-load-elim", LoopLoadEliminationPass())
268266
FUNCTION_PASS("loop-fusion", LoopFusePass())
269267
FUNCTION_PASS("loop-distribute", LoopDistributePass())
270268
FUNCTION_PASS("loop-versioning", LoopVersioningPass())
269+
FUNCTION_PASS("objc-arc", ObjCARCOptPass())
270+
FUNCTION_PASS("objc-arc-contract", ObjCARCContractPass())
271271
FUNCTION_PASS("objc-arc-expand", ObjCARCExpandPass())
272272
FUNCTION_PASS("pgo-memop-opt", PGOMemOPSizeOpt())
273273
FUNCTION_PASS("print", PrintFunctionPass(dbgs()))

llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -750,19 +750,13 @@ bool ObjCARCContractLegacyPass::runOnFunction(Function &F) {
750750
return OCARCC.run(F, AA, DT);
751751
}
752752

753-
PreservedAnalyses ObjCARCContractPass::run(Module &M,
754-
ModuleAnalysisManager &AM) {
753+
PreservedAnalyses ObjCARCContractPass::run(Function &F,
754+
FunctionAnalysisManager &AM) {
755755
ObjCARCContract OCAC;
756-
OCAC.init(M);
756+
OCAC.init(*F.getParent());
757757

758-
auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
759-
bool Changed = false;
760-
for (Function &F : M) {
761-
if (F.isDeclaration())
762-
continue;
763-
Changed |= OCAC.run(F, &FAM.getResult<AAManager>(F),
764-
&FAM.getResult<DominatorTreeAnalysis>(F));
765-
}
758+
bool Changed = OCAC.run(F, &AM.getResult<AAManager>(F),
759+
&AM.getResult<DominatorTreeAnalysis>(F));
766760
if (Changed) {
767761
PreservedAnalyses PA;
768762
PA.preserveSet<CFGAnalyses>();

llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2462,17 +2462,12 @@ void ObjCARCOpt::releaseMemory() {
24622462
/// @}
24632463
///
24642464

2465-
PreservedAnalyses ObjCARCOptPass::run(Module &M, ModuleAnalysisManager &AM) {
2465+
PreservedAnalyses ObjCARCOptPass::run(Function &F,
2466+
FunctionAnalysisManager &AM) {
24662467
ObjCARCOpt OCAO;
2467-
OCAO.init(M);
2468+
OCAO.init(*F.getParent());
24682469

2469-
auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
2470-
bool Changed = false;
2471-
for (Function &F : M) {
2472-
if (F.isDeclaration())
2473-
continue;
2474-
Changed |= OCAO.run(F, FAM.getResult<AAManager>(F));
2475-
}
2470+
bool Changed = OCAO.run(F, AM.getResult<AAManager>(F));
24762471
if (Changed) {
24772472
PreservedAnalyses PA;
24782473
PA.preserveSet<CFGAnalyses>();

0 commit comments

Comments
 (0)