[flang-commits] [flang] [flang] Add getFIRToLLVMPassOptions helper function (PR #179293)
Delaram Talaashrafi via flang-commits
flang-commits at lists.llvm.org
Wed Feb 4 06:48:24 PST 2026
https://github.com/delaram-talaashrafi updated https://github.com/llvm/llvm-project/pull/179293
>From 513f33650bc8417e55baea5c23f794ea5d003adb Mon Sep 17 00:00:00 2001
From: Delaram Talaashrafi <dtalaashrafi at rome5.pgi.net>
Date: Mon, 2 Feb 2026 09:18:35 -0800
Subject: [PATCH 1/2] [flang] Add FIRToLLVMPassOptions constructor from
MLIRToLLVMPassPipelineConfig
Add a constructor to `FIRToLLVMPassOptions` that initializes the options from `MLIRToLLVMPassPipelineConfig`.
This allows callers to directly construct `FIRToLLVMPassOptions` from the pipeline config without manually
setting each field, improving code reusability and reducing duplication.
---
flang/include/flang/Optimizer/CodeGen/CodeGen.h | 7 +++++++
flang/lib/Optimizer/CodeGen/CodeGen.cpp | 12 ++++++++++++
flang/lib/Optimizer/Passes/Pipelines.cpp | 9 +--------
3 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/flang/include/flang/Optimizer/CodeGen/CodeGen.h b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
index e9a07a8dde5cd..475a9d84183e5 100644
--- a/flang/include/flang/Optimizer/CodeGen/CodeGen.h
+++ b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
@@ -17,6 +17,8 @@
#include "llvm/Support/raw_ostream.h"
#include <memory>
+struct MLIRToLLVMPassPipelineConfig;
+
namespace fir {
class LLVMTypeConverter;
@@ -64,6 +66,11 @@ struct FIRToLLVMPassOptions {
// Conversion pass of the MLIR complex dialect.
Fortran::frontend::CodeGenOptions::ComplexRangeKind ComplexRange =
Fortran::frontend::CodeGenOptions::ComplexRangeKind::CX_Full;
+
+ // Default constructor.
+ FIRToLLVMPassOptions() = default;
+
+ FIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
};
/// Convert FIR to the LLVM IR dialect with default options.
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 625701725003f..985220be5a06c 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -22,6 +22,7 @@
#include "flang/Optimizer/Dialect/FIRDialect.h"
#include "flang/Optimizer/Dialect/FIROps.h"
#include "flang/Optimizer/Dialect/FIRType.h"
+#include "flang/Optimizer/Passes/CommandLineOpts.h"
#include "flang/Optimizer/Support/DataLayout.h"
#include "flang/Optimizer/Support/InternalNames.h"
#include "flang/Optimizer/Support/TypeCode.h"
@@ -31,6 +32,7 @@
#include "flang/Runtime/allocator-registry-consts.h"
#include "flang/Runtime/descriptor-consts.h"
#include "flang/Semantics/runtime-type-info.h"
+#include "flang/Tools/CrossToolHelpers.h"
#include "mlir/Conversion/ArithCommon/AttrToLLVMConverter.h"
#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
#include "mlir/Conversion/ComplexToLLVM/ComplexToLLVM.h"
@@ -4492,6 +4494,16 @@ struct LLVMIRLoweringPass
} // namespace
+fir::FIRToLLVMPassOptions::FIRToLLVMPassOptions(
+ const MLIRToLLVMPassPipelineConfig &config) {
+ ignoreMissingTypeDescriptors = ::ignoreMissingTypeDescriptors;
+ skipExternalRttiDefinition = ::skipExternalRttiDefinition;
+ applyTBAA = config.AliasAnalysis;
+ forceUnifiedTBAATree = useOldAliasTags;
+ typeDescriptorsRenamedForAssembly = !disableCompilerGeneratedNamesConversion;
+ ComplexRange = config.ComplexRange;
+}
+
std::unique_ptr<mlir::Pass> fir::createFIRToLLVMPass() {
return std::make_unique<FIRToLLVMLowering>();
}
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 6054675643c64..deea16f6caa42 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -110,14 +110,7 @@ void addDebugInfoPass(mlir::PassManager &pm,
void addFIRToLLVMPass(mlir::PassManager &pm,
const MLIRToLLVMPassPipelineConfig &config) {
- fir::FIRToLLVMPassOptions options;
- options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors;
- options.skipExternalRttiDefinition = skipExternalRttiDefinition;
- options.applyTBAA = config.AliasAnalysis;
- options.forceUnifiedTBAATree = useOldAliasTags;
- options.typeDescriptorsRenamedForAssembly =
- !disableCompilerGeneratedNamesConversion;
- options.ComplexRange = config.ComplexRange;
+ fir::FIRToLLVMPassOptions options(config);
addPassConditionally(pm, disableFirToLlvmIr,
[&]() { return fir::createFIRToLLVMPass(options); });
// The dialect conversion framework may leave dead unrealized_conversion_cast
>From 139c6f6d6d67e202cbe1924a304fa9ad4593b8c4 Mon Sep 17 00:00:00 2001
From: Delaram Talaashrafi <dtalaashrafi at rome5.pgi.net>
Date: Mon, 2 Feb 2026 11:34:07 -0800
Subject: [PATCH 2/2] Add helper function
---
flang/include/flang/Optimizer/CodeGen/CodeGen.h | 7 -------
flang/include/flang/Optimizer/Passes/Pipelines.h | 4 ++++
flang/lib/Optimizer/CodeGen/CodeGen.cpp | 12 ------------
flang/lib/Optimizer/Passes/Pipelines.cpp | 15 ++++++++++++++-
4 files changed, 18 insertions(+), 20 deletions(-)
diff --git a/flang/include/flang/Optimizer/CodeGen/CodeGen.h b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
index 475a9d84183e5..e9a07a8dde5cd 100644
--- a/flang/include/flang/Optimizer/CodeGen/CodeGen.h
+++ b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
@@ -17,8 +17,6 @@
#include "llvm/Support/raw_ostream.h"
#include <memory>
-struct MLIRToLLVMPassPipelineConfig;
-
namespace fir {
class LLVMTypeConverter;
@@ -66,11 +64,6 @@ struct FIRToLLVMPassOptions {
// Conversion pass of the MLIR complex dialect.
Fortran::frontend::CodeGenOptions::ComplexRangeKind ComplexRange =
Fortran::frontend::CodeGenOptions::ComplexRangeKind::CX_Full;
-
- // Default constructor.
- FIRToLLVMPassOptions() = default;
-
- FIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
};
/// Convert FIR to the LLVM IR dialect with default options.
diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h
index 70b9341347244..1a7ff4ff3dfa2 100644
--- a/flang/include/flang/Optimizer/Passes/Pipelines.h
+++ b/flang/include/flang/Optimizer/Passes/Pipelines.h
@@ -105,6 +105,10 @@ void addDebugInfoPass(mlir::PassManager &pm,
llvm::OptimizationLevel optLevel,
llvm::StringRef inputFilename, int32_t dwarfVersion);
+/// Create FIRToLLVMPassOptions from pipeline configuration.
+FIRToLLVMPassOptions
+getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config);
+
void addFIRToLLVMPass(mlir::PassManager &pm,
const MLIRToLLVMPassPipelineConfig &config);
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 985220be5a06c..625701725003f 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -22,7 +22,6 @@
#include "flang/Optimizer/Dialect/FIRDialect.h"
#include "flang/Optimizer/Dialect/FIROps.h"
#include "flang/Optimizer/Dialect/FIRType.h"
-#include "flang/Optimizer/Passes/CommandLineOpts.h"
#include "flang/Optimizer/Support/DataLayout.h"
#include "flang/Optimizer/Support/InternalNames.h"
#include "flang/Optimizer/Support/TypeCode.h"
@@ -32,7 +31,6 @@
#include "flang/Runtime/allocator-registry-consts.h"
#include "flang/Runtime/descriptor-consts.h"
#include "flang/Semantics/runtime-type-info.h"
-#include "flang/Tools/CrossToolHelpers.h"
#include "mlir/Conversion/ArithCommon/AttrToLLVMConverter.h"
#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
#include "mlir/Conversion/ComplexToLLVM/ComplexToLLVM.h"
@@ -4494,16 +4492,6 @@ struct LLVMIRLoweringPass
} // namespace
-fir::FIRToLLVMPassOptions::FIRToLLVMPassOptions(
- const MLIRToLLVMPassPipelineConfig &config) {
- ignoreMissingTypeDescriptors = ::ignoreMissingTypeDescriptors;
- skipExternalRttiDefinition = ::skipExternalRttiDefinition;
- applyTBAA = config.AliasAnalysis;
- forceUnifiedTBAATree = useOldAliasTags;
- typeDescriptorsRenamedForAssembly = !disableCompilerGeneratedNamesConversion;
- ComplexRange = config.ComplexRange;
-}
-
std::unique_ptr<mlir::Pass> fir::createFIRToLLVMPass() {
return std::make_unique<FIRToLLVMLowering>();
}
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index deea16f6caa42..6812347a8d39b 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -108,9 +108,22 @@ void addDebugInfoPass(mlir::PassManager &pm,
[&]() { return fir::createAddDebugInfoPass(options); });
}
+fir::FIRToLLVMPassOptions
+getFIRToLLVMPassOptions(const MLIRToLLVMPassPipelineConfig &config) {
+ fir::FIRToLLVMPassOptions options;
+ options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors;
+ options.skipExternalRttiDefinition = skipExternalRttiDefinition;
+ options.applyTBAA = config.AliasAnalysis;
+ options.forceUnifiedTBAATree = useOldAliasTags;
+ options.typeDescriptorsRenamedForAssembly =
+ !disableCompilerGeneratedNamesConversion;
+ options.ComplexRange = config.ComplexRange;
+ return options;
+}
+
void addFIRToLLVMPass(mlir::PassManager &pm,
const MLIRToLLVMPassPipelineConfig &config) {
- fir::FIRToLLVMPassOptions options(config);
+ fir::FIRToLLVMPassOptions options = getFIRToLLVMPassOptions(config);
addPassConditionally(pm, disableFirToLlvmIr,
[&]() { return fir::createFIRToLLVMPass(options); });
// The dialect conversion framework may leave dead unrealized_conversion_cast
More information about the flang-commits
mailing list