//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Similar to MLIR/LLVM's "opt" tools but also deals with analysis and custom // arguments. TODO: this is basically a copy from MlirOptMain.cpp, but capable // of module emission as specified by the user. // //===----------------------------------------------------------------------===// #include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h" #include "mlir/Dialect/DLTI/DLTI.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/IR/BuiltinDialect.h" #include "mlir/Pass/PassManager.h" #include "mlir/Pass/PassOptions.h" #include "mlir/Pass/PassRegistry.h" #include "mlir/Tools/mlir-opt/MlirOptMain.h" #include "mlir/Transforms/Passes.h" #include "clang/CIR/Dialect/IR/CIRDialect.h" #include "clang/CIR/Dialect/Passes.h" #include "clang/CIR/Passes.h" struct CIRToLLVMPipelineOptions : public mlir::PassPipelineOptions {}; int main(int argc, char **argv) { // TODO: register needed MLIR passes for CIR? mlir::DialectRegistry registry; registry.insert(); ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> { return mlir::createCIRCanonicalizePass(); }); ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> { return mlir::createCIRSimplifyPass(); }); mlir::PassPipelineRegistration pipeline( "cir-to-llvm", "", [](mlir::OpPassManager &pm, const CIRToLLVMPipelineOptions &options) { cir::direct::populateCIRToLLVMPasses(pm); }); ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> { return mlir::createCIRFlattenCFGPass(); }); ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> { return mlir::createHoistAllocasPass(); }); mlir::registerTransformsPasses(); return mlir::asMainReturnCode(MlirOptMain( argc, argv, "Clang IR analysis and optimization tool\n", registry)); }