[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