[flang-commits] [flang] 69b69cb - [flang][tco] Add -emit-final-mlir flag (#146533)
via flang-commits
flang-commits at lists.llvm.org
Tue Jul 1 08:22:40 PDT 2025
Author: Kajetan Puchalski
Date: 2025-07-01T16:22:36+01:00
New Revision: 69b69cbcb451ce48df24e1972e925fde2dcba511
URL: https://github.com/llvm/llvm-project/commit/69b69cbcb451ce48df24e1972e925fde2dcba511
DIFF: https://github.com/llvm/llvm-project/commit/69b69cbcb451ce48df24e1972e925fde2dcba511.diff
LOG: [flang][tco] Add -emit-final-mlir flag (#146533)
Add a flag to tco for emitting the final MLIR, prior to lowering to LLVM
IR. This is intended to produce output that can be passed directly to
mlir-translate.
---------
Signed-off-by: Kajetan Puchalski <kajetan.puchalski at arm.com>
Added:
flang/test/Driver/tco-emit-final-mlir.fir
Modified:
flang/tools/tco/tco.cpp
Removed:
################################################################################
diff --git a/flang/test/Driver/tco-emit-final-mlir.fir b/flang/test/Driver/tco-emit-final-mlir.fir
new file mode 100644
index 0000000000000..75f8f153127af
--- /dev/null
+++ b/flang/test/Driver/tco-emit-final-mlir.fir
@@ -0,0 +1,19 @@
+// Test tco's -emit-final-mlir option.
+
+// RUN: tco -emit-final-mlir %s 2>&1 | FileCheck %s
+
+// Check that the FIR file is translated into the LLVM IR
+// MLIR dialect, but not into LLVM IR itself.
+
+// CHECK-NOT: func.func
+// CHECK-LABEL: llvm.func @_QPfoo()
+// CHECK-NOT: fir.alloca
+// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
+// CHECK: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x i32 : (i64) -> !llvm.ptr
+// CHECK: llvm.return
+// CHECK-NOT: func.func
+
+func.func @_QPfoo() {
+ %1 = fir.alloca i32
+ return
+}
diff --git a/flang/tools/tco/tco.cpp b/flang/tools/tco/tco.cpp
index eaf4bae088454..806cd3148d09f 100644
--- a/flang/tools/tco/tco.cpp
+++ b/flang/tools/tco/tco.cpp
@@ -70,6 +70,11 @@ static cl::opt<bool> codeGenLLVM(
cl::desc("Run only CodeGen passes and translate FIR to LLVM IR"),
cl::init(false));
+static cl::opt<bool> emitFinalMLIR(
+ "emit-final-mlir",
+ cl::desc("Only translate FIR to MLIR, do not lower to LLVM IR"),
+ cl::init(false));
+
#include "flang/Optimizer/Passes/CommandLineOpts.h"
#include "flang/Optimizer/Passes/Pipelines.h"
@@ -149,13 +154,15 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
fir::registerDefaultInlinerPass(config);
fir::createMLIRToLLVMPassPipeline(pm, config);
}
- fir::addLLVMDialectToLLVMPass(pm, out.os());
+ if (!emitFinalMLIR)
+ fir::addLLVMDialectToLLVMPass(pm, out.os());
}
// run the pass manager
if (mlir::succeeded(pm.run(*owningRef))) {
// passes ran successfully, so keep the output
- if ((emitFir || passPipeline.hasAnyOccurrences()) && !codeGenLLVM)
+ if ((emitFir || passPipeline.hasAnyOccurrences() || emitFinalMLIR) &&
+ !codeGenLLVM)
printModule(*owningRef, out.os());
out.keep();
return mlir::success();
More information about the flang-commits
mailing list