[llvm] InferAddressSpaces: Replace -assume-default-is-flat-addrspace cl::opt with pass parameter (PR #223480)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 10:58:45 PDT 2026
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/223480
Migrate the pass-specific command-line option to a new pass manager
pass parameter, exposed as
infer-address-spaces<assume-default-is-flat-addrspace>.
Co-authored-by: Claude (Opus 4.8) <noreply at anthropic.com>
>From e5db2244854223b33f7939e7edefbdc413738266 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 14 Sep 2026 18:04:39 +0200
Subject: [PATCH] InferAddressSpaces: Replace -assume-default-is-flat-addrspace
cl::opt with pass parameter
Migrate the pass-specific command-line option to a new pass manager
pass parameter, exposed as
infer-address-spaces<assume-default-is-flat-addrspace>.
Co-authored-by: Claude (Opus 4.8) <noreply at anthropic.com>
---
.../Transforms/Scalar/InferAddressSpaces.h | 20 ++++++---
llvm/lib/Passes/PassBuilder.cpp | 5 +++
llvm/lib/Passes/PassRegistry.def | 7 +++-
.../Transforms/Scalar/InferAddressSpaces.cpp | 42 ++++++++++++-------
llvm/test/Other/new-pm-print-pipeline.ll | 3 ++
.../AMDGPU/noop-ptrint-pair.ll | 2 +-
.../X86/noop-ptrint-pair.ll | 2 +-
.../Transforms/InferAddressSpaces/fake-use.ll | 2 +-
.../masked-gather-scatter.ll | 2 +-
.../optnone-func-unchanged.ll | 2 +-
.../pass-param-parse-errors.ll | 3 ++
.../InferAddressSpaces/vector-of-pointers.ll | 2 +-
12 files changed, 66 insertions(+), 26 deletions(-)
create mode 100644 llvm/test/Transforms/InferAddressSpaces/pass-param-parse-errors.ll
diff --git a/llvm/include/llvm/Transforms/Scalar/InferAddressSpaces.h b/llvm/include/llvm/Transforms/Scalar/InferAddressSpaces.h
index ffdfb91b3132b..72cfb313c11c6 100644
--- a/llvm/include/llvm/Transforms/Scalar/InferAddressSpaces.h
+++ b/llvm/include/llvm/Transforms/Scalar/InferAddressSpaces.h
@@ -13,13 +13,23 @@
namespace llvm {
-struct InferAddressSpacesPass : OptionalPassInfoMixin<InferAddressSpacesPass> {
- LLVM_ABI InferAddressSpacesPass();
- LLVM_ABI InferAddressSpacesPass(unsigned AddressSpace);
+class InferAddressSpacesPass
+ : public OptionalPassInfoMixin<InferAddressSpacesPass> {
+ unsigned FlatAddrSpace = 0;
+
+ /// The default address space is assumed as the flat address space. This is
+ /// mainly for test purpose.
+ const bool AssumeDefaultIsFlatAddressSpace;
+
+public:
+ LLVM_ABI InferAddressSpacesPass(bool AssumeDefaultIsFlatAddressSpace = false);
+ LLVM_ABI InferAddressSpacesPass(unsigned AddressSpace,
+ bool AssumeDefaultIsFlatAddressSpace = false);
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-private:
- unsigned FlatAddrSpace = 0;
+ LLVM_ABI void
+ printPipeline(raw_ostream &OS,
+ function_ref<StringRef(StringRef)> MapClassName2PassName);
};
} // end namespace llvm
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 725ce2d589a31..6368a9012a87b 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -898,6 +898,11 @@ Expected<bool> parseInstCountOptions(StringRef Params) {
return PassBuilder::parseSinglePassOption(Params, "pre-opt", "InstCountPass");
}
+Expected<bool> parseInferAddressSpacesPassOptions(StringRef Params) {
+ return PassBuilder::parseSinglePassOption(
+ Params, "assume-default-is-flat-addrspace", "InferAddressSpacesPass");
+}
+
/// Parser of parameters for LoopUnroll pass.
Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {
LoopUnrollOptions UnrollOpts;
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 43a15f4cf9ff3..33c9e19988d7a 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -455,7 +455,6 @@ FUNCTION_PASS("gvn-hoist", GVNHoistPass())
FUNCTION_PASS("gvn-sink", GVNSinkPass())
FUNCTION_PASS("helloworld", HelloWorldPass())
FUNCTION_PASS("indirectbr-expand", IndirectBrExpandPass(*TM))
-FUNCTION_PASS("infer-address-spaces", InferAddressSpacesPass())
FUNCTION_PASS("infer-alignment", InferAlignmentPass())
FUNCTION_PASS("inject-tli-mappings", InjectTLIMappings())
FUNCTION_PASS("inline-asm-prepare", InlineAsmPreparePass())
@@ -585,6 +584,12 @@ FUNCTION_PASS_WITH_PARAMS(
"early-cse", "EarlyCSEPass",
[](bool UseMemorySSA) { return EarlyCSEPass(UseMemorySSA); },
parseEarlyCSEPassOptions, "memssa")
+FUNCTION_PASS_WITH_PARAMS(
+ "infer-address-spaces", "InferAddressSpacesPass",
+ [](bool AssumeDefaultIsFlatAddressSpace) {
+ return InferAddressSpacesPass(AssumeDefaultIsFlatAddressSpace);
+ },
+ parseInferAddressSpacesPassOptions, "assume-default-is-flat-addrspace")
FUNCTION_PASS_WITH_PARAMS(
"drop-unnecessary-assumes", "DropUnnecessaryAssumesPass",
[](bool DropDereferenceable) { return DropUnnecessaryAssumesPass(DropDereferenceable); },
diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
index 3820f3e1e45ad..fe4e80bbd2fb9 100644
--- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -121,7 +121,6 @@
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
-#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
@@ -141,11 +140,6 @@
using namespace llvm;
using namespace llvm::PatternMatch;
-static cl::opt<bool> AssumeDefaultIsFlatAddressSpace(
- "assume-default-is-flat-addrspace", cl::init(false), cl::ReallyHidden,
- cl::desc("The default address space is assumed as the flat address space. "
- "This is mainly for test purpose."));
-
static const unsigned UninitializedAddressSpace =
std::numeric_limits<unsigned>::max();
@@ -195,6 +189,11 @@ class InferAddressSpacesImpl {
/// Target specific address space which uses of should be replaced if
/// possible.
unsigned FlatAddrSpace = 0;
+
+ /// The default address space is assumed as the flat address space. This is
+ /// mainly for test purpose.
+ const bool AssumeDefaultIsFlatAddressSpace = false;
+
DenseMap<const Value *, Value *> PtrIntCastPairs;
// Tries to find if the inttoptr instruction is derived from an pointer have
@@ -294,8 +293,10 @@ class InferAddressSpacesImpl {
public:
InferAddressSpacesImpl(AssumptionCache &AC, const DominatorTree *DT,
- const TargetTransformInfo *TTI, unsigned FlatAddrSpace)
- : AC(AC), DT(DT), TTI(TTI), FlatAddrSpace(FlatAddrSpace) {}
+ const TargetTransformInfo *TTI, unsigned FlatAddrSpace,
+ bool AssumeDefaultIsFlatAddressSpace)
+ : AC(AC), DT(DT), TTI(TTI), FlatAddrSpace(FlatAddrSpace),
+ AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
bool run(Function &F);
};
@@ -1676,7 +1677,7 @@ bool InferAddressSpaces::runOnFunction(Function &F) {
return InferAddressSpacesImpl(
getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F), DT,
&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
- FlatAddrSpace)
+ FlatAddrSpace, /*AssumeDefaultIsFlatAddressSpace=*/false)
.run(F);
}
@@ -1684,17 +1685,22 @@ FunctionPass *llvm::createInferAddressSpacesPass(unsigned AddressSpace) {
return new InferAddressSpaces(AddressSpace);
}
-InferAddressSpacesPass::InferAddressSpacesPass()
- : FlatAddrSpace(UninitializedAddressSpace) {}
-InferAddressSpacesPass::InferAddressSpacesPass(unsigned AddressSpace)
- : FlatAddrSpace(AddressSpace) {}
+InferAddressSpacesPass::InferAddressSpacesPass(
+ bool AssumeDefaultIsFlatAddressSpace)
+ : FlatAddrSpace(UninitializedAddressSpace),
+ AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
+InferAddressSpacesPass::InferAddressSpacesPass(
+ unsigned AddressSpace, bool AssumeDefaultIsFlatAddressSpace)
+ : FlatAddrSpace(AddressSpace),
+ AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
PreservedAnalyses InferAddressSpacesPass::run(Function &F,
FunctionAnalysisManager &AM) {
bool Changed =
InferAddressSpacesImpl(AM.getResult<AssumptionAnalysis>(F),
AM.getCachedResult<DominatorTreeAnalysis>(F),
- &AM.getResult<TargetIRAnalysis>(F), FlatAddrSpace)
+ &AM.getResult<TargetIRAnalysis>(F), FlatAddrSpace,
+ AssumeDefaultIsFlatAddressSpace)
.run(F);
if (Changed) {
PreservedAnalyses PA;
@@ -1703,3 +1709,11 @@ PreservedAnalyses InferAddressSpacesPass::run(Function &F,
}
return PreservedAnalyses::all();
}
+
+void InferAddressSpacesPass::printPipeline(
+ raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
+ static_cast<PassInfoMixin<InferAddressSpacesPass> *>(this)->printPipeline(
+ OS, MapClassName2PassName);
+ if (AssumeDefaultIsFlatAddressSpace)
+ OS << "<assume-default-is-flat-addrspace>";
+}
diff --git a/llvm/test/Other/new-pm-print-pipeline.ll b/llvm/test/Other/new-pm-print-pipeline.ll
index 2a1192b6b66bd..a8fcf113e49b2 100644
--- a/llvm/test/Other/new-pm-print-pipeline.ll
+++ b/llvm/test/Other/new-pm-print-pipeline.ll
@@ -123,3 +123,6 @@
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='drop-unnecessary-assumes,drop-unnecessary-assumes<drop-deref>' < %s | FileCheck %s --check-prefixes=CHECK-38
; CHECK-38: drop-unnecessary-assumes,drop-unnecessary-assumes<drop-deref>
+
+; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(infer-address-spaces,infer-address-spaces<assume-default-is-flat-addrspace>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-39
+; CHECK-39: function(infer-address-spaces,infer-address-spaces<assume-default-is-flat-addrspace>)
diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll
index a53dc1cf4a351..4844fa708a7ee 100644
--- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll
@@ -1,5 +1,5 @@
; RUN: opt -mtriple=amdgpu-amd-amdhsa -S -o - -passes=infer-address-spaces %s | FileCheck -check-prefixes=COMMON,AMDGCN %s
-; RUN: opt -S -o - -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck -check-prefixes=COMMON,NOTTI %s
+; RUN: opt -S -o - -passes='infer-address-spaces<assume-default-is-flat-addrspace>' %s | FileCheck -check-prefixes=COMMON,NOTTI %s
; COMMON-LABEL: @noop_ptrint_pair(
diff --git a/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll b/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
index fbdac1e07ca16..766c95bb3d0c5 100644
--- a/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
@@ -1,4 +1,4 @@
-; RUN: opt -mtriple=x86_64-unknown-unknown -S -o - -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s
+; RUN: opt -mtriple=x86_64-unknown-unknown -S -o - -passes='infer-address-spaces<assume-default-is-flat-addrspace>' %s | FileCheck %s
; Check that assert in X86TargetMachine::isNoopAddrSpaceCast is not triggered.
diff --git a/llvm/test/Transforms/InferAddressSpaces/fake-use.ll b/llvm/test/Transforms/InferAddressSpaces/fake-use.ll
index ad7f621dc40e8..8d9fcf48377b8 100644
--- a/llvm/test/Transforms/InferAddressSpaces/fake-use.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/fake-use.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s
+; RUN: opt -S -passes='infer-address-spaces<assume-default-is-flat-addrspace>' %s | FileCheck %s
declare void @llvm.fake.use(...)
diff --git a/llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll b/llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll
index 46af2bfd424e4..1219e37465d45 100644
--- a/llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
-; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s
+; RUN: opt -S -passes='infer-address-spaces<assume-default-is-flat-addrspace>' %s | FileCheck %s
define <4 x i32> @masked_gather_inferas(ptr addrspace(1) %out, <4 x i64> %index) {
; CHECK-LABEL: define <4 x i32> @masked_gather_inferas
diff --git a/llvm/test/Transforms/InferAddressSpaces/optnone-func-unchanged.ll b/llvm/test/Transforms/InferAddressSpaces/optnone-func-unchanged.ll
index b0213f7486928..a2110de9bcb72 100644
--- a/llvm/test/Transforms/InferAddressSpaces/optnone-func-unchanged.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/optnone-func-unchanged.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
-; RUN: opt -assume-default-is-flat-addrspace -S -passes=infer-address-spaces < %s 2>&1 | FileCheck %s
+; RUN: opt -S -passes='infer-address-spaces<assume-default-is-flat-addrspace>' < %s 2>&1 | FileCheck %s
@g = addrspace(1) global i32 0, align 4
diff --git a/llvm/test/Transforms/InferAddressSpaces/pass-param-parse-errors.ll b/llvm/test/Transforms/InferAddressSpaces/pass-param-parse-errors.ll
new file mode 100644
index 0000000000000..694c0744e46b6
--- /dev/null
+++ b/llvm/test/Transforms/InferAddressSpaces/pass-param-parse-errors.ll
@@ -0,0 +1,3 @@
+; RUN: not opt -passes='infer-address-spaces<unknown>' -disable-output %s 2>&1 | FileCheck -check-prefix=UNKNOWNERR %s
+
+; UNKNOWNERR: invalid InferAddressSpacesPass pass parameter '{{.*}}'
diff --git a/llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll b/llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll
index f489bbe323479..f543ae7811459 100644
--- a/llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
-; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s
+; RUN: opt -S -passes='infer-address-spaces<assume-default-is-flat-addrspace>' %s | FileCheck %s
define void @double_ascast(<4 x ptr addrspace(3)> %input) {
; CHECK-LABEL: define void @double_ascast
More information about the llvm-commits
mailing list