[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