[llvm-branch-commits] [flang] [flang] Wire allocation-placement into the optimizer pipeline (default off) - memory passes unification [3/5] (PR #210745)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jul 20 08:52:13 PDT 2026
https://github.com/jeanPerier created https://github.com/llvm/llvm-project/pull/210745
Add a hidden -enable-allocation-placement flag that, when set, replaces the stack-arrays and memory-allocation-opt passes in the default FIR optimizer pipeline with the unified allocation-placement pass. The flag is off by default, so the legacy passes remain the default path and behavior is unchanged.
When enabled, the pass runs with its default byte-size thresholds; the -fstack-arrays strategy is forwarded through the new stackArrays option.
>From fe44e4902ff39e129b69d0704da1dfb93318d9ba Mon Sep 17 00:00:00 2001
From: root <jperier at nvidia.com>
Date: Mon, 20 Jul 2026 08:40:07 -0700
Subject: [PATCH] [flang] Wire allocation-placement into the optimizer pipeline
(experimental)
Add a hidden -enable-allocation-placement flag that, when set, replaces the
stack-arrays and memory-allocation-opt passes in the default FIR optimizer
pipeline with the unified allocation-placement pass. The flag is off by
default, so the legacy passes remain the default path and behavior is
unchanged.
When enabled, the pass runs with its default byte-size thresholds; the
-fstack-arrays strategy is forwarded through the new stackArrays option.
---
.../flang/Optimizer/Passes/CommandLineOpts.h | 4 ++++
.../flang/Optimizer/Passes/Pipelines.h | 2 ++
.../lib/Optimizer/Passes/CommandLineOpts.cpp | 3 +++
flang/lib/Optimizer/Passes/Pipelines.cpp | 12 ++++++++++-
.../Fir/allocation-placement-pipeline.fir | 21 +++++++++++++++++++
5 files changed, 41 insertions(+), 1 deletion(-)
create mode 100644 flang/test/Fir/allocation-placement-pipeline.fir
diff --git a/flang/include/flang/Optimizer/Passes/CommandLineOpts.h b/flang/include/flang/Optimizer/Passes/CommandLineOpts.h
index 882f02032a3b8..66087d8283641 100644
--- a/flang/include/flang/Optimizer/Passes/CommandLineOpts.h
+++ b/flang/include/flang/Optimizer/Passes/CommandLineOpts.h
@@ -58,6 +58,10 @@ extern llvm::cl::opt<bool> disableFirMao;
extern llvm::cl::opt<bool> enableFirLICM;
extern llvm::cl::opt<bool> useOldAliasTags;
+/// Experimental option to replace the stack-arrays and memory-allocation-opt
+/// passes with the unified allocation-placement pass.
+extern llvm::cl::opt<bool> enableAllocationPlacement;
+
/// CodeGen Passes
extern llvm::cl::opt<bool> disableCodeGenRewrite;
extern llvm::cl::opt<bool> disableTargetRewrite;
diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h
index 8d867612d405c..007cfe306e547 100644
--- a/flang/include/flang/Optimizer/Passes/Pipelines.h
+++ b/flang/include/flang/Optimizer/Passes/Pipelines.h
@@ -85,6 +85,8 @@ void addAVC(mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel);
void addMemoryAllocationOpt(mlir::PassManager &pm);
+void addAllocationPlacement(mlir::PassManager &pm, bool stackArrays);
+
void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare);
void addTargetRewritePass(mlir::PassManager &pm);
diff --git a/flang/lib/Optimizer/Passes/CommandLineOpts.cpp b/flang/lib/Optimizer/Passes/CommandLineOpts.cpp
index d461c1b9757b5..f61a88592cedb 100644
--- a/flang/lib/Optimizer/Passes/CommandLineOpts.cpp
+++ b/flang/lib/Optimizer/Passes/CommandLineOpts.cpp
@@ -62,6 +62,9 @@ cl::opt<bool> useOldAliasTags(
"the FIR alias tags pass"),
cl::init(false), cl::Hidden);
EnableOption(FirLICM, "fir-licm", "FIR loop invariant code motion");
+EnableOption(AllocationPlacement, "allocation-placement",
+ "unified array allocation placement (experimental; replaces "
+ "stack-arrays and memory-allocation-opt)");
/// CodeGen Passes
DisableOption(CodeGenRewrite, "codegen-rewrite", "rewrite FIR for codegen");
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 879a224824119..8f93f74fe99ab 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -80,6 +80,14 @@ void addMemoryAllocationOpt(mlir::PassManager &pm) {
});
}
+void addAllocationPlacement(mlir::PassManager &pm, bool stackArrays) {
+ // The experimental unified pass keeps its default byte-size thresholds; only
+ // the stack-arrays strategy is wired through for now.
+ fir::AllocationPlacementOptions options;
+ options.stackArrays = stackArrays;
+ pm.addPass(fir::createAllocationPlacement(options));
+}
+
void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare) {
fir::CodeGenRewriteOptions options;
options.preserveDeclare = preserveDeclare;
@@ -223,7 +231,9 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
pm.addPass(mlir::createCSEPass());
- if (pc.StackArrays)
+ if (enableAllocationPlacement)
+ fir::addAllocationPlacement(pm, pc.StackArrays);
+ else if (pc.StackArrays)
pm.addPass(fir::createStackArrays());
else
fir::addMemoryAllocationOpt(pm);
diff --git a/flang/test/Fir/allocation-placement-pipeline.fir b/flang/test/Fir/allocation-placement-pipeline.fir
new file mode 100644
index 0000000000000..e8aa904b2d40d
--- /dev/null
+++ b/flang/test/Fir/allocation-placement-pipeline.fir
@@ -0,0 +1,21 @@
+// Test that the experimental -enable-allocation-placement flag replaces the
+// legacy stack-arrays / memory-allocation-opt passes with the unified
+// allocation-placement pass in the default optimizer pipeline. By default the
+// legacy passes are still used.
+
+// RUN: tco -enable-allocation-placement %s --mlir-pass-statistics --mlir-pass-statistics-display=pipeline 2>&1 | FileCheck %s --check-prefix=NEW
+// RUN: tco %s --mlir-pass-statistics --mlir-pass-statistics-display=pipeline 2>&1 | FileCheck %s --check-prefix=OLD
+
+// REQUIRES: asserts
+
+// NEW-NOT: MemoryAllocationOpt
+// NEW: AllocationPlacement
+// NEW-NOT: MemoryAllocationOpt
+
+// OLD-NOT: AllocationPlacement
+// OLD: MemoryAllocationOpt
+// OLD-NOT: AllocationPlacement
+
+func.func @_QPfoo() {
+ return
+}
More information about the llvm-branch-commits
mailing list