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 000000000000..75f8f153127a --- /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 eaf4bae08845..806cd3148d09 100644 --- a/flang/tools/tco/tco.cpp +++ b/flang/tools/tco/tco.cpp @@ -70,6 +70,11 @@ static cl::opt codeGenLLVM( cl::desc("Run only CodeGen passes and translate FIR to LLVM IR"), cl::init(false)); +static cl::opt 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();