[llvm] [ObjCARC] Run ObjCARCContract before PreISelIntrinsicLowering (PR #184149)
Marina Taylor via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 2 07:00:10 PST 2026
https://github.com/citymarina created https://github.com/llvm/llvm-project/pull/184149
74e4694 moved ObjCARCContract from running before the codegen pipeline into addISelPrepare(), which runs after PreISelIntrinsicLowering.
This broke ObjCARCContract's retainRV-to-claimRV optimization because ObjCARCContract identifies ARC calls via intrinsics, not their lowered counterparts.
This patch restores the pre-74e4694 ordering by moving ObjCARCContract to addISelPasses.
The IntrinsicInst.cpp change looks extraneous but is required here: ObjCARCContract may now rewrite the bundle operand from retainRV to claimRV. When PreISelIntrinsicLowering then encounters this new intrinsic use, lowerObjCCall asserts mayLowerToFunctionCall.
Assisted-by: claude
rdar://137997453
>From 0d4d6d5a5092af591ff208ab14446049da265285 Mon Sep 17 00:00:00 2001
From: Marina Taylor <marina_taylor at apple.com>
Date: Tue, 24 Feb 2026 17:24:07 +0000
Subject: [PATCH] [ObjCARC] Run ObjCARCContract before PreISelIntrinsicLowering
74e4694 moved ObjCARCContract from running before the
codegen pipeline into addISelPrepare(), which runs after
PreISelIntrinsicLowering.
This broke ObjCARCContract's retainRV-to-claimRV optimization because
ObjCARCContract identifies ARC calls via intrinsics, not their lowered
counterparts.
This patch restores the pre-74e4694 ordering by moving ObjCARCContract
to addISelPasses.
The IntrinsicInst.cpp change looks extraneous but is required here:
ObjCARCContract may now rewrite the bundle operand from retainRV to
claimRV. When PreISelIntrinsicLowering then encounters this new
intrinsic use, lowerObjCCall asserts mayLowerToFunctionCall.
Assisted-by: claude
rdar://137997453
---
llvm/include/llvm/Passes/CodeGenPassBuilder.h | 9 ++--
llvm/lib/CodeGen/TargetPassConfig.cpp | 7 +--
llvm/lib/IR/IntrinsicInst.cpp | 1 +
llvm/test/CodeGen/AArch64/O3-pipeline.ll | 12 +++--
.../CodeGen/AArch64/arc-contract-claim-rv.ll | 19 ++++++++
llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll | 4 +-
llvm/test/CodeGen/AMDGPU/llc-pipeline.ll | 48 +++++++++++--------
llvm/test/CodeGen/ARM/O3-pipeline.ll | 10 ++--
llvm/test/CodeGen/LoongArch/opt-pipeline.ll | 10 ++--
llvm/test/CodeGen/M68k/pipeline.ll | 8 ++--
llvm/test/CodeGen/PowerPC/O3-pipeline.ll | 10 ++--
llvm/test/CodeGen/RISCV/O3-pipeline.ll | 12 +++--
llvm/test/CodeGen/SPIRV/llc-pipeline.ll | 12 +++--
.../GlobalISel/gisel-commandline-option.ll | 1 +
llvm/test/CodeGen/X86/llc-pipeline-npm.ll | 4 +-
llvm/test/CodeGen/X86/opt-pipeline.ll | 19 +++++---
16 files changed, 119 insertions(+), 67 deletions(-)
create mode 100644 llvm/test/CodeGen/AArch64/arc-contract-claim-rv.ll
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 8130737ae4c20..49c1f491b2b83 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -681,6 +681,12 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPasses(
if (TM.useEmulatedTLS())
addModulePass(LowerEmuTLSPass(), PMW);
+ // ObjCARCContract operates on ObjC intrinsics and must run before
+ // PreISelIntrinsicLowering.
+ if (getOptLevel() != CodeGenOptLevel::None) {
+ addFunctionPass(ObjCARCContractPass(), PMW);
+ flushFPMsToMPM(PMW);
+ }
addModulePass(PreISelIntrinsicLoweringPass(&TM), PMW);
addFunctionPass(ExpandIRInstsPass(TM, getOptLevel()), PMW);
@@ -839,9 +845,6 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPrepare(
if (Opt.RequiresCodeGenSCCOrder && !AddInCGSCCOrder)
requireCGSCCOrder(PMW);
- if (getOptLevel() != CodeGenOptLevel::None)
- addFunctionPass(ObjCARCContractPass(), PMW);
-
addFunctionPass(InlineAsmPreparePass(), PMW);
// Add both the safe stack and the stack protection passes: each of them will
// only protect functions that have corresponding attributes.
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index a541b9fac0369..f84295225efa5 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -982,9 +982,6 @@ void TargetPassConfig::addISelPrepare() {
if (requiresCodeGenSCCOrder())
addPass(new DummyCGSCCPass);
- if (getOptLevel() != CodeGenOptLevel::None)
- addPass(createObjCARCContractPass());
-
addPass(createInlineAsmPreparePass());
// Add both the safe stack and the stack protection passes: each of them will
@@ -1095,6 +1092,10 @@ bool TargetPassConfig::addISelPasses() {
addPass(createLowerEmuTLSPass());
PM->add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
+ // ObjCARCContract operates on ObjC intrinsics and must run before
+ // PreISelIntrinsicLowering.
+ if (getOptLevel() != CodeGenOptLevel::None)
+ addPass(createObjCARCContractPass());
addPass(createPreISelIntrinsicLoweringPass());
addPass(createExpandIRInstsPass(getOptLevel()));
addIRPasses();
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp
index 281cbd4388b58..5b3e3cf45397f 100644
--- a/llvm/lib/IR/IntrinsicInst.cpp
+++ b/llvm/lib/IR/IntrinsicInst.cpp
@@ -39,6 +39,7 @@ bool IntrinsicInst::mayLowerToFunctionCall(Intrinsic::ID IID) {
case Intrinsic::objc_autoreleasePoolPop:
case Intrinsic::objc_autoreleasePoolPush:
case Intrinsic::objc_autoreleaseReturnValue:
+ case Intrinsic::objc_claimAutoreleasedReturnValue:
case Intrinsic::objc_copyWeak:
case Intrinsic::objc_destroyWeak:
case Intrinsic::objc_initWeak:
diff --git a/llvm/test/CodeGen/AArch64/O3-pipeline.ll b/llvm/test/CodeGen/AArch64/O3-pipeline.ll
index 620041253ecfc..6b98f9e08c840 100644
--- a/llvm/test/CodeGen/AArch64/O3-pipeline.ll
+++ b/llvm/test/CodeGen/AArch64/O3-pipeline.ll
@@ -9,8 +9,8 @@
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
-; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
+; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Profile summary info
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis
@@ -19,6 +19,11 @@
; CHECK-NEXT: Default Regalloc Eviction Advisor
; CHECK-NEXT: Default Regalloc Priority Advisor
; CHECK-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -106,15 +111,12 @@
; 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 inline asm insts
; CHECK-NEXT: Safe Stack instrumentation pass
; CHECK-NEXT: Insert stack protectors
; CHECK-NEXT: Module Verifier
; CHECK-NEXT: Analysis containing CSE Info
+; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Natural Loop Information
; CHECK-NEXT: Post-Dominator Tree Construction
; CHECK-NEXT: Branch Probability Analysis
diff --git a/llvm/test/CodeGen/AArch64/arc-contract-claim-rv.ll b/llvm/test/CodeGen/AArch64/arc-contract-claim-rv.ll
new file mode 100644
index 0000000000000..f3c5ad2235280
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arc-contract-claim-rv.ll
@@ -0,0 +1,19 @@
+; RUN: llc -o - %s | FileCheck %s
+
+; Verify that ObjCARCContract rewrites retainRV to claimRV, removing the
+; retainRV marker.
+
+target triple = "arm64-apple-ios18"
+
+declare ptr @f()
+
+; CHECK-LABEL: _t:
+; CHECK: bl _f
+; CHECK-NEXT: bl _objc_claimAutoreleasedReturnValue
+; CHECK-NOT: mov x29, x29
+define ptr @t() {
+ %call = call ptr @f() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
+ ret ptr %call
+}
+
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
diff --git a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
index b1d9d618302a8..e757de7df1dd8 100644
--- a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
+++ b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
@@ -100,6 +100,7 @@
; GCN-O2-NEXT: require<collector-metadata>
; GCN-O2-NEXT: require<runtime-libcall-info>
; GCN-O2-NEXT: require<libcall-lowering-info>
+; GCN-O2-NEXT: function(objc-arc-contract)
; GCN-O2-NEXT: pre-isel-intrinsic-lowering
; GCN-O2-NEXT: function(expand-ir-insts<O2>)
; GCN-O2-NEXT: amdgpu-remove-incompatible-functions
@@ -160,7 +161,6 @@
; GCN-O2-NEXT: lcssa))
; GCN-O2-NEXT: amdgpu-perf-hint
; GCN-O2-NEXT: cgscc(function(require<uniformity>
-; GCN-O2-NEXT: objc-arc-contract
; GCN-O2-NEXT: inline-asm-prepare
; GCN-O2-NEXT: safe-stack
; GCN-O2-NEXT: stack-protector
@@ -272,6 +272,7 @@
; GCN-O3-NEXT: require<collector-metadata>
; GCN-O3-NEXT: require<runtime-libcall-info>
; GCN-O3-NEXT: require<libcall-lowering-info>
+; GCN-O3-NEXT: function(objc-arc-contract)
; GCN-O3-NEXT: pre-isel-intrinsic-lowering
; GCN-O3-NEXT: function(expand-ir-insts<O3>)
; GCN-O3-NEXT: amdgpu-remove-incompatible-functions
@@ -332,7 +333,6 @@
; GCN-O3-NEXT: lcssa))
; GCN-O3-NEXT: amdgpu-perf-hint
; GCN-O3-NEXT: cgscc(function(require<uniformity>
-; GCN-O3-NEXT: objc-arc-contract
; GCN-O3-NEXT: inline-asm-prepare
; GCN-O3-NEXT: safe-stack
; GCN-O3-NEXT: stack-protector
diff --git a/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll b/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll
index 2904ba604fb1b..ab043ba9ce32a 100644
--- a/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll
+++ b/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll
@@ -167,8 +167,8 @@
; GCN-O1-NEXT:Target Pass Configuration
; GCN-O1-NEXT:Machine Module Information
; GCN-O1-NEXT:Target Transform Information
-; GCN-O1-NEXT:Library Function Lowering Analysis
; GCN-O1-NEXT:Assumption Cache Tracker
+; GCN-O1-NEXT:Library Function Lowering Analysis
; GCN-O1-NEXT:Profile summary info
; GCN-O1-NEXT:AMDGPU Address space based Alias Analysis
; GCN-O1-NEXT:External Alias Analysis
@@ -181,6 +181,11 @@
; GCN-O1-NEXT:Default Regalloc Eviction Advisor
; GCN-O1-NEXT:Default Regalloc Priority Advisor
; GCN-O1-NEXT: ModulePass Manager
+; GCN-O1-NEXT: FunctionPass Manager
+; GCN-O1-NEXT: Dominator Tree Construction
+; 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: Pre-ISel Intrinsic Lowering
; GCN-O1-NEXT: FunctionPass Manager
; GCN-O1-NEXT: Expand IR instructions
@@ -298,13 +303,10 @@
; GCN-O1-NEXT: Call Graph SCC Pass Manager
; GCN-O1-NEXT: DummyCGSCCPass
; GCN-O1-NEXT: FunctionPass Manager
-; GCN-O1-NEXT: Dominator Tree Construction
-; 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: Prepare inline asm insts
; GCN-O1-NEXT: Safe Stack instrumentation pass
; GCN-O1-NEXT: Insert stack protectors
+; GCN-O1-NEXT: Dominator Tree Construction
; GCN-O1-NEXT: Cycle Info Analysis
; GCN-O1-NEXT: Uniformity Analysis
; GCN-O1-NEXT: Basic Alias Analysis (stateless AA impl)
@@ -460,8 +462,8 @@
; GCN-O1-OPTS-NEXT:Target Pass Configuration
; GCN-O1-OPTS-NEXT:Machine Module Information
; GCN-O1-OPTS-NEXT:Target Transform Information
-; GCN-O1-OPTS-NEXT:Library Function Lowering Analysis
; GCN-O1-OPTS-NEXT:Assumption Cache Tracker
+; GCN-O1-OPTS-NEXT:Library Function Lowering Analysis
; GCN-O1-OPTS-NEXT:Profile summary info
; GCN-O1-OPTS-NEXT:AMDGPU Address space based Alias Analysis
; GCN-O1-OPTS-NEXT:External Alias Analysis
@@ -474,6 +476,11 @@
; GCN-O1-OPTS-NEXT:Default Regalloc Eviction Advisor
; GCN-O1-OPTS-NEXT:Default Regalloc Priority Advisor
; GCN-O1-OPTS-NEXT: ModulePass Manager
+; GCN-O1-OPTS-NEXT: FunctionPass Manager
+; GCN-O1-OPTS-NEXT: Dominator Tree Construction
+; 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: Pre-ISel Intrinsic Lowering
; GCN-O1-OPTS-NEXT: FunctionPass Manager
; GCN-O1-OPTS-NEXT: Expand IR instructions
@@ -611,13 +618,10 @@
; GCN-O1-OPTS-NEXT: Call Graph SCC Pass Manager
; GCN-O1-OPTS-NEXT: DummyCGSCCPass
; GCN-O1-OPTS-NEXT: FunctionPass Manager
-; GCN-O1-OPTS-NEXT: Dominator Tree Construction
-; 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: Prepare inline asm insts
; GCN-O1-OPTS-NEXT: Safe Stack instrumentation pass
; GCN-O1-OPTS-NEXT: Insert stack protectors
+; GCN-O1-OPTS-NEXT: Dominator Tree Construction
; GCN-O1-OPTS-NEXT: Cycle Info Analysis
; GCN-O1-OPTS-NEXT: Uniformity Analysis
; GCN-O1-OPTS-NEXT: Basic Alias Analysis (stateless AA impl)
@@ -780,8 +784,8 @@
; GCN-O2-NEXT:Target Pass Configuration
; GCN-O2-NEXT:Machine Module Information
; GCN-O2-NEXT:Target Transform Information
-; GCN-O2-NEXT:Library Function Lowering Analysis
; GCN-O2-NEXT:Assumption Cache Tracker
+; GCN-O2-NEXT:Library Function Lowering Analysis
; GCN-O2-NEXT:Profile summary info
; GCN-O2-NEXT:AMDGPU Address space based Alias Analysis
; GCN-O2-NEXT:External Alias Analysis
@@ -794,6 +798,11 @@
; GCN-O2-NEXT:Default Regalloc Eviction Advisor
; GCN-O2-NEXT:Default Regalloc Priority Advisor
; GCN-O2-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; GCN-O2-NEXT: FunctionPass Manager
; GCN-O2-NEXT: Expand IR instructions
@@ -935,13 +944,10 @@
; GCN-O2-NEXT: Analysis if a function is memory bound
; GCN-O2-NEXT: DummyCGSCCPass
; 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: Prepare inline asm insts
; GCN-O2-NEXT: Safe Stack instrumentation pass
; GCN-O2-NEXT: Insert stack protectors
+; GCN-O2-NEXT: Dominator Tree Construction
; GCN-O2-NEXT: Cycle Info Analysis
; GCN-O2-NEXT: Uniformity Analysis
; GCN-O2-NEXT: Basic Alias Analysis (stateless AA impl)
@@ -1105,8 +1111,8 @@
; GCN-O3-NEXT:Target Pass Configuration
; GCN-O3-NEXT:Machine Module Information
; GCN-O3-NEXT:Target Transform Information
-; GCN-O3-NEXT:Library Function Lowering Analysis
; GCN-O3-NEXT:Assumption Cache Tracker
+; GCN-O3-NEXT:Library Function Lowering Analysis
; GCN-O3-NEXT:Profile summary info
; GCN-O3-NEXT:AMDGPU Address space based Alias Analysis
; GCN-O3-NEXT:External Alias Analysis
@@ -1119,6 +1125,11 @@
; GCN-O3-NEXT:Default Regalloc Eviction Advisor
; GCN-O3-NEXT:Default Regalloc Priority Advisor
; GCN-O3-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; GCN-O3-NEXT: FunctionPass Manager
; GCN-O3-NEXT: Expand IR instructions
@@ -1273,13 +1284,10 @@
; GCN-O3-NEXT: Analysis if a function is memory bound
; GCN-O3-NEXT: DummyCGSCCPass
; 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: Prepare inline asm insts
; GCN-O3-NEXT: Safe Stack instrumentation pass
; GCN-O3-NEXT: Insert stack protectors
+; GCN-O3-NEXT: Dominator Tree Construction
; GCN-O3-NEXT: Cycle Info Analysis
; GCN-O3-NEXT: Uniformity Analysis
; GCN-O3-NEXT: Basic Alias Analysis (stateless AA impl)
diff --git a/llvm/test/CodeGen/ARM/O3-pipeline.ll b/llvm/test/CodeGen/ARM/O3-pipeline.ll
index 98bb87524db44..9d51ba49b2ff0 100644
--- a/llvm/test/CodeGen/ARM/O3-pipeline.ll
+++ b/llvm/test/CodeGen/ARM/O3-pipeline.ll
@@ -3,6 +3,11 @@
; REQUIRES: asserts
; CHECK: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -65,14 +70,11 @@
; 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 inline asm insts
; 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
diff --git a/llvm/test/CodeGen/LoongArch/opt-pipeline.ll b/llvm/test/CodeGen/LoongArch/opt-pipeline.ll
index 262ee06c6f732..bcfa896e4b11c 100644
--- a/llvm/test/CodeGen/LoongArch/opt-pipeline.ll
+++ b/llvm/test/CodeGen/LoongArch/opt-pipeline.ll
@@ -21,8 +21,8 @@
; LAXX-NEXT: Target Pass Configuration
; LAXX-NEXT: Machine Module Information
; LAXX-NEXT: Target Transform Information
-; LAXX-NEXT: Library Function Lowering Analysis
; LAXX-NEXT: Assumption Cache Tracker
+; LAXX-NEXT: Library Function Lowering Analysis
; LAXX-NEXT: Type-Based Alias Analysis
; LAXX-NEXT: Scoped NoAlias Alias Analysis
; LAXX-NEXT: Profile summary info
@@ -31,6 +31,11 @@
; LAXX-NEXT: Default Regalloc Eviction Advisor
; LAXX-NEXT: Default Regalloc Priority Advisor
; LAXX-NEXT: ModulePass Manager
+; LAXX-NEXT: FunctionPass Manager
+; LAXX-NEXT: Dominator Tree Construction
+; LAXX-NEXT: Basic Alias Analysis (stateless AA impl)
+; LAXX-NEXT: Function Alias Analysis Results
+; LAXX-NEXT: ObjC ARC contraction
; LAXX-NEXT: Pre-ISel Intrinsic Lowering
; LAXX-NEXT: FunctionPass Manager
; LAXX-NEXT: Expand IR instructions
@@ -73,9 +78,6 @@
; 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 inline asm insts
; LAXX-NEXT: Safe Stack instrumentation pass
; LAXX-NEXT: Insert stack protectors
diff --git a/llvm/test/CodeGen/M68k/pipeline.ll b/llvm/test/CodeGen/M68k/pipeline.ll
index cb96cbde08d51..361c2d526daf8 100644
--- a/llvm/test/CodeGen/M68k/pipeline.ll
+++ b/llvm/test/CodeGen/M68k/pipeline.ll
@@ -1,5 +1,10 @@
; RUN: llc -mtriple=m68k -debug-pass=Structure < %s -o /dev/null 2>&1 | grep -v "Verify generated machine code" | FileCheck %s
; CHECK: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -41,9 +46,6 @@
; 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 inline asm insts
; CHECK-NEXT: Safe Stack instrumentation pass
; CHECK-NEXT: Insert stack protectors
diff --git a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll
index f771b5728e5b5..a304fcbf18a0c 100644
--- a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll
+++ b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll
@@ -9,8 +9,8 @@
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
-; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
+; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis
; CHECK-NEXT: Profile summary info
@@ -19,6 +19,11 @@
; CHECK-NEXT: Default Regalloc Eviction Advisor
; CHECK-NEXT: Default Regalloc Priority Advisor
; CHECK-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -82,9 +87,6 @@
; 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 inline asm insts
; CHECK-NEXT: Safe Stack instrumentation pass
; CHECK-NEXT: Insert stack protectors
diff --git a/llvm/test/CodeGen/RISCV/O3-pipeline.ll b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
index 2b9558e0c69e3..76a51db6dcfbd 100644
--- a/llvm/test/CodeGen/RISCV/O3-pipeline.ll
+++ b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
@@ -13,8 +13,8 @@
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
-; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
+; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Profile summary info
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis
@@ -23,6 +23,11 @@
; CHECK-NEXT: Default Regalloc Eviction Advisor
; CHECK-NEXT: Default Regalloc Priority Advisor
; CHECK-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -89,14 +94,11 @@
; CHECK-NEXT: A No-Op Barrier Pass
; 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 inline asm insts
; 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
diff --git a/llvm/test/CodeGen/SPIRV/llc-pipeline.ll b/llvm/test/CodeGen/SPIRV/llc-pipeline.ll
index eb1128ac5417a..258c6e21da990 100644
--- a/llvm/test/CodeGen/SPIRV/llc-pipeline.ll
+++ b/llvm/test/CodeGen/SPIRV/llc-pipeline.ll
@@ -93,14 +93,19 @@
; SPIRV-Opt-NEXT:Target Pass Configuration
; SPIRV-Opt-NEXT:Machine Module Information
; SPIRV-Opt-NEXT:Target Transform Information
-; SPIRV-Opt-NEXT:Library Function Lowering Analysis
; SPIRV-Opt-NEXT:Assumption Cache Tracker
+; SPIRV-Opt-NEXT:Library Function Lowering Analysis
; SPIRV-Opt-NEXT:Type-Based Alias Analysis
; SPIRV-Opt-NEXT:Scoped NoAlias Alias Analysis
; SPIRV-Opt-NEXT:Profile summary info
; SPIRV-Opt-NEXT:Create Garbage Collector Module Metadata
; SPIRV-Opt-NEXT:Machine Branch Probability Analysis
; SPIRV-Opt-NEXT: ModulePass Manager
+; SPIRV-Opt-NEXT: FunctionPass Manager
+; SPIRV-Opt-NEXT: Dominator Tree Construction
+; SPIRV-Opt-NEXT: Basic Alias Analysis (stateless AA impl)
+; SPIRV-Opt-NEXT: Function Alias Analysis Results
+; SPIRV-Opt-NEXT: ObjC ARC contraction
; SPIRV-Opt-NEXT: Pre-ISel Intrinsic Lowering
; SPIRV-Opt-NEXT: FunctionPass Manager
; SPIRV-Opt-NEXT: Expand IR instructions
@@ -156,14 +161,11 @@
; SPIRV-Opt-NEXT: SPIRV emit intrinsics
; SPIRV-Opt-NEXT: FunctionPass Manager
; SPIRV-Opt-NEXT: SPIRV legalize bitcast pass
-; SPIRV-Opt-NEXT: Dominator Tree Construction
-; SPIRV-Opt-NEXT: Basic Alias Analysis (stateless AA impl)
-; SPIRV-Opt-NEXT: Function Alias Analysis Results
-; SPIRV-Opt-NEXT: ObjC ARC contraction
; SPIRV-Opt-NEXT: Prepare inline asm insts
; SPIRV-Opt-NEXT: Safe Stack instrumentation pass
; SPIRV-Opt-NEXT: Insert stack protectors
; SPIRV-Opt-NEXT: Analysis containing CSE Info
+; SPIRV-Opt-NEXT: Dominator Tree Construction
; SPIRV-Opt-NEXT: Natural Loop Information
; SPIRV-Opt-NEXT: Post-Dominator Tree Construction
; SPIRV-Opt-NEXT: Branch Probability Analysis
diff --git a/llvm/test/CodeGen/WebAssembly/GlobalISel/gisel-commandline-option.ll b/llvm/test/CodeGen/WebAssembly/GlobalISel/gisel-commandline-option.ll
index 47b05c8160fd1..bff1f6912d48b 100644
--- a/llvm/test/CodeGen/WebAssembly/GlobalISel/gisel-commandline-option.ll
+++ b/llvm/test/CodeGen/WebAssembly/GlobalISel/gisel-commandline-option.ll
@@ -25,6 +25,7 @@
; ENABLED-O1-NEXT: WebAssemblyPostLegalizerCombiner
; ENABLED-NEXT: RegBankSelect
; ENABLED-NEXT: Analysis for ComputingKnownBits
+; ENABLED-O1-NEXT: Dominator Tree Construction
; ENABLED-O1-NEXT: Natural Loop Information
; ENABLED-O1-NEXT: Lazy Branch Probability Analysis
; ENABLED-O1-NEXT: Lazy Block Frequency Analysis
diff --git a/llvm/test/CodeGen/X86/llc-pipeline-npm.ll b/llvm/test/CodeGen/X86/llc-pipeline-npm.ll
index 49df99b25e0b9..edbdda3091eb2 100644
--- a/llvm/test/CodeGen/X86/llc-pipeline-npm.ll
+++ b/llvm/test/CodeGen/X86/llc-pipeline-npm.ll
@@ -76,6 +76,7 @@
; O2-NEXT: require<collector-metadata>
; O2-NEXT: require<runtime-libcall-info>
; O2-NEXT: require<libcall-lowering-info>
+; O2-NEXT: function(objc-arc-contract)
; O2-NEXT: pre-isel-intrinsic-lowering
; O2-NEXT: function(expand-ir-insts<O2>
; O2-NEXT: atomic-expand
@@ -100,7 +101,6 @@
; O2-NEXT: indirectbr-expand
; O2-NEXT: codegenprepare
; O2-NEXT: dwarf-eh-prepare
-; O2-NEXT: objc-arc-contract
; O2-NEXT: inline-asm-prepare
; O2-NEXT: safe-stack
; O2-NEXT: stack-protector
@@ -257,6 +257,7 @@
; O3-WINDOWS-NEXT: require<collector-metadata>
; O3-WINDOWS-NEXT: require<runtime-libcall-info>
; O3-WINDOWS-NEXT: require<libcall-lowering-info>
+; O3-WINDOWS-NEXT: function(objc-arc-contract)
; O3-WINDOWS-NEXT: pre-isel-intrinsic-lowering
; O3-WINDOWS-NEXT: function(expand-ir-insts<O3>
; O3-WINDOWS-NEXT: atomic-expand
@@ -283,7 +284,6 @@
; O3-WINDOWS-NEXT: codegenprepare
; O3-WINDOWS-NEXT: win-eh-prepare
; O3-WINDOWS-NEXT: dwarf-eh-prepare
-; O3-WINDOWS-NEXT: objc-arc-contract
; O3-WINDOWS-NEXT: inline-asm-prepare
; O3-WINDOWS-NEXT: safe-stack
; O3-WINDOWS-NEXT: stack-protector
diff --git a/llvm/test/CodeGen/X86/opt-pipeline.ll b/llvm/test/CodeGen/X86/opt-pipeline.ll
index 55d386d0f0952..987cf0937ac46 100644
--- a/llvm/test/CodeGen/X86/opt-pipeline.ll
+++ b/llvm/test/CodeGen/X86/opt-pipeline.ll
@@ -17,8 +17,8 @@
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
-; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
+; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis
; CHECK-NEXT: Profile summary info
@@ -27,6 +27,11 @@
; CHECK-NEXT: Default Regalloc Eviction Advisor
; CHECK-NEXT: Default Regalloc Priority Advisor
; CHECK-NEXT: ModulePass Manager
+; 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: Pre-ISel Intrinsic Lowering
; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Expand IR instructions
@@ -73,9 +78,6 @@
; 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 inline asm insts
; CHECK-NEXT: Safe Stack instrumentation pass
; CHECK-NEXT: Insert stack protectors
@@ -230,9 +232,12 @@
; CHECK-NEXT: X86 Assembly Printer
; CHECK-NEXT: Free MachineFunction
-; We should only have one function pass manager.
-; In the past, module passes have accidentally been added into the middle of
-; the codegen pipeline, implicitly creating new function pass managers.
+; We should only have two function pass managers: one for ObjCARCContract
+; (which must run before the PreISelIntrinsicLowering module pass), and one
+; for everything else. In the past, module passes have accidentally been added
+; into the middle of the codegen pipeline, implicitly creating new function
+; pass managers.
+; FPM: FunctionPass Manager
; FPM: FunctionPass Manager
; FPM-NOT: FunctionPass Manager
More information about the llvm-commits
mailing list