[flang-commits] [flang] 3c90ae5 - Revert "[flang] Update tco tool pipline and add translation to LLVM IR"
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Fri Jan 21 11:34:33 PST 2022
Author: Valentin Clement
Date: 2022-01-21T20:34:17+01:00
New Revision: 3c90ae5d0b7137315e1c60734bc32b4356f987d4
URL: https://github.com/llvm/llvm-project/commit/3c90ae5d0b7137315e1c60734bc32b4356f987d4
DIFF: https://github.com/llvm/llvm-project/commit/3c90ae5d0b7137315e1c60734bc32b4356f987d4.diff
LOG: Revert "[flang] Update tco tool pipline and add translation to LLVM IR"
This reverts commit 68db0e25df4b1edaa2c6080eb88453ab01ea01d3.
Added:
Modified:
flang/include/flang/Optimizer/CodeGen/CodeGen.h
flang/include/flang/Optimizer/Support/InitFIR.h
flang/lib/Optimizer/CodeGen/CodeGen.cpp
flang/lib/Optimizer/Support/CMakeLists.txt
flang/tools/tco/CMakeLists.txt
flang/tools/tco/tco.cpp
Removed:
flang/include/flang/Tools/CLOptions.inc
flang/lib/Optimizer/Support/InitFIR.cpp
flang/test/Fir/basic-program.fir
################################################################################
diff --git a/flang/include/flang/Optimizer/CodeGen/CodeGen.h b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
index 939d6aebb524d..1bd31b207859a 100644
--- a/flang/include/flang/Optimizer/CodeGen/CodeGen.h
+++ b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
@@ -12,8 +12,6 @@
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassRegistry.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Support/raw_ostream.h"
#include <memory>
namespace fir {
@@ -38,13 +36,9 @@ std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createFirTargetRewritePass(
/// Convert FIR to the LLVM IR dialect
std::unique_ptr<mlir::Pass> createFIRToLLVMPass();
-using LLVMIRLoweringPrinter =
- std::function<void(llvm::Module &, llvm::raw_ostream &)>;
/// Convert the LLVM IR dialect to LLVM-IR proper
-std::unique_ptr<mlir::Pass> createLLVMDialectToLLVMPass(
- llvm::raw_ostream &output,
- LLVMIRLoweringPrinter printer =
- [](llvm::Module &m, llvm::raw_ostream &out) { m.print(out, nullptr); });
+std::unique_ptr<mlir::Pass>
+createLLVMDialectToLLVMPass(llvm::raw_ostream &output);
// declarative passes
#define GEN_PASS_REGISTRATION
diff --git a/flang/include/flang/Optimizer/Support/InitFIR.h b/flang/include/flang/Optimizer/Support/InitFIR.h
index 2e8c1685a06f7..e78967de2a383 100644
--- a/flang/include/flang/Optimizer/Support/InitFIR.h
+++ b/flang/include/flang/Optimizer/Support/InitFIR.h
@@ -13,6 +13,7 @@
#ifndef FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
#define FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
+#include "flang/Optimizer/CodeGen/CodeGen.h"
#include "flang/Optimizer/Dialect/FIRDialect.h"
#include "mlir/Conversion/Passes.h"
#include "mlir/Dialect/Affine/Passes.h"
@@ -34,19 +35,11 @@ namespace fir::support {
#define FLANG_DIALECT_LIST \
FLANG_NONCODEGEN_DIALECT_LIST, FIRCodeGenDialect, mlir::LLVM::LLVMDialect
-inline void registerNonCodegenDialects(mlir::DialectRegistry ®istry) {
- registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
-}
-
/// Register all the dialects used by flang.
inline void registerDialects(mlir::DialectRegistry ®istry) {
registry.insert<FLANG_DIALECT_LIST>();
}
-inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
- context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
-}
-
/// Forced load of all the dialects used by flang. Lowering is not an MLIR
/// pass, but a producer of FIR and MLIR. It is therefore a requirement that the
/// dialects be preloaded to be able to build the IR.
@@ -82,9 +75,6 @@ inline void registerMLIRPassesForFortranTools() {
mlir::registerConvertAffineToStandardPass();
}
-/// Register the interfaces needed to lower to LLVM IR.
-void registerLLVMTranslation(mlir::MLIRContext &context);
-
} // namespace fir::support
#endif // FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H
diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc
deleted file mode 100644
index 1c85075d5cc17..0000000000000
--- a/flang/include/flang/Tools/CLOptions.inc
+++ /dev/null
@@ -1,160 +0,0 @@
-//===-- CLOptions.inc -- command line options -------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-/// This file defines some shared command-line options that can be used when
-/// debugging the test tools. This file must be included into the tool.
-
-#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
-#include "mlir/Pass/PassManager.h"
-#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
-#include "mlir/Transforms/Passes.h"
-#include "flang/Optimizer/CodeGen/CodeGen.h"
-#include "flang/Optimizer/Transforms/Passes.h"
-#include "llvm/Support/CommandLine.h"
-
-#define DisableOption(DOName, DOOption, DODescription) \
- static llvm::cl::opt<bool> disable##DOName("disable-" DOOption, \
- llvm::cl::desc("disable " DODescription " pass"), llvm::cl::init(false), \
- llvm::cl::Hidden)
-
-/// Shared option in tools to control whether dynamically sized array
-/// allocations should always be on the heap.
-static llvm::cl::opt<bool> dynamicArrayStackToHeapAllocation(
- "fdynamic-heap-array",
- llvm::cl::desc("place all array allocations of dynamic size on the heap"),
- llvm::cl::init(false), llvm::cl::Hidden);
-
-/// Shared option in tools to set a maximum value for the number of elements in
-/// a compile-time sized array that can be allocated on the stack.
-static llvm::cl::opt<std::size_t> arrayStackAllocationThreshold(
- "fstack-array-size",
- llvm::cl::desc(
- "place all array allocations more than <size> elements on the heap"),
- llvm::cl::init(~static_cast<std::size_t>(0)), llvm::cl::Hidden);
-
-namespace {
-/// Optimizer Passes
-DisableOption(CfgConversion, "cfg-conversion", "disable FIR to CFG pass");
-DisableOption(FirAvc, "avc", "array value copy analysis and transformation");
-DisableOption(
- FirMao, "memory-allocation-opt", "memory allocation optimization");
-
-/// CodeGen Passes
-#if !defined(FLANG_EXCLUDE_CODEGEN)
-DisableOption(CodeGenRewrite, "codegen-rewrite", "rewrite FIR for codegen");
-DisableOption(TargetRewrite, "target-rewrite", "rewrite FIR for target");
-DisableOption(FirToLlvmIr, "fir-to-llvmir", "FIR to LLVM-IR dialect");
-DisableOption(LlvmIrToLlvm, "llvm", "conversion to LLVM");
-#endif
-
-/// Generic for adding a pass to the pass manager if it is not disabled.
-template <typename F>
-void addPassConditionally(
- mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor) {
- if (!disabled)
- pm.addPass(ctor());
-}
-
-template <typename OP, typename F>
-void addNestedPassConditionally(
- mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor) {
- if (!disabled)
- pm.addNestedPass<OP>(ctor());
-}
-
-} // namespace
-
-namespace fir {
-
-static void defaultFlangInlinerOptPipeline(mlir::OpPassManager &pm) {
- mlir::GreedyRewriteConfig config;
- config.enableRegionSimplification = false;
- pm.addPass(mlir::createCanonicalizerPass(config));
-}
-
-inline void addCfgConversionPass(mlir::PassManager &pm) {
- addNestedPassConditionally<mlir::FuncOp>(
- pm, disableCfgConversion, fir::createFirToCfgPass);
-}
-
-inline void addAVC(mlir::PassManager &pm) {
- addNestedPassConditionally<mlir::FuncOp>(
- pm, disableFirAvc, fir::createArrayValueCopyPass);
-}
-
-#if !defined(FLANG_EXCLUDE_CODEGEN)
-inline void addCodeGenRewritePass(mlir::PassManager &pm) {
- addPassConditionally(
- pm, disableCodeGenRewrite, fir::createFirCodeGenRewritePass);
-}
-
-inline void addTargetRewritePass(mlir::PassManager &pm) {
- addPassConditionally(pm, disableTargetRewrite, []() {
- return fir::createFirTargetRewritePass(fir::TargetRewriteOptions{});
- });
-}
-
-inline void addFIRToLLVMPass(mlir::PassManager &pm) {
- addPassConditionally(pm, disableFirToLlvmIr, fir::createFIRToLLVMPass);
-}
-
-inline void addLLVMDialectToLLVMPass(
- mlir::PassManager &pm, llvm::raw_ostream &output) {
- addPassConditionally(pm, disableLlvmIrToLlvm,
- [&]() { return fir::createLLVMDialectToLLVMPass(output); });
-}
-#endif
-
-/// Create a pass pipeline for running default optimization passes for
-/// incremental conversion of FIR.
-///
-/// \param pm - MLIR pass manager that will hold the pipeline definition
-inline void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm) {
- // simplify the IR
- mlir::GreedyRewriteConfig config;
- config.enableRegionSimplification = false;
- fir::addAVC(pm);
- pm.addNestedPass<mlir::FuncOp>(fir::createCharacterConversionPass());
- pm.addPass(mlir::createCanonicalizerPass(config));
-
- // The default inliner pass adds the canonicalizer pass with the default
- // configuration. Create the inliner pass with tco config.
- llvm::StringMap<mlir::OpPassManager> pipelines;
- pm.addPass(
- mlir::createInlinerPass(pipelines, defaultFlangInlinerOptPipeline));
- pm.addPass(mlir::createCSEPass());
-
- // convert control flow to CFG form
- fir::addCfgConversionPass(pm);
- pm.addPass(mlir::createLowerToCFGPass());
-
- pm.addPass(mlir::createCanonicalizerPass(config));
-}
-
-#if !defined(FLANG_EXCLUDE_CODEGEN)
-inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm) {
- pm.addNestedPass<mlir::FuncOp>(fir::createAbstractResultOptPass());
- fir::addCodeGenRewritePass(pm);
- fir::addTargetRewritePass(pm);
- fir::addFIRToLLVMPass(pm);
-}
-
-/// Create a pass pipeline for lowering from MLIR to LLVM IR
-///
-/// \param pm - MLIR pass manager that will hold the pipeline definition
-inline void createMLIRToLLVMPassPipeline(mlir::PassManager &pm) {
- // Add default optimizer pass pipeline.
- fir::createDefaultFIROptimizerPassPipeline(pm);
-
- // Add codegen pass pipeline.
- fir::createDefaultFIRCodeGenPassPipeline(pm);
-}
-#undef FLANG_EXCLUDE_CODEGEN
-#endif
-
-} // namespace fir
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 40d6d2017b2fa..be2e7cde916df 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -23,7 +23,6 @@
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Matchers.h"
#include "mlir/Pass/Pass.h"
-#include "mlir/Target/LLVMIR/ModuleTranslation.h"
#include "llvm/ADT/ArrayRef.h"
#define DEBUG_TYPE "flang-codegen"
@@ -3306,44 +3305,8 @@ class FIRToLLVMLowering : public fir::FIRToLLVMLoweringBase<FIRToLLVMLowering> {
}
}
};
-
-/// Lower from LLVM IR dialect to proper LLVM-IR and dump the module
-struct LLVMIRLoweringPass
- : public mlir::PassWrapper<LLVMIRLoweringPass,
- mlir::OperationPass<mlir::ModuleOp>> {
- using Printer = fir::LLVMIRLoweringPrinter;
- LLVMIRLoweringPass(raw_ostream &output, Printer p)
- : output{output}, printer{p} {}
-
- mlir::ModuleOp getModule() { return getOperation(); }
-
- void runOnOperation() override final {
- auto *ctx = getModule().getContext();
- auto optName = getModule().getName();
- llvm::LLVMContext llvmCtx;
- if (auto llvmModule = mlir::translateModuleToLLVMIR(
- getModule(), llvmCtx, optName ? *optName : "FIRModule")) {
- printer(*llvmModule, output);
- return;
- }
-
- mlir::emitError(mlir::UnknownLoc::get(ctx), "could not emit LLVM-IR\n");
- signalPassFailure();
- }
-
-private:
- raw_ostream &output;
- Printer printer;
-};
-
} // namespace
std::unique_ptr<mlir::Pass> fir::createFIRToLLVMPass() {
return std::make_unique<FIRToLLVMLowering>();
}
-
-std::unique_ptr<mlir::Pass>
-fir::createLLVMDialectToLLVMPass(raw_ostream &output,
- fir::LLVMIRLoweringPrinter printer) {
- return std::make_unique<LLVMIRLoweringPass>(output, printer);
-}
diff --git a/flang/lib/Optimizer/Support/CMakeLists.txt b/flang/lib/Optimizer/Support/CMakeLists.txt
index 779e20711513e..30a163de9ccaf 100644
--- a/flang/lib/Optimizer/Support/CMakeLists.txt
+++ b/flang/lib/Optimizer/Support/CMakeLists.txt
@@ -2,7 +2,6 @@ get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
add_flang_library(FIRSupport
FIRContext.cpp
- InitFIR.cpp
InternalNames.cpp
KindMapping.cpp
diff --git a/flang/lib/Optimizer/Support/InitFIR.cpp b/flang/lib/Optimizer/Support/InitFIR.cpp
deleted file mode 100644
index baa1336d9ca02..0000000000000
--- a/flang/lib/Optimizer/Support/InitFIR.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//===-- Optimizer/Support/InitFIR.cpp -------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "flang/Optimizer/Support/InitFIR.h"
-#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
-#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
-
-void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
- mlir::DialectRegistry registry;
- // Register OpenMP dialect interface here as well.
- mlir::registerOpenMPDialectTranslation(registry);
- // Register LLVM-IR dialect interface.
- registerLLVMDialectTranslation(registry);
- context.appendDialectRegistry(registry);
-}
diff --git a/flang/test/Fir/basic-program.fir b/flang/test/Fir/basic-program.fir
deleted file mode 100644
index b417a6148d39b..0000000000000
--- a/flang/test/Fir/basic-program.fir
+++ /dev/null
@@ -1,12 +0,0 @@
-// RUN: tco %s | FileCheck %s
-// REQUIRES: shell
-
-// Check that tco is working with a basic test.
-
-func @_QQmain() {
- return
-}
-
-// CHECK: ; ModuleID = 'FIRModule'
-// CHECK-LABEL: define void @_QQmain()
-// CHECK: ret void
diff --git a/flang/tools/tco/CMakeLists.txt b/flang/tools/tco/CMakeLists.txt
index a64b9c59bd02a..1a9c5ac72f153 100644
--- a/flang/tools/tco/CMakeLists.txt
+++ b/flang/tools/tco/CMakeLists.txt
@@ -1,25 +1,13 @@
-set(LLVM_LINK_COMPONENTS
- AllTargetsAsmParsers
- AllTargetsCodeGens
- AllTargetsDescs
- AllTargetsInfos
-)
-llvm_map_components_to_libnames(llvm_libs ${LLVM_LINK_COMPONENTS})
-
-add_flang_tool(tco tco.cpp)
-llvm_update_compile_flags(tco)
get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
-target_link_libraries(tco PRIVATE
+
+set(LIBS
FIRCodeGen
FIRDialect
FIRSupport
FIRTransforms
- FIRBuilder
${dialect_libs}
MLIRIR
MLIRLLVMIR
- MLIRLLVMToLLVMIRTranslation
- MLIRTargetLLVMIRExport
MLIRPass
MLIRStandardToLLVM
MLIRTransforms
@@ -30,5 +18,7 @@ target_link_libraries(tco PRIVATE
MLIRStandardToLLVM
MLIRSupport
MLIRVectorToLLVM
- ${llvm_libs}
)
+
+add_flang_tool(tco tco.cpp)
+target_link_libraries(tco PRIVATE ${LIBS})
diff --git a/flang/tools/tco/tco.cpp b/flang/tools/tco/tco.cpp
index 2bb3b27e7eb63..8f2c283bc82f9 100644
--- a/flang/tools/tco/tco.cpp
+++ b/flang/tools/tco/tco.cpp
@@ -11,14 +11,8 @@
//
//===----------------------------------------------------------------------===//
-#include "flang/Optimizer/CodeGen/CodeGen.h"
-#include "flang/Optimizer/Support/FIRContext.h"
#include "flang/Optimizer/Support/InitFIR.h"
-#include "flang/Optimizer/Support/InternalNames.h"
#include "flang/Optimizer/Support/KindMapping.h"
-#include "flang/Optimizer/Transforms/Passes.h"
-#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
-#include "mlir/IR/AsmState.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/Parser.h"
@@ -31,13 +25,11 @@
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
-#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
-/// list of program return codes
static cl::opt<std::string>
inputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
@@ -50,14 +42,8 @@ static cl::opt<bool> emitFir("emit-fir",
cl::desc("Parse and pretty-print the input"),
cl::init(false));
-static cl::opt<std::string> targetTriple("target",
- cl::desc("specify a target triple"),
- cl::init("native"));
-
-#include "flang/Tools/CLOptions.inc"
-
static void printModuleBody(mlir::ModuleOp mod, raw_ostream &output) {
- for (auto &op : *mod.getBody())
+ for (auto &op : mod.getBody()->without_terminator())
output << op << '\n';
}
@@ -79,8 +65,6 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
mlir::DialectRegistry registry;
fir::support::registerDialects(registry);
mlir::MLIRContext context(registry);
- fir::support::loadDialects(context);
- fir::support::registerLLVMTranslation(context);
auto owningRef = mlir::parseSourceFile(sourceMgr, &context);
if (!owningRef) {
@@ -96,31 +80,21 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
ToolOutputFile out(outputFilename, ec, sys::fs::OF_None);
// run passes
- fir::KindMapping kindMap{&context};
- fir::setTargetTriple(*owningRef, targetTriple);
- fir::setKindMapping(*owningRef, kindMap);
- mlir::PassManager pm(&context, mlir::OpPassManager::Nesting::Implicit);
- pm.enableVerifier(/*verifyPasses=*/true);
+ mlir::PassManager pm{&context};
mlir::applyPassManagerCLOptions(pm);
if (emitFir) {
// parse the input and pretty-print it back out
// -emit-fir intentionally disables all the passes
- } else if (passPipeline.hasAnyOccurrences()) {
- auto errorHandler = [&](const Twine &msg) {
- mlir::emitError(mlir::UnknownLoc::get(pm.getContext())) << msg;
- return mlir::failure();
- };
- if (mlir::failed(passPipeline.addToPipeline(pm, errorHandler)))
- return mlir::failure();
} else {
- fir::createMLIRToLLVMPassPipeline(pm);
- fir::addLLVMDialectToLLVMPass(pm, out.os());
+ // TODO: Actually add passes when added to FIR code base
+ // add all the passes
+ // the user can disable them individually
}
// run the pass manager
if (mlir::succeeded(pm.run(*owningRef))) {
// passes ran successfully, so keep the output
- if (emitFir || passPipeline.hasAnyOccurrences())
+ if (emitFir)
printModuleBody(*owningRef, out.os());
out.keep();
return mlir::success();
@@ -133,13 +107,8 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
}
int main(int argc, char **argv) {
- [[maybe_unused]] InitLLVM y(argc, argv);
fir::support::registerMLIRPassesForFortranTools();
- fir::registerOptCodeGenPasses();
- fir::registerOptTransformPasses();
- InitializeAllTargets();
- mlir::registerAsmPrinterCLOptions();
- mlir::registerMLIRContextCLOptions();
+ [[maybe_unused]] InitLLVM y(argc, argv);
mlir::registerPassManagerCLOptions();
mlir::PassPipelineCLParser passPipe("", "Compiler passes to run");
cl::ParseCommandLineOptions(argc, argv, "Tilikum Crossing Optimizer\n");
More information about the flang-commits
mailing list