Enzyme main
Loading...
Searching...
No Matches
enzymemlir-opt.cpp
Go to the documentation of this file.
1//===- enzymemlir-opt.cpp - The enzymemlir-opt driver ---------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the 'enzymemlir-opt' tool, which is the enzyme analog
10// of mlir-opt, used to drive compiler passes, e.g. for testing.
11//
12//===----------------------------------------------------------------------===//
13
14#include "mlir/Conversion/Passes.h"
15#include "mlir/Dialect/Affine/IR/AffineOps.h"
16#include "mlir/Dialect/Affine/Transforms/Passes.h"
17#include "mlir/Dialect/Arith/IR/Arith.h"
18#include "mlir/Dialect/Async/IR/Async.h"
19#include "mlir/Dialect/Complex/IR/Complex.h"
20#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h"
21#include "mlir/Dialect/DLTI/DLTI.h"
22#include "mlir/Dialect/Func/Extensions/InlinerExtension.h"
23#include "mlir/Dialect/Func/IR/FuncOps.h"
24#include "mlir/Dialect/GPU/IR/GPUDialect.h"
25#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
26#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
27#include "mlir/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.h"
28#include "mlir/Dialect/Linalg/IR/Linalg.h"
29#include "mlir/Dialect/Linalg/Passes.h"
30#include "mlir/Dialect/Math/IR/Math.h"
31#include "mlir/Dialect/MemRef/IR/MemRef.h"
32#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
33#include "mlir/Dialect/SCF/IR/SCF.h"
34#include "mlir/Dialect/Tensor/IR/Tensor.h"
35#include "mlir/Pass/PassRegistry.h"
36#include "mlir/Tools/mlir-opt/MlirOptMain.h"
37#include "mlir/Transforms/Passes.h"
38
39#include "Dialect/Dialect.h"
43#include "Passes/Passes.h"
44
45#include "Dialect/Ops.h"
46
47using namespace mlir;
48
51
52template <typename T>
55 PtrElementModel<T>, T> {};
56
57int main(int argc, char **argv) {
58 mlir::DialectRegistry registry;
59
60 // Register MLIR stuff
61 registry.insert<mlir::affine::AffineDialect>();
62 registry.insert<mlir::LLVM::LLVMDialect>();
63 registry.insert<mlir::memref::MemRefDialect>();
64 registry.insert<mlir::async::AsyncDialect>();
65 registry.insert<mlir::complex::ComplexDialect>();
66 registry.insert<mlir::func::FuncDialect>();
67 registry.insert<mlir::arith::ArithDialect>();
68 registry.insert<mlir::cf::ControlFlowDialect>();
69 registry.insert<mlir::scf::SCFDialect>();
70 registry.insert<mlir::gpu::GPUDialect>();
71 registry.insert<mlir::NVVM::NVVMDialect>();
72 registry.insert<mlir::omp::OpenMPDialect>();
73 registry.insert<mlir::math::MathDialect>();
74 registry.insert<mlir::linalg::LinalgDialect>();
75 registry.insert<mlir::tensor::TensorDialect>();
76 registry.insert<DLTIDialect>();
77
78 registry.insert<mlir::enzyme::EnzymeDialect>();
79 registry.insert<mlir::impulse::ImpulseDialect>();
80 registry.insert<mlir::enzyme::llvm_ext::LLVMExtDialect>();
81
82 mlir::enzyme::registerenzymePasses();
83
84 mlir::func::registerInlinerExtension(registry);
85 mlir::LLVM::registerInlinerInterface(registry);
86
87 // Register the standard passes we want.
88 mlir::registerCSEPass();
89 mlir::registerMem2RegPass();
90 mlir::registerLowerAffinePass();
91 mlir::registerSCCPPass();
92 mlir::registerInlinerPass();
93 mlir::registerCanonicalizerPass();
94 mlir::registerSymbolDCEPass();
95 mlir::registerLoopInvariantCodeMotionPass();
96 mlir::registerConvertSCFToOpenMPPass();
97 mlir::registerSCFToControlFlowPass();
98 mlir::affine::registerAffinePasses();
99 mlir::registerReconcileUnrealizedCastsPass();
100 mlir::registerLinalgPasses();
101
102 registry.addExtension(+[](MLIRContext *ctx, LLVM::LLVMDialect *dialect) {
103 LLVM::LLVMFunctionType::attachInterface<MemRefInsider>(*ctx);
104 LLVM::LLVMArrayType::attachInterface<MemRefInsider>(*ctx);
105 LLVM::LLVMPointerType::attachInterface<MemRefInsider>(*ctx);
106 LLVM::LLVMStructType::attachInterface<MemRefInsider>(*ctx);
107 MemRefType::attachInterface<PtrElementModel<MemRefType>>(*ctx);
108 LLVM::LLVMStructType::attachInterface<
110 LLVM::LLVMPointerType::attachInterface<
112 LLVM::LLVMArrayType::attachInterface<PtrElementModel<LLVM::LLVMArrayType>>(
113 *ctx);
114 });
115
116 // Register the autodiff interface implementations for upstream dialects.
118
119 return mlir::asMainReturnCode(mlir::MlirOptMain(
120 argc, argv, "Enzyme modular optimizer driver", registry));
121}
int main(int argc, char **argv)
void registerCoreDialectAutodiffInterfaces(DialectRegistry &registry)