Skip to content

Commit ebbba2b

Browse files
committed
Reapply "Run ObjCContractPass in Default Codegen Pipeline (llvm#92331)"
This reverts commit 1579e9c.
1 parent a0afcbf commit ebbba2b

File tree

21 files changed

+119
-37
lines changed

21 files changed

+119
-37
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,12 +588,6 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
588588
// this also adds codegenerator level optimization passes.
589589
CodeGenFileType CGFT = getCodeGenFileType(Action);
590590

591-
// Add ObjC ARC final-cleanup optimizations. This is done as part of the
592-
// "codegen" passes so that it isn't run multiple times when there is
593-
// inlining happening.
594-
if (CodeGenOpts.OptimizationLevel > 0)
595-
CodeGenPasses.add(createObjCARCContractPass());
596-
597591
if (TM->addPassesToEmitFile(CodeGenPasses, OS, DwoOS, CGFT,
598592
/*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
599593
Diags.Report(diag::err_fe_unable_to_interface_with_target);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
; RUN: opt -thinlto-bc -o %t.o %s
2+
3+
; RUN: llvm-lto2 run -thinlto-distributed-indexes %t.o \
4+
; RUN: -o %t2.index \
5+
; RUN: -r=%t.o,_use_arc,px
6+
7+
; RUN: %clang_cc1 -triple x86_64-apple-darwin \
8+
; RUN: -emit-obj -fthinlto-index=%t.o.thinlto.bc \
9+
; RUN: -o %t.native.o -x ir %t.o
10+
11+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
12+
target triple = "x86_64-apple-darwin"
13+
14+
define void @use_arc(ptr %a, ptr %b) {
15+
call void (...) @llvm.objc.clang.arc.use(ptr %a, ptr %b) nounwind
16+
ret void
17+
}
18+
19+
declare void @llvm.objc.clang.arc.use(...) nounwind

lld/MachO/LTO.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@ static lto::Config createConfig() {
4848
c.CPU = getCPUStr();
4949
c.MAttrs = getMAttrs();
5050
c.DiagHandler = diagnosticHandler;
51-
c.PreCodeGenPassesHook = [](legacy::PassManager &pm) {
52-
pm.add(createObjCARCContractPass());
53-
};
5451

5552
c.AlwaysEmitRegularLTOObj = !config->ltoObjPath.empty();
5653

llvm/include/llvm/Analysis/ObjCARCAnalysisUtils.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,26 @@ extern bool EnableARCOpts;
4141
/// Test if the given module looks interesting to run ARC optimization
4242
/// on.
4343
inline bool ModuleHasARC(const Module &M) {
44-
return
45-
M.getNamedValue("llvm.objc.retain") ||
46-
M.getNamedValue("llvm.objc.release") ||
47-
M.getNamedValue("llvm.objc.autorelease") ||
48-
M.getNamedValue("llvm.objc.retainAutoreleasedReturnValue") ||
49-
M.getNamedValue("llvm.objc.unsafeClaimAutoreleasedReturnValue") ||
50-
M.getNamedValue("llvm.objc.retainBlock") ||
51-
M.getNamedValue("llvm.objc.autoreleaseReturnValue") ||
52-
M.getNamedValue("llvm.objc.autoreleasePoolPush") ||
53-
M.getNamedValue("llvm.objc.loadWeakRetained") ||
54-
M.getNamedValue("llvm.objc.loadWeak") ||
55-
M.getNamedValue("llvm.objc.destroyWeak") ||
56-
M.getNamedValue("llvm.objc.storeWeak") ||
57-
M.getNamedValue("llvm.objc.initWeak") ||
58-
M.getNamedValue("llvm.objc.moveWeak") ||
59-
M.getNamedValue("llvm.objc.copyWeak") ||
60-
M.getNamedValue("llvm.objc.retainedObject") ||
61-
M.getNamedValue("llvm.objc.unretainedObject") ||
62-
M.getNamedValue("llvm.objc.unretainedPointer") ||
63-
M.getNamedValue("llvm.objc.clang.arc.use");
44+
return M.getNamedValue("llvm.objc.retain") ||
45+
M.getNamedValue("llvm.objc.release") ||
46+
M.getNamedValue("llvm.objc.autorelease") ||
47+
M.getNamedValue("llvm.objc.retainAutoreleasedReturnValue") ||
48+
M.getNamedValue("llvm.objc.unsafeClaimAutoreleasedReturnValue") ||
49+
M.getNamedValue("llvm.objc.retainBlock") ||
50+
M.getNamedValue("llvm.objc.autoreleaseReturnValue") ||
51+
M.getNamedValue("llvm.objc.autoreleasePoolPush") ||
52+
M.getNamedValue("llvm.objc.loadWeakRetained") ||
53+
M.getNamedValue("llvm.objc.loadWeak") ||
54+
M.getNamedValue("llvm.objc.destroyWeak") ||
55+
M.getNamedValue("llvm.objc.storeWeak") ||
56+
M.getNamedValue("llvm.objc.initWeak") ||
57+
M.getNamedValue("llvm.objc.moveWeak") ||
58+
M.getNamedValue("llvm.objc.copyWeak") ||
59+
M.getNamedValue("llvm.objc.retainedObject") ||
60+
M.getNamedValue("llvm.objc.unretainedObject") ||
61+
M.getNamedValue("llvm.objc.unretainedPointer") ||
62+
M.getNamedValue("llvm.objc.clang.arc.noop.use") ||
63+
M.getNamedValue("llvm.objc.clang.arc.use");
6464
}
6565

6666
/// This is a wrapper around getUnderlyingObject which also knows how to

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include "llvm/Support/WithColor.h"
4747
#include "llvm/Target/CGPassBuilderOption.h"
4848
#include "llvm/Target/TargetMachine.h"
49+
#include "llvm/Transforms/ObjCARC.h"
4950
#include "llvm/Transforms/Scalar.h"
5051
#include "llvm/Transforms/Utils.h"
5152
#include <cassert>
@@ -943,6 +944,8 @@ void TargetPassConfig::addCodeGenPrepare() {
943944
void TargetPassConfig::addISelPrepare() {
944945
addPreISel();
945946

947+
addPass(createObjCARCContractPass());
948+
946949
// Force codegen to run according to the callgraph.
947950
if (requiresCodeGenSCCOrder())
948951
addPass(new DummyCGSCCPass);

llvm/lib/LTO/LTOCodeGenerator.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,6 @@ LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context)
136136

137137
Config.CodeModel = std::nullopt;
138138
Config.StatsFile = LTOStatsFile;
139-
Config.PreCodeGenPassesHook = [](legacy::PassManager &PM) {
140-
PM.add(createObjCARCContractPass());
141-
};
142-
143139
Config.RunCSIRInstr = LTORunCSIRInstr;
144140
Config.CSIRProfile = LTOCSIRProfile;
145141
}

llvm/lib/LTO/ThinLTOCodeGenerator.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,6 @@ std::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule,
335335
raw_svector_ostream OS(OutputBuffer);
336336
legacy::PassManager PM;
337337

338-
// If the bitcode files contain ARC code and were compiled with optimization,
339-
// the ObjCARCContractPass must be run, so do it unconditionally here.
340-
PM.add(createObjCARCContractPass());
341-
342338
// Setup the codegen now.
343339
if (TM.addPassesToEmitFile(PM, OS, nullptr, CodeGenFileType::ObjectFile,
344340
/* DisableVerify */ true))

llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ class ObjCARCContract {
7171
ARCRuntimeEntryPoints EP;
7272
BundledRetainClaimRVs *BundledInsts = nullptr;
7373

74+
/// A flag indicating whether this optimization pass should run.
75+
bool Run;
76+
7477
/// The inline asm string to insert between calls and RetainRV calls to make
7578
/// the optimization work on targets which need it.
7679
const MDString *RVInstMarker;
@@ -527,6 +530,10 @@ bool ObjCARCContract::tryToPeepholeInstruction(
527530
//===----------------------------------------------------------------------===//
528531

529532
bool ObjCARCContract::init(Module &M) {
533+
Run = ModuleHasARC(M);
534+
if (!Run)
535+
return false;
536+
530537
EP.init(&M);
531538

532539
// Initialize RVInstMarker.
@@ -539,6 +546,9 @@ bool ObjCARCContract::run(Function &F, AAResults *A, DominatorTree *D) {
539546
if (!EnableARCOpts)
540547
return false;
541548

549+
if (!Run)
550+
return false;
551+
542552
Changed = CFGChanged = false;
543553
AA = A;
544554
DT = D;

llvm/test/CodeGen/AArch64/O0-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
; CHECK-NEXT: AArch64 Stack Tagging
3131
; CHECK-NEXT: SME ABI Pass
3232
; CHECK-NEXT: Exception handling preparation
33+
; CHECK-NEXT: Dominator Tree Construction
34+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
35+
; CHECK-NEXT: Function Alias Analysis Results
36+
; CHECK-NEXT: ObjC ARC contraction
3337
; CHECK-NEXT: Prepare callbr
3438
; CHECK-NEXT: Safe Stack instrumentation pass
3539
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/AArch64/O3-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@
102102
; CHECK-NEXT: Dominator Tree Construction
103103
; CHECK-NEXT: FunctionPass Manager
104104
; CHECK-NEXT: Merge internal globals
105+
; CHECK-NEXT: Dominator Tree Construction
106+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
107+
; CHECK-NEXT: Function Alias Analysis Results
108+
; CHECK-NEXT: ObjC ARC contraction
105109
; CHECK-NEXT: Prepare callbr
106110
; CHECK-NEXT: Safe Stack instrumentation pass
107111
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/AMDGPU/llc-pipeline.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@
8787
; GCN-O0-NEXT: AMDGPU Rewrite Undef for PHI
8888
; GCN-O0-NEXT: LCSSA Verifier
8989
; GCN-O0-NEXT: Loop-Closed SSA Form Pass
90+
; GCN-O0-NEXT: Basic Alias Analysis (stateless AA impl)
91+
; GCN-O0-NEXT: Function Alias Analysis Results
92+
; GCN-O0-NEXT: ObjC ARC contraction
9093
; GCN-O0-NEXT: DummyCGSCCPass
9194
; GCN-O0-NEXT: FunctionPass Manager
9295
; GCN-O0-NEXT: Prepare callbr
@@ -279,6 +282,9 @@
279282
; GCN-O1-NEXT: AMDGPU Rewrite Undef for PHI
280283
; GCN-O1-NEXT: LCSSA Verifier
281284
; GCN-O1-NEXT: Loop-Closed SSA Form Pass
285+
; GCN-O1-NEXT: Basic Alias Analysis (stateless AA impl)
286+
; GCN-O1-NEXT: Function Alias Analysis Results
287+
; GCN-O1-NEXT: ObjC ARC contraction
282288
; GCN-O1-NEXT: DummyCGSCCPass
283289
; GCN-O1-NEXT: FunctionPass Manager
284290
; GCN-O1-NEXT: Prepare callbr
@@ -571,6 +577,9 @@
571577
; GCN-O1-OPTS-NEXT: AMDGPU Rewrite Undef for PHI
572578
; GCN-O1-OPTS-NEXT: LCSSA Verifier
573579
; GCN-O1-OPTS-NEXT: Loop-Closed SSA Form Pass
580+
; GCN-O1-OPTS-NEXT: Basic Alias Analysis (stateless AA impl)
581+
; GCN-O1-OPTS-NEXT: Function Alias Analysis Results
582+
; GCN-O1-OPTS-NEXT: ObjC ARC contraction
574583
; GCN-O1-OPTS-NEXT: DummyCGSCCPass
575584
; GCN-O1-OPTS-NEXT: FunctionPass Manager
576585
; GCN-O1-OPTS-NEXT: Prepare callbr
@@ -876,6 +885,11 @@
876885
; GCN-O2-NEXT: LCSSA Verifier
877886
; GCN-O2-NEXT: Loop-Closed SSA Form Pass
878887
; GCN-O2-NEXT: Analysis if a function is memory bound
888+
; GCN-O2-NEXT: FunctionPass Manager
889+
; GCN-O2-NEXT: Dominator Tree Construction
890+
; GCN-O2-NEXT: Basic Alias Analysis (stateless AA impl)
891+
; GCN-O2-NEXT: Function Alias Analysis Results
892+
; GCN-O2-NEXT: ObjC ARC contraction
879893
; GCN-O2-NEXT: DummyCGSCCPass
880894
; GCN-O2-NEXT: FunctionPass Manager
881895
; GCN-O2-NEXT: Prepare callbr
@@ -1194,6 +1208,11 @@
11941208
; GCN-O3-NEXT: LCSSA Verifier
11951209
; GCN-O3-NEXT: Loop-Closed SSA Form Pass
11961210
; GCN-O3-NEXT: Analysis if a function is memory bound
1211+
; GCN-O3-NEXT: FunctionPass Manager
1212+
; GCN-O3-NEXT: Dominator Tree Construction
1213+
; GCN-O3-NEXT: Basic Alias Analysis (stateless AA impl)
1214+
; GCN-O3-NEXT: Function Alias Analysis Results
1215+
; GCN-O3-NEXT: ObjC ARC contraction
11971216
; GCN-O3-NEXT: DummyCGSCCPass
11981217
; GCN-O3-NEXT: FunctionPass Manager
11991218
; GCN-O3-NEXT: Prepare callbr

llvm/test/CodeGen/ARM/O3-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@
6464
; CHECK-NEXT: Transform predicated vector loops to use MVE tail predication
6565
; CHECK-NEXT: A No-Op Barrier Pass
6666
; CHECK-NEXT: FunctionPass Manager
67+
; CHECK-NEXT: Dominator Tree Construction
68+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
69+
; CHECK-NEXT: Function Alias Analysis Results
70+
; CHECK-NEXT: ObjC ARC contraction
6771
; CHECK-NEXT: Prepare callbr
6872
; CHECK-NEXT: Safe Stack instrumentation pass
6973
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/LoongArch/O0-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
; CHECK-NEXT: Scalarize Masked Memory Intrinsics
3131
; CHECK-NEXT: Expand reduction intrinsics
3232
; CHECK-NEXT: Exception handling preparation
33+
; CHECK-NEXT: Dominator Tree Construction
34+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
35+
; CHECK-NEXT: Function Alias Analysis Results
36+
; CHECK-NEXT: ObjC ARC contraction
3337
; CHECK-NEXT: Prepare callbr
3438
; CHECK-NEXT: Safe Stack instrumentation pass
3539
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/LoongArch/opt-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,14 @@
7070
; LAXX-NEXT: CodeGen Prepare
7171
; LAXX-NEXT: Dominator Tree Construction
7272
; LAXX-NEXT: Exception handling preparation
73+
; LAXX-NEXT: Basic Alias Analysis (stateless AA impl)
74+
; LAXX-NEXT: Function Alias Analysis Results
75+
; LAXX-NEXT: ObjC ARC contraction
7376
; LAXX-NEXT: Prepare callbr
7477
; LAXX-NEXT: Safe Stack instrumentation pass
7578
; LAXX-NEXT: Insert stack protectors
7679
; LAXX-NEXT: Module Verifier
80+
; LAXX-NEXT: Dominator Tree Construction
7781
; LAXX-NEXT: Basic Alias Analysis (stateless AA impl)
7882
; LAXX-NEXT: Function Alias Analysis Results
7983
; LAXX-NEXT: Natural Loop Information

llvm/test/CodeGen/M68k/pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,14 @@
4040
; CHECK-NEXT: CodeGen Prepare
4141
; CHECK-NEXT: Dominator Tree Construction
4242
; CHECK-NEXT: Exception handling preparation
43+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
44+
; CHECK-NEXT: Function Alias Analysis Results
45+
; CHECK-NEXT: ObjC ARC contraction
4346
; CHECK-NEXT: Prepare callbr
4447
; CHECK-NEXT: Safe Stack instrumentation pass
4548
; CHECK-NEXT: Insert stack protectors
4649
; CHECK-NEXT: Module Verifier
50+
; CHECK-NEXT: Dominator Tree Construction
4751
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
4852
; CHECK-NEXT: Function Alias Analysis Results
4953
; CHECK-NEXT: Natural Loop Information

llvm/test/CodeGen/PowerPC/O0-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
; CHECK-NEXT: Scalarize Masked Memory Intrinsics
3030
; CHECK-NEXT: Expand reduction intrinsics
3131
; CHECK-NEXT: Exception handling preparation
32+
; CHECK-NEXT: Dominator Tree Construction
33+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
34+
; CHECK-NEXT: Function Alias Analysis Results
35+
; CHECK-NEXT: ObjC ARC contraction
3236
; CHECK-NEXT: Prepare callbr
3337
; CHECK-NEXT: Safe Stack instrumentation pass
3438
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/PowerPC/O3-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,14 @@
8181
; CHECK-NEXT: Lazy Block Frequency Analysis
8282
; CHECK-NEXT: Optimization Remark Emitter
8383
; CHECK-NEXT: Hardware Loop Insertion
84+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
85+
; CHECK-NEXT: Function Alias Analysis Results
86+
; CHECK-NEXT: ObjC ARC contraction
8487
; CHECK-NEXT: Prepare callbr
8588
; CHECK-NEXT: Safe Stack instrumentation pass
8689
; CHECK-NEXT: Insert stack protectors
8790
; CHECK-NEXT: Module Verifier
91+
; CHECK-NEXT: Dominator Tree Construction
8892
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
8993
; CHECK-NEXT: Function Alias Analysis Results
9094
; CHECK-NEXT: Natural Loop Information

llvm/test/CodeGen/RISCV/O0-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
; CHECK-NEXT: Scalarize Masked Memory Intrinsics
3131
; CHECK-NEXT: Expand reduction intrinsics
3232
; CHECK-NEXT: Exception handling preparation
33+
; CHECK-NEXT: Dominator Tree Construction
34+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
35+
; CHECK-NEXT: Function Alias Analysis Results
36+
; CHECK-NEXT: ObjC ARC contraction
3337
; CHECK-NEXT: Prepare callbr
3438
; CHECK-NEXT: Safe Stack instrumentation pass
3539
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/RISCV/O3-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373
; CHECK-NEXT: Exception handling preparation
7474
; CHECK-NEXT: A No-Op Barrier Pass
7575
; CHECK-NEXT: FunctionPass Manager
76+
; CHECK-NEXT: Dominator Tree Construction
77+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
78+
; CHECK-NEXT: Function Alias Analysis Results
79+
; CHECK-NEXT: ObjC ARC contraction
7680
; CHECK-NEXT: Prepare callbr
7781
; CHECK-NEXT: Safe Stack instrumentation pass
7882
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/X86/O0-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
; CHECK-NEXT: Expand reduction intrinsics
3232
; CHECK-NEXT: Expand indirectbr instructions
3333
; CHECK-NEXT: Exception handling preparation
34+
; CHECK-NEXT: Dominator Tree Construction
35+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
36+
; CHECK-NEXT: Function Alias Analysis Results
37+
; CHECK-NEXT: ObjC ARC contraction
3438
; CHECK-NEXT: Prepare callbr
3539
; CHECK-NEXT: Safe Stack instrumentation pass
3640
; CHECK-NEXT: Insert stack protectors

llvm/test/CodeGen/X86/opt-pipeline.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,14 @@
7171
; CHECK-NEXT: CodeGen Prepare
7272
; CHECK-NEXT: Dominator Tree Construction
7373
; CHECK-NEXT: Exception handling preparation
74+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
75+
; CHECK-NEXT: Function Alias Analysis Results
76+
; CHECK-NEXT: ObjC ARC contraction
7477
; CHECK-NEXT: Prepare callbr
7578
; CHECK-NEXT: Safe Stack instrumentation pass
7679
; CHECK-NEXT: Insert stack protectors
7780
; CHECK-NEXT: Module Verifier
81+
; CHECK-NEXT: Dominator Tree Construction
7882
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
7983
; CHECK-NEXT: Function Alias Analysis Results
8084
; CHECK-NEXT: Natural Loop Information

0 commit comments

Comments
 (0)