diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a83b5b7..e92ff1d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ add_subdirectory(tools) # Tools built by this project or LLVM set(MLIR_NEURA_OPT ${CMAKE_BINARY_DIR}/tools/mlir-neura-opt/mlir-neura-opt) set(NEURA_INTERPRETER ${CMAKE_BINARY_DIR}/tools/neura-interpreter/neura-interpreter) +set(NEURA_COMPILER ${CMAKE_BINARY_DIR}/tools/neura-compiler/neura-compiler) set(FILECHECK ${LLVM_TOOLS_BINARY_DIR}/FileCheck) set(MLIR_OPT ${LLVM_TOOLS_BINARY_DIR}/mlir-opt) set(MLIR_TRANSLATE ${LLVM_TOOLS_BINARY_DIR}/mlir-translate) diff --git a/README.md b/README.md index 710df7e3..ba1ad588 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Build LLVM & Neura - Clone this repo. - Build LLVM: - - Check out to commit `cd70802` (a stable version randomly picked, will sync to the latest version). + - Check out to commit `6146a88` (a stable version randomly picked, will sync to the latest version). - Build: ```sh $ mkdir build && cd build diff --git a/include/NeuraDialect/NeuraPasses.h b/include/NeuraDialect/NeuraPasses.h index 61a14a0e..8fa986f2 100644 --- a/include/NeuraDialect/NeuraPasses.h +++ b/include/NeuraDialect/NeuraPasses.h @@ -13,6 +13,8 @@ namespace mlir { namespace neura { +void registerNeuraConversionPassPipeline(); + // Passes defined in GraphPasses.td #define GEN_PASS_DECL #include "NeuraDialect/NeuraPasses.h.inc" diff --git a/lib/NeuraDialect/CMakeLists.txt b/lib/NeuraDialect/CMakeLists.txt index 50532491..6ed04ae7 100644 --- a/lib/NeuraDialect/CMakeLists.txt +++ b/lib/NeuraDialect/CMakeLists.txt @@ -18,12 +18,15 @@ add_public_tablegen_target(MLIRNeuraDialectIncGen) add_mlir_dialect_library(MLIRNeura Neura.cpp NeuraTypes.cpp + NeuraPasses.cpp ADDITIONAL_HEADER_DIRS ${PROJECT_SOURCE_DIR}/include/NeuraDialect DEPENDS MLIRNeuraDialectIncGen + MLIRNeuraTransformsIncGen + MLIRConversionIncGen LINK_LIBS PUBLIC MLIRIR diff --git a/lib/NeuraDialect/NeuraPasses.cpp b/lib/NeuraDialect/NeuraPasses.cpp new file mode 100644 index 00000000..6a88abee --- /dev/null +++ b/lib/NeuraDialect/NeuraPasses.cpp @@ -0,0 +1,20 @@ +#include "mlir/Pass/PassManager.h" +#include "mlir/Pass/PassRegistry.h" +#include "mlir/Transforms/Passes.h" + +#include "NeuraDialect/NeuraDialect.h" +#include "NeuraDialect/NeuraOps.h" +#include "NeuraDialect/NeuraPasses.h" +#include "NeuraDialect/NeuraTypes.h" +#include "Conversion/ConversionPasses.h" + +// This pass pipeline can convert all the other dialects into the Neura dialect +void mlir::neura::registerNeuraConversionPassPipeline() { + PassPipelineRegistration<>("neura-conversion", + "Convert all dialects to Neura dialect", + [](OpPassManager &pm) { + // Convert all the other dialects into the Neura dialect + pm.addPass(mlir::createLowerArithToNeuraPass()); + pm.addPass(mlir::createLowerLlvmToNeuraPass()); + }); +} \ No newline at end of file diff --git a/test/arith2neura/add.mlir b/test/arith2neura/add.mlir index 668e8b3b..fd06d201 100644 --- a/test/arith2neura/add.mlir +++ b/test/arith2neura/add.mlir @@ -1,8 +1,11 @@ -// RUN: mlir-neura-opt --lower-arith-to-neura %s | FileCheck %s +// RUN: neura-compiler --neura-conversion %s | FileCheck %s --check-prefix=COMPILER +// RUN: mlir-neura-opt --lower-arith-to-neura %s | FileCheck %s --check-prefix=OPT func.func @test(%a: f32) -> f32 { %b = arith.constant 2.0 : f32 %res = arith.addf %a, %b : f32 - // CHECK: neura.fadd return %res : f32 } + +// COMPILER: neura.fadd +// OPT: neura.fadd \ No newline at end of file diff --git a/test/lit.cfg.in b/test/lit.cfg.in index 33640d31..aa45ea35 100644 --- a/test/lit.cfg.in +++ b/test/lit.cfg.in @@ -10,6 +10,7 @@ config.test_exec_root = os.path.dirname(__file__) # Tool substitutions from CMake config.substitutions.append(('mlir-neura-opt', '@MLIR_NEURA_OPT@')) config.substitutions.append(('neura-interpreter', '@NEURA_INTERPRETER@')) +config.substitutions.append(('neura-compiler', '@NEURA_COMPILER@')) config.substitutions.append(('FileCheck', '@FILECHECK@')) config.substitutions.append(('mlir-opt', '@MLIR_OPT@')) config.substitutions.append(('mlir-translate', '@MLIR_TRANSLATE@')) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 2f980553..8390f87c 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(mlir-neura-opt) -add_subdirectory(neura-interpreter) \ No newline at end of file +add_subdirectory(neura-interpreter) +add_subdirectory(neura-compiler) \ No newline at end of file diff --git a/tools/neura-compiler/CMakeLists.txt b/tools/neura-compiler/CMakeLists.txt new file mode 100644 index 00000000..69e78747 --- /dev/null +++ b/tools/neura-compiler/CMakeLists.txt @@ -0,0 +1,18 @@ +add_executable(neura-compiler neura-compiler.cpp) +get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) +get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS) +set(LIBS + ${dialect_libs} + ${conversion_libs} + MLIRNeuraTransforms + MLIRConversion + MLIRNeura + MLIRTransforms + MLIROptLib + MLIRPass + MLIRIR + MLIRParser + MLIRSupport + ) + +target_link_libraries(neura-compiler PRIVATE ${LIBS}) \ No newline at end of file diff --git a/tools/neura-compiler/neura-compiler.cpp b/tools/neura-compiler/neura-compiler.cpp new file mode 100644 index 00000000..ec0159a1 --- /dev/null +++ b/tools/neura-compiler/neura-compiler.cpp @@ -0,0 +1,32 @@ +// neura-compiler.cpp + +#include "mlir/Dialect/Affine/IR/AffineOps.h" +#include "mlir/Dialect/DLTI/DLTI.h" +#include "mlir/Dialect/LLVMIR/LLVMDialect.h" +#include "mlir/InitAllDialects.h" +#include "mlir/InitAllPasses.h" +#include "mlir/Support/FileUtilities.h" +#include "mlir/Support/LogicalResult.h" +#include "mlir/Tools/mlir-opt/MlirOptMain.h" + +#include "Conversion/ConversionPasses.h" +#include "NeuraDialect/NeuraDialect.h" +#include "NeuraDialect/NeuraPasses.h" + +int main(int argc, char **argv) { + // Registers MLIR dialects. + mlir::DialectRegistry registry; + registry.insert(); + registry.insert(); + registry.insert(); + registry.insert(); + registry.insert(); + registry.insert(); + registry.insert(); + + mlir::neura::registerNeuraConversionPassPipeline(); + + // Runs the MLIR optimizer. + return mlir::asMainReturnCode( + mlir::MlirOptMain(argc, argv, "Neura Dialect Compiler", registry)); +} \ No newline at end of file