[LTO] enable ObjCARCContractPass only on optimized build (#101114)
\#92331 tried to make `ObjCARCContractPass` by default, but it caused a
regression on O0 builds and was reverted.
This patch trys to bring that back by:
1. reverts the
[revert](1579e9ca9c).
2. `createObjCARCContractPass` only on optimized builds.
Tests are updated to refelect the changes. Specifically, all `O0` tests
should not include `ObjCARCContractPass`
Signed-off-by: Peter Rong <PeterRong@meta.com>
This commit is contained in:
@@ -588,12 +588,6 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
|
||||
// this also adds codegenerator level optimization passes.
|
||||
CodeGenFileType CGFT = getCodeGenFileType(Action);
|
||||
|
||||
// Add ObjC ARC final-cleanup optimizations. This is done as part of the
|
||||
// "codegen" passes so that it isn't run multiple times when there is
|
||||
// inlining happening.
|
||||
if (CodeGenOpts.OptimizationLevel > 0)
|
||||
CodeGenPasses.add(createObjCARCContractPass());
|
||||
|
||||
if (TM->addPassesToEmitFile(CodeGenPasses, OS, DwoOS, CGFT,
|
||||
/*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
|
||||
Diags.Report(diag::err_fe_unable_to_interface_with_target);
|
||||
|
||||
19
clang/test/CodeGen/thinlto-distributed-objc-contract-pass.ll
Normal file
19
clang/test/CodeGen/thinlto-distributed-objc-contract-pass.ll
Normal file
@@ -0,0 +1,19 @@
|
||||
; RUN: opt -thinlto-bc -o %t.o %s
|
||||
|
||||
; RUN: llvm-lto2 run -thinlto-distributed-indexes %t.o \
|
||||
; RUN: -o %t2.index \
|
||||
; RUN: -r=%t.o,_use_arc,px
|
||||
|
||||
; RUN: %clang_cc1 -O2 -triple x86_64-apple-darwin \
|
||||
; RUN: -emit-obj -fthinlto-index=%t.o.thinlto.bc \
|
||||
; RUN: -o %t.native.o -x ir %t.o
|
||||
|
||||
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-darwin"
|
||||
|
||||
define void @use_arc(ptr %a, ptr %b) {
|
||||
call void (...) @llvm.objc.clang.arc.use(ptr %a, ptr %b) nounwind
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @llvm.objc.clang.arc.use(...) nounwind
|
||||
@@ -48,9 +48,6 @@ static lto::Config createConfig() {
|
||||
c.CPU = getCPUStr();
|
||||
c.MAttrs = getMAttrs();
|
||||
c.DiagHandler = diagnosticHandler;
|
||||
c.PreCodeGenPassesHook = [](legacy::PassManager &pm) {
|
||||
pm.add(createObjCARCContractPass());
|
||||
};
|
||||
|
||||
c.AlwaysEmitRegularLTOObj = !config->ltoObjPath.empty();
|
||||
|
||||
|
||||
@@ -41,26 +41,26 @@ extern bool EnableARCOpts;
|
||||
/// Test if the given module looks interesting to run ARC optimization
|
||||
/// on.
|
||||
inline bool ModuleHasARC(const Module &M) {
|
||||
return
|
||||
M.getNamedValue("llvm.objc.retain") ||
|
||||
M.getNamedValue("llvm.objc.release") ||
|
||||
M.getNamedValue("llvm.objc.autorelease") ||
|
||||
M.getNamedValue("llvm.objc.retainAutoreleasedReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.unsafeClaimAutoreleasedReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.retainBlock") ||
|
||||
M.getNamedValue("llvm.objc.autoreleaseReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.autoreleasePoolPush") ||
|
||||
M.getNamedValue("llvm.objc.loadWeakRetained") ||
|
||||
M.getNamedValue("llvm.objc.loadWeak") ||
|
||||
M.getNamedValue("llvm.objc.destroyWeak") ||
|
||||
M.getNamedValue("llvm.objc.storeWeak") ||
|
||||
M.getNamedValue("llvm.objc.initWeak") ||
|
||||
M.getNamedValue("llvm.objc.moveWeak") ||
|
||||
M.getNamedValue("llvm.objc.copyWeak") ||
|
||||
M.getNamedValue("llvm.objc.retainedObject") ||
|
||||
M.getNamedValue("llvm.objc.unretainedObject") ||
|
||||
M.getNamedValue("llvm.objc.unretainedPointer") ||
|
||||
M.getNamedValue("llvm.objc.clang.arc.use");
|
||||
return M.getNamedValue("llvm.objc.retain") ||
|
||||
M.getNamedValue("llvm.objc.release") ||
|
||||
M.getNamedValue("llvm.objc.autorelease") ||
|
||||
M.getNamedValue("llvm.objc.retainAutoreleasedReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.unsafeClaimAutoreleasedReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.retainBlock") ||
|
||||
M.getNamedValue("llvm.objc.autoreleaseReturnValue") ||
|
||||
M.getNamedValue("llvm.objc.autoreleasePoolPush") ||
|
||||
M.getNamedValue("llvm.objc.loadWeakRetained") ||
|
||||
M.getNamedValue("llvm.objc.loadWeak") ||
|
||||
M.getNamedValue("llvm.objc.destroyWeak") ||
|
||||
M.getNamedValue("llvm.objc.storeWeak") ||
|
||||
M.getNamedValue("llvm.objc.initWeak") ||
|
||||
M.getNamedValue("llvm.objc.moveWeak") ||
|
||||
M.getNamedValue("llvm.objc.copyWeak") ||
|
||||
M.getNamedValue("llvm.objc.retainedObject") ||
|
||||
M.getNamedValue("llvm.objc.unretainedObject") ||
|
||||
M.getNamedValue("llvm.objc.unretainedPointer") ||
|
||||
M.getNamedValue("llvm.objc.clang.arc.noop.use") ||
|
||||
M.getNamedValue("llvm.objc.clang.arc.use");
|
||||
}
|
||||
|
||||
/// This is a wrapper around getUnderlyingObject which also knows how to
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "llvm/Support/WithColor.h"
|
||||
#include "llvm/Target/CGPassBuilderOption.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Transforms/ObjCARC.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils.h"
|
||||
#include <cassert>
|
||||
@@ -943,6 +944,9 @@ void TargetPassConfig::addCodeGenPrepare() {
|
||||
void TargetPassConfig::addISelPrepare() {
|
||||
addPreISel();
|
||||
|
||||
if (getOptLevel() != CodeGenOptLevel::None)
|
||||
addPass(createObjCARCContractPass());
|
||||
|
||||
// Force codegen to run according to the callgraph.
|
||||
if (requiresCodeGenSCCOrder())
|
||||
addPass(new DummyCGSCCPass);
|
||||
|
||||
@@ -136,10 +136,6 @@ LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context)
|
||||
|
||||
Config.CodeModel = std::nullopt;
|
||||
Config.StatsFile = LTOStatsFile;
|
||||
Config.PreCodeGenPassesHook = [](legacy::PassManager &PM) {
|
||||
PM.add(createObjCARCContractPass());
|
||||
};
|
||||
|
||||
Config.RunCSIRInstr = LTORunCSIRInstr;
|
||||
Config.CSIRProfile = LTOCSIRProfile;
|
||||
}
|
||||
|
||||
@@ -335,10 +335,6 @@ std::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule,
|
||||
raw_svector_ostream OS(OutputBuffer);
|
||||
legacy::PassManager PM;
|
||||
|
||||
// If the bitcode files contain ARC code and were compiled with optimization,
|
||||
// the ObjCARCContractPass must be run, so do it unconditionally here.
|
||||
PM.add(createObjCARCContractPass());
|
||||
|
||||
// Setup the codegen now.
|
||||
if (TM.addPassesToEmitFile(PM, OS, nullptr, CodeGenFileType::ObjectFile,
|
||||
/* DisableVerify */ true))
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "ProvenanceAnalysis.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/BasicAliasAnalysis.h"
|
||||
#include "llvm/Analysis/ObjCARCUtil.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/EHPersonalities.h"
|
||||
@@ -71,6 +72,9 @@ class ObjCARCContract {
|
||||
ARCRuntimeEntryPoints EP;
|
||||
BundledRetainClaimRVs *BundledInsts = nullptr;
|
||||
|
||||
/// A flag indicating whether this optimization pass should run.
|
||||
bool Run;
|
||||
|
||||
/// The inline asm string to insert between calls and RetainRV calls to make
|
||||
/// the optimization work on targets which need it.
|
||||
const MDString *RVInstMarker;
|
||||
@@ -527,6 +531,10 @@ bool ObjCARCContract::tryToPeepholeInstruction(
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool ObjCARCContract::init(Module &M) {
|
||||
Run = ModuleHasARC(M);
|
||||
if (!Run)
|
||||
return false;
|
||||
|
||||
EP.init(&M);
|
||||
|
||||
// Initialize RVInstMarker.
|
||||
@@ -536,6 +544,9 @@ bool ObjCARCContract::init(Module &M) {
|
||||
}
|
||||
|
||||
bool ObjCARCContract::run(Function &F, AAResults *A, DominatorTree *D) {
|
||||
if (!Run)
|
||||
return false;
|
||||
|
||||
if (!EnableARCOpts)
|
||||
return false;
|
||||
|
||||
@@ -730,6 +741,9 @@ INITIALIZE_PASS_END(ObjCARCContractLegacyPass, "objc-arc-contract",
|
||||
void ObjCARCContractLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<AAResultsWrapperPass>();
|
||||
AU.addRequired<DominatorTreeWrapperPass>();
|
||||
AU.addPreserved<AAResultsWrapperPass>();
|
||||
AU.addPreserved<BasicAAWrapperPass>();
|
||||
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||
}
|
||||
|
||||
Pass *llvm::createObjCARCContractPass() {
|
||||
|
||||
@@ -102,11 +102,14 @@
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Merge internal globals
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: Natural Loop Information
|
||||
|
||||
@@ -279,6 +279,9 @@
|
||||
; GCN-O1-NEXT: AMDGPU Rewrite Undef for PHI
|
||||
; GCN-O1-NEXT: LCSSA Verifier
|
||||
; GCN-O1-NEXT: Loop-Closed SSA Form Pass
|
||||
; GCN-O1-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; GCN-O1-NEXT: Function Alias Analysis Results
|
||||
; GCN-O1-NEXT: ObjC ARC contraction
|
||||
; GCN-O1-NEXT: DummyCGSCCPass
|
||||
; GCN-O1-NEXT: FunctionPass Manager
|
||||
; GCN-O1-NEXT: Prepare callbr
|
||||
@@ -571,6 +574,9 @@
|
||||
; GCN-O1-OPTS-NEXT: AMDGPU Rewrite Undef for PHI
|
||||
; GCN-O1-OPTS-NEXT: LCSSA Verifier
|
||||
; GCN-O1-OPTS-NEXT: Loop-Closed SSA Form Pass
|
||||
; GCN-O1-OPTS-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; GCN-O1-OPTS-NEXT: Function Alias Analysis Results
|
||||
; GCN-O1-OPTS-NEXT: ObjC ARC contraction
|
||||
; GCN-O1-OPTS-NEXT: DummyCGSCCPass
|
||||
; GCN-O1-OPTS-NEXT: FunctionPass Manager
|
||||
; GCN-O1-OPTS-NEXT: Prepare callbr
|
||||
@@ -876,6 +882,11 @@
|
||||
; GCN-O2-NEXT: LCSSA Verifier
|
||||
; GCN-O2-NEXT: Loop-Closed SSA Form Pass
|
||||
; GCN-O2-NEXT: Analysis if a function is memory bound
|
||||
; GCN-O2-NEXT: FunctionPass Manager
|
||||
; GCN-O2-NEXT: Dominator Tree Construction
|
||||
; GCN-O2-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; GCN-O2-NEXT: Function Alias Analysis Results
|
||||
; GCN-O2-NEXT: ObjC ARC contraction
|
||||
; GCN-O2-NEXT: DummyCGSCCPass
|
||||
; GCN-O2-NEXT: FunctionPass Manager
|
||||
; GCN-O2-NEXT: Prepare callbr
|
||||
@@ -1194,6 +1205,11 @@
|
||||
; GCN-O3-NEXT: LCSSA Verifier
|
||||
; GCN-O3-NEXT: Loop-Closed SSA Form Pass
|
||||
; GCN-O3-NEXT: Analysis if a function is memory bound
|
||||
; GCN-O3-NEXT: FunctionPass Manager
|
||||
; GCN-O3-NEXT: Dominator Tree Construction
|
||||
; GCN-O3-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; GCN-O3-NEXT: Function Alias Analysis Results
|
||||
; GCN-O3-NEXT: ObjC ARC contraction
|
||||
; GCN-O3-NEXT: DummyCGSCCPass
|
||||
; GCN-O3-NEXT: FunctionPass Manager
|
||||
; GCN-O3-NEXT: Prepare callbr
|
||||
|
||||
@@ -64,11 +64,14 @@
|
||||
; CHECK-NEXT: Transform predicated vector loops to use MVE tail predication
|
||||
; CHECK-NEXT: A No-Op Barrier Pass
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: Natural Loop Information
|
||||
|
||||
@@ -70,6 +70,9 @@
|
||||
; LAXX-NEXT: CodeGen Prepare
|
||||
; LAXX-NEXT: Dominator Tree Construction
|
||||
; LAXX-NEXT: Exception handling preparation
|
||||
; LAXX-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; LAXX-NEXT: Function Alias Analysis Results
|
||||
; LAXX-NEXT: ObjC ARC contraction
|
||||
; LAXX-NEXT: Prepare callbr
|
||||
; LAXX-NEXT: Safe Stack instrumentation pass
|
||||
; LAXX-NEXT: Insert stack protectors
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
; CHECK-NEXT: CodeGen Prepare
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Exception handling preparation
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
|
||||
@@ -81,6 +81,9 @@
|
||||
; CHECK-NEXT: Lazy Block Frequency Analysis
|
||||
; CHECK-NEXT: Optimization Remark Emitter
|
||||
; CHECK-NEXT: Hardware Loop Insertion
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
|
||||
@@ -73,11 +73,14 @@
|
||||
; CHECK-NEXT: Exception handling preparation
|
||||
; CHECK-NEXT: A No-Op Barrier Pass
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: Natural Loop Information
|
||||
@@ -194,7 +197,7 @@
|
||||
; CHECK-NEXT: Machine Optimization Remark Emitter
|
||||
; CHECK-NEXT: Stack Frame Layout Analysis
|
||||
; CHECK-NEXT: RISC-V Zcmp move merging pass
|
||||
; CHECK-NEXT: RISC-V Zcmp Push/Pop optimization pass
|
||||
; CHECK-NEXT: RISC-V Zcmp Push/Pop optimization pass
|
||||
; CHECK-NEXT: RISC-V Indirect Branch Tracking
|
||||
; CHECK-NEXT: RISC-V pseudo instruction expansion pass
|
||||
; CHECK-NEXT: RISC-V atomic pseudo instruction expansion pass
|
||||
|
||||
@@ -71,6 +71,9 @@
|
||||
; CHECK-NEXT: CodeGen Prepare
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
; CHECK-NEXT: Exception handling preparation
|
||||
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
||||
; CHECK-NEXT: Function Alias Analysis Results
|
||||
; CHECK-NEXT: ObjC ARC contraction
|
||||
; CHECK-NEXT: Prepare callbr
|
||||
; CHECK-NEXT: Safe Stack instrumentation pass
|
||||
; CHECK-NEXT: Insert stack protectors
|
||||
|
||||
Reference in New Issue
Block a user