13#ifndef FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H 
   14#define FORTRAN_OPTIMIZER_SUPPORT_INITFIR_H 
   16#include "flang/Optimizer/Dialect/CUF/CUFDialect.h" 
   17#include "flang/Optimizer/Dialect/CUF/CUFToLLVMIRTranslation.h" 
   18#include "flang/Optimizer/Dialect/FIRDialect.h" 
   19#include "flang/Optimizer/Dialect/MIF/MIFDialect.h" 
   20#include "flang/Optimizer/HLFIR/HLFIRDialect.h" 
   21#include "flang/Optimizer/OpenACC/Support/RegisterOpenACCExtensions.h" 
   22#include "flang/Optimizer/OpenMP/Support/RegisterOpenMPExtensions.h" 
   23#include "mlir/Conversion/Passes.h" 
   24#include "mlir/Dialect/Affine/IR/AffineOps.h" 
   25#include "mlir/Dialect/Affine/Passes.h" 
   26#include "mlir/Dialect/Complex/IR/Complex.h" 
   27#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h" 
   28#include "mlir/Dialect/DLTI/DLTI.h" 
   29#include "mlir/Dialect/Func/Extensions/InlinerExtension.h" 
   30#include "mlir/Dialect/Func/IR/FuncOps.h" 
   31#include "mlir/Dialect/Index/IR/IndexDialect.h" 
   32#include "mlir/Dialect/LLVMIR/NVVMDialect.h" 
   33#include "mlir/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.h" 
   34#include "mlir/Dialect/Math/IR/Math.h" 
   35#include "mlir/Dialect/OpenACC/OpenACC.h" 
   36#include "mlir/Dialect/OpenACC/Transforms/Passes.h" 
   37#include "mlir/Dialect/SCF/IR/SCF.h" 
   38#include "mlir/Dialect/SCF/Transforms/Passes.h" 
   39#include "mlir/InitAllDialects.h" 
   40#include "mlir/Pass/Pass.h" 
   41#include "mlir/Pass/PassRegistry.h" 
   42#include "mlir/Transforms/LocationSnapshot.h" 
   43#include "mlir/Transforms/Passes.h" 
   45namespace fir::support {
 
   47#define FLANG_NONCODEGEN_DIALECT_LIST                                          \ 
   48  mlir::affine::AffineDialect, FIROpsDialect, hlfir::hlfirDialect,             \ 
   49      mlir::acc::OpenACCDialect, mlir::omp::OpenMPDialect,                     \ 
   50      mlir::scf::SCFDialect, mlir::arith::ArithDialect,                        \ 
   51      mlir::cf::ControlFlowDialect, mlir::func::FuncDialect,                   \ 
   52      mlir::vector::VectorDialect, mlir::math::MathDialect,                    \ 
   53      mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect,       \ 
   54      mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect,                          \ 
   55      mlir::index::IndexDialect, mif::MIFDialect 
   57#define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect 
   60#define FLANG_DIALECT_LIST                                                     \ 
   61  FLANG_NONCODEGEN_DIALECT_LIST, FLANG_CODEGEN_DIALECT_LIST 
   63inline void registerNonCodegenDialects(mlir::DialectRegistry ®istry) {
 
   64  registry.insert<FLANG_NONCODEGEN_DIALECT_LIST>();
 
   65  mlir::func::registerInlinerExtension(registry);
 
   66  mlir::LLVM::registerInlinerInterface(registry);
 
   70inline void registerDialects(mlir::DialectRegistry ®istry) {
 
   71  registerNonCodegenDialects(registry);
 
   72  registry.insert<FLANG_CODEGEN_DIALECT_LIST>();
 
   76inline void addFIRExtensions(mlir::DialectRegistry ®istry,
 
   77                             bool addFIRInlinerInterface = 
true) {
 
   78  if (addFIRInlinerInterface)
 
   79    addFIRInlinerExtension(registry);
 
   80  addFIRToLLVMIRExtension(registry);
 
   82  fir::acc::registerOpenACCExtensions(registry);
 
   83  fir::omp::registerOpenMPExtensions(registry);
 
   86inline void loadNonCodegenDialects(mlir::MLIRContext &context) {
 
   87  mlir::DialectRegistry registry;
 
   88  registerNonCodegenDialects(registry);
 
   89  context.appendDialectRegistry(registry);
 
   91  context.loadDialect<FLANG_NONCODEGEN_DIALECT_LIST>();
 
   97inline void loadDialects(mlir::MLIRContext &context) {
 
   98  mlir::DialectRegistry registry;
 
   99  registerDialects(registry);
 
  100  context.appendDialectRegistry(registry);
 
  102  context.loadDialect<FLANG_DIALECT_LIST>();
 
  107inline void registerMLIRPassesForFortranTools() {
 
  108  mlir::acc::registerOpenACCPasses();
 
  109  mlir::registerCanonicalizerPass();
 
  110  mlir::registerCSEPass();
 
  111  mlir::affine::registerAffineLoopFusionPass();
 
  112  mlir::registerLoopInvariantCodeMotionPass();
 
  113  mlir::affine::registerLoopCoalescingPass();
 
  114  mlir::registerStripDebugInfoPass();
 
  115  mlir::registerPrintOpStatsPass();
 
  116  mlir::registerInlinerPass();
 
  117  mlir::registerSCCPPass();
 
  118  mlir::registerSCFPasses();
 
  119  mlir::affine::registerAffineScalarReplacementPass();
 
  120  mlir::registerSymbolDCEPass();
 
  121  mlir::registerLocationSnapshotPass();
 
  122  mlir::affine::registerAffinePipelineDataTransferPass();
 
  124  mlir::affine::registerAffineVectorizePass();
 
  125  mlir::affine::registerAffineLoopUnrollPass();
 
  126  mlir::affine::registerAffineLoopUnrollAndJamPass();
 
  127  mlir::affine::registerSimplifyAffineStructuresPass();
 
  128  mlir::affine::registerAffineLoopInvariantCodeMotionPass();
 
  129  mlir::affine::registerAffineLoopTilingPass();
 
  130  mlir::affine::registerAffineDataCopyGenerationPass();
 
  132  mlir::registerLowerAffinePass();
 
  136void registerLLVMTranslation(mlir::MLIRContext &context);
 
void registerCUFDialectTranslation(mlir::DialectRegistry ®istry)