| @@ -831,3 +831,8 @@ if(MSVC OR WIN32) | |||
| endif() | |||
| endforeach() | |||
| endif() | |||
| if(MGE_WITH_JIT_MLIR) | |||
| add_subdirectory(tools/mlir/mgb-opt) | |||
| add_subdirectory(tools/mlir/mgb-file-check) | |||
| endif() | |||
| @@ -297,7 +297,7 @@ void JITFusionPass::Impl::process_opr(OperatorNodeBase* opr) { | |||
| #if MGB_JIT_MLIR | |||
| //! FIXME mlir does't support broadcast currently. | |||
| auto backend = MGB_GETENV("MGB_JIT_BACKEND"); | |||
| if (!strcmp(backend, "MLIR")) { | |||
| if (backend && !strcmp(backend, "MLIR")) { | |||
| for (VarNode* var : opr->input()) { | |||
| if (!SymbolVar{var}.as_immutable_scalar().valid()) { | |||
| if (opr->node_prop().dep_map().at(var) & | |||
| @@ -44,6 +44,7 @@ | |||
| using namespace mlir; | |||
| namespace { | |||
| template <typename OpTy> | |||
| static void createForAllDimensions(OpBuilder& builder, Location loc, | |||
| SmallVectorImpl<Value>& values) { | |||
| @@ -80,7 +81,7 @@ static bool isSinkingBeneficiary(Operation* op) { | |||
| return isa<ConstantOp, DimOp>(op); | |||
| } | |||
| LogicalResult mlir::sinkOperationsIntoLaunchOp(gpu::LaunchOp launchOp) { | |||
| LogicalResult sink_operations_into_launch_op(gpu::LaunchOp launchOp) { | |||
| Region& launchOpBody = launchOp.body(); | |||
| // Identify uses from values defined outside of the scope of the launch | |||
| @@ -232,7 +233,6 @@ static void convertToLaunchFuncOp(gpu::LaunchOp launchOp, | |||
| launchOp.erase(); | |||
| } | |||
| namespace { | |||
| /// Pass that moves the kernel of each LaunchOp into its separate nested module. | |||
| /// | |||
| /// This pass moves the kernel code of each LaunchOp into a function created | |||
| @@ -258,7 +258,7 @@ public: | |||
| .str(); | |||
| // Pull in instructions that can be sunk | |||
| if (failed(sinkOperationsIntoLaunchOp(op))) | |||
| if (failed(sink_operations_into_launch_op(op))) | |||
| return WalkResult::interrupt(); | |||
| gpu::GPUFuncOp outlinedFunc = | |||
| outlineKernelFuncImpl(op, kernelFnName, operands); | |||
| @@ -327,7 +327,6 @@ private: | |||
| return kernelModule; | |||
| } | |||
| }; | |||
| } // namespace | |||
| std::unique_ptr<mlir::Pass> mgb::jit::create_gpu_kernel_outlining_pass() { | |||
| @@ -20,13 +20,12 @@ | |||
| #include "./each_mode.h" | |||
| #include <llvm/ADT/Sequence.h> | |||
| #include <mlir/Dialect/Affine/IR/AffineOps.h> | |||
| #include <mlir/Pass/Pass.h> | |||
| #include <mlir/Transforms/DialectConversion.h> | |||
| #include "mlir/IR/StandardTypes.h" | |||
| #include <llvm/ADT/Sequence.h> | |||
| using namespace mgb; | |||
| using namespace jit; | |||
| @@ -188,6 +187,7 @@ struct ReturnOpLowering : public OpRewritePattern<jit::ReturnOp> { | |||
| LogicalResult matchAndRewrite(jit::ReturnOp op, | |||
| PatternRewriter& rewriter) const final { | |||
| // We lower "mgb.return" directly to "std.return". | |||
| rewriter.replaceOpWithNewOp<mlir::ReturnOp>(op); | |||
| return success(); | |||
| } | |||
| @@ -212,6 +212,7 @@ public: | |||
| void runOnFunction() override final { | |||
| ConversionTarget target(getContext()); | |||
| target.addLegalDialect<AffineDialect, StandardOpsDialect>(); | |||
| // target.addLegalDialect<AffineDialect>(); | |||
| target.addIllegalDialect<MgbDialect>(); | |||
| OwningRewritePatternList patterns; | |||
| @@ -236,6 +237,16 @@ std::unique_ptr<mlir::Pass> mgb::jit::create_lower_to_affine_pass() { | |||
| return std::make_unique<MgbToAffineLoweringPass>(); | |||
| } | |||
| namespace mgb { | |||
| namespace jit { | |||
| void register_test_mgb_to_affine_lowering_pass() { | |||
| PassRegistration<MgbToAffineLoweringPass>( | |||
| "mgb-convert-to-affine", | |||
| "Perform conversion from MGB Dialect to Affine Dialect ", | |||
| [] { return std::make_unique<MgbToAffineLoweringPass>(); }); | |||
| } | |||
| } // namespace jit | |||
| } // namespace mgb | |||
| #endif // MGB_JIT && MGB_JIT_MLIR | |||
| // vim: syntax=cpp.doxygen | |||
| @@ -53,6 +53,16 @@ std::unique_ptr<mlir::Pass> mgb::jit::create_lower_to_llvm_pass() { | |||
| return std::make_unique<AffineToLLVMLoweringPass>(); | |||
| } | |||
| namespace mgb { | |||
| namespace jit { | |||
| void register_test_affine_to_llvm_lowering_pass() { | |||
| PassRegistration<AffineToLLVMLoweringPass>( | |||
| "mgb-codegen-convert-affine-to-llvm", | |||
| "Perform final conversion from Affine to LLVMIR ", | |||
| [] { return std::make_unique<AffineToLLVMLoweringPass>(); }); | |||
| } | |||
| } // namespace jit | |||
| } // namespace mgb | |||
| #endif // MGB_JIT && MGB_JIT_MLIR | |||
| // vim: syntax=cpp.doxygen | |||
| @@ -177,6 +177,12 @@ def ReturnOp : GenericOp<"return", | |||
| The operation takes an no tensor operand and produces no results. | |||
| }]; | |||
| // The return operation takes an optional input operand to return. This | |||
| // value must match the return type of the enclosing function. | |||
| let arguments = (ins); | |||
| // The return operation only emits the input in the format if it is present. | |||
| let assemblyFormat = "attr-dict"; | |||
| } | |||
| def ConstantScalarOp: GenericOp<"sconst", [NoSideEffect]> { | |||
| @@ -19,7 +19,7 @@ | |||
| namespace mgb { | |||
| namespace jit { | |||
| inline const bool is_elemwise_float(const mlir::Type& dt) { | |||
| inline bool is_elemwise_float(const mlir::Type& dt) { | |||
| if (auto cast = dt.dyn_cast_or_null<mlir::MemRefType>()) { | |||
| if (cast.getElementType().getKind() == mlir::StandardTypes::F32) { | |||
| return true; | |||
| @@ -0,0 +1,27 @@ | |||
| configure_lit_site_cfg( | |||
| ${CMAKE_CURRENT_SOURCE_DIR}/utils/lit.site.cfg.py.in | |||
| ${CMAKE_CURRENT_BINARY_DIR}/utils/lit.site.cfg.py | |||
| MAIN_CONFIG | |||
| ${CMAKE_CURRENT_SOURCE_DIR}/utils/lit.cfg.py | |||
| ) | |||
| set(LLVM_EXTERNAL_LIT "${PROJECT_SOURCE_DIR}/third_party/llvm-project/llvm/utils/lit/lit.py" CACHE STRING "External lit") | |||
| set(MLIR_MGB_TEST_DEPENDS | |||
| mgb-file-check | |||
| count not | |||
| mgb-opt | |||
| ) | |||
| add_lit_testsuite(mgb-mlir-test-lit "Running the mgb regression tests" | |||
| ${CMAKE_CURRENT_BINARY_DIR}/utils | |||
| DEPENDS ${MLIR_MGB_TEST_DEPENDS} | |||
| ) | |||
| set_target_properties(mgb-mlir-test-lit PROPERTIES FOLDER "Tests") | |||
| add_lit_testsuites(MLIR_TEST ${CMAKE_CURRENT_SOURCE_DIR} | |||
| DEPENDS ${MLIR_MGB_TEST_DEPENDS} | |||
| ) | |||
| add_custom_target(mlir_pass_check) | |||
| add_dependencies(mlir_pass_check mgb-mlir-test-lit) | |||
| @@ -0,0 +1,16 @@ | |||
| load("//brain/megbrain/src/jit/test/mlir/utils:lit.bzl", "mlir_lit_test_suite") | |||
| filegroup( | |||
| name = "mlir_test_tools", | |||
| testonly = True, | |||
| data = [ | |||
| "//brain/megbrain/tools/mlir:mgb-opt", | |||
| "//brain/megbrain/tools/mlir:mgb-file-check" | |||
| ], | |||
| ) | |||
| mlir_lit_test_suite( | |||
| name = "mlir_pass_check", | |||
| data = [":mlir_test_tools"], | |||
| test_file_exts = ["mlir",] | |||
| ) | |||
| @@ -0,0 +1,58 @@ | |||
| // RUN: mgb-opt --mgb-convert-to-affine --split-input-file -canonicalize -cse %s | mgb-file-check %s | |||
| // RUN: mgb-opt --mgb-convert-to-affine --mgb-codegen-convert-affine-to-llvm --split-input-file -canonicalize -cse %s | |||
| func @add_dim1(%lhs: memref<2xf32>, %rhs: memref<2xf32>, %res: memref<2xf32>) -> () { | |||
| %0 = "mgb.add"(%lhs, %rhs) {name = "add.f"} : | |||
| (memref<2xf32>, memref<2xf32>) -> memref<2xf32> | |||
| "mgb.assign"(%0, %res) : (memref<2xf32>, memref<2xf32>) -> () | |||
| mgb.return | |||
| } | |||
| // CHECK-LABEL: func @add_dim1(%arg0: memref<2xf32>, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { | |||
| // CHECK: %0 = alloc() : memref<2xf32> | |||
| // CHECK: affine.for %arg3 = 0 to 2 { | |||
| // CHECK: %1 = affine.load %arg0[%arg3] : memref<2xf32> | |||
| // CHECK: %2 = affine.load %arg1[%arg3] : memref<2xf32> | |||
| // CHECK: %3 = addf %1, %2 : f32 | |||
| // CHECK: affine.store %3, %0[%arg3] : memref<2xf32> | |||
| // CHECK: } | |||
| // CHECK: affine.for %arg3 = 0 to 2 { | |||
| // CHECK: %1 = affine.load %0[%arg3] : memref<2xf32> | |||
| // CHECK: affine.store %1, %arg2[%arg3] : memref<2xf32> | |||
| // CHECK: } | |||
| // CHECK: dealloc %0 : memref<2xf32> | |||
| // CHECK: return | |||
| // CHECK: } | |||
| func @add_dim4(%lhs: memref<4x3x64x64xf32>, %rhs: memref<4x3x64x64xf32>, %res: memref<4x3x64x64xf32>) -> () { | |||
| %0 = "mgb.add"(%lhs, %rhs) {name = "add.f"} : | |||
| (memref<4x3x64x64xf32>, memref<4x3x64x64xf32>) -> memref<4x3x64x64xf32> | |||
| "mgb.assign"(%0, %res) : (memref<4x3x64x64xf32>, memref<4x3x64x64xf32>) -> () | |||
| mgb.return | |||
| } | |||
| // CHECK-LABEL: func @add_dim4(%arg0: memref<4x3x64x64xf32>, %arg1: memref<4x3x64x64xf32>, %arg2: memref<4x3x64x64xf32>) { | |||
| // CHECK: %0 = alloc() : memref<4x3x64x64xf32> | |||
| // CHECK: affine.for %arg3 = 0 to 4 { | |||
| // CHECK: affine.for %arg4 = 0 to 3 { | |||
| // CHECK: affine.for %arg5 = 0 to 64 { | |||
| // CHECK: affine.for %arg6 = 0 to 64 { | |||
| // CHECK: %1 = affine.load %arg0[%arg3, %arg4, %arg5, %arg6] : memref<4x3x64x64xf32> | |||
| // CHECK: %2 = affine.load %arg1[%arg3, %arg4, %arg5, %arg6] : memref<4x3x64x64xf32> | |||
| // CHECK: %3 = addf %1, %2 : f32 | |||
| // CHECK: affine.store %3, %0[%arg3, %arg4, %arg5, %arg6] : memref<4x3x64x64xf32> | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: affine.for %arg3 = 0 to 4 { | |||
| // CHECK: affine.for %arg4 = 0 to 3 { | |||
| // CHECK: affine.for %arg5 = 0 to 64 { | |||
| // CHECK: affine.for %arg6 = 0 to 64 { | |||
| // CHECK: %1 = affine.load %0[%arg3, %arg4, %arg5, %arg6] : memref<4x3x64x64xf32> | |||
| // CHECK: affine.store %1, %arg2[%arg3, %arg4, %arg5, %arg6] : memref<4x3x64x64xf32> | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: } | |||
| // CHECK: dealloc %0 : memref<4x3x64x64xf32> | |||
| // CHECK: return | |||
| // CHECK: } | |||
| @@ -0,0 +1,5 @@ | |||
| filegroup( | |||
| name = "litfiles", | |||
| srcs = glob(["lit.bzl.*py"]), | |||
| visibility = ["//visibility:public"], | |||
| ) | |||
| @@ -0,0 +1,127 @@ | |||
| # Test definitions for Lit, the LLVM test runner. | |||
| # | |||
| """Lit runner globbing test | |||
| """ | |||
| # Default values used by the test runner. | |||
| _default_test_file_exts = ["mlir", "pbtxt", "td"] | |||
| _default_size = "small" | |||
| _default_tags = [] | |||
| # These are patterns which we should never match, for tests, subdirectories, or | |||
| # test input data files. | |||
| _ALWAYS_EXCLUDE = [ | |||
| "**/LICENSE.txt", | |||
| "**/README.txt", | |||
| "**/lit.local.cfg", | |||
| # Exclude input files that have spaces in their names, since bazel | |||
| # cannot cope with such "targets" in the srcs list. | |||
| "**/* *", | |||
| "**/* */**", | |||
| ] | |||
| def _run_lit_test(name, data, size, tags, features): | |||
| """Runs lit on all tests it can find in `data` under megbrain/src/jit/test/mlir/ir. | |||
| Note that, due to Bazel's hermetic builds, lit only sees the tests that | |||
| are included in the `data` parameter, regardless of what other tests might | |||
| exist in the directory searched. | |||
| Args: | |||
| name: str, the name of the test, including extension. | |||
| data: [str], the data input to the test. | |||
| size: str, the size of the test. | |||
| tags: [str], tags to attach to the test. | |||
| features: [str], list of extra features to enable. | |||
| """ | |||
| native.py_test( | |||
| name = name, | |||
| srcs = ["@llvm-project//llvm:lit"], | |||
| tags = tags, | |||
| args = [ | |||
| "brain/megbrain/src/jit/test/mlir/utils --config-prefix=lit.bzl -v", | |||
| ] + features, | |||
| data = data + [ | |||
| "//brain/megbrain/src/jit/test/mlir/utils:litfiles", | |||
| "//brain/megbrain/tools/mlir:mgb-file-check", | |||
| "@llvm-project//llvm:count", | |||
| "@llvm-project//llvm:not", | |||
| ], | |||
| size = size, | |||
| main = "lit.py", | |||
| ) | |||
| def mlir_lit_test_suite( | |||
| name, | |||
| exclude = [], | |||
| test_file_exts = _default_test_file_exts, | |||
| default_size = _default_size, | |||
| size_override = {}, | |||
| data = [], | |||
| per_test_extra_data = {}, | |||
| default_tags = _default_tags, | |||
| tags_override = {}, | |||
| features = []): | |||
| """Creates all plausible Lit tests (and their inputs) under this directory. | |||
| Args: | |||
| name: str, name of the generated test suite. | |||
| exclude: [str], paths to exclude (for tests and inputs). | |||
| test_file_exts: [str], extensions for files that are tests. | |||
| default_size: str, the test size for targets not in "size_override". | |||
| size_override: {str: str}, sizes to use for specific tests. | |||
| data: [str], additional input data to the test. | |||
| per_test_extra_data: {str: [str]}, extra data to attach to a given file. | |||
| default_tags: [str], additional tags to attach to the test. | |||
| tags_override: {str: str}, tags to add to specific tests. | |||
| features: [str], list of extra features to enable. | |||
| """ | |||
| # Ignore some patterns by default for tests and input data. | |||
| exclude = _ALWAYS_EXCLUDE + exclude | |||
| test_names = [] | |||
| tests = native.glob( | |||
| ["*." + ext for ext in test_file_exts], | |||
| exclude = exclude, | |||
| ) | |||
| # Run tests individually such that errors can be attributed to a specific | |||
| # failure. | |||
| for i in range(len(tests)): | |||
| cur_test = tests[i] | |||
| # Instantiate this test with updated parameters. | |||
| internal_name = cur_test | |||
| lit_test( | |||
| name = internal_name, | |||
| data = data + per_test_extra_data.pop(cur_test, []), | |||
| size = size_override.pop(cur_test, default_size), | |||
| tags = ["windows_fail"] + default_tags + tags_override.pop(cur_test, []), | |||
| features = features, | |||
| ) | |||
| test_names.append(internal_name + ".test") | |||
| native.test_suite( | |||
| name = name, | |||
| tests = test_names, | |||
| tags = default_tags, | |||
| ) | |||
| def lit_test( | |||
| name, | |||
| data = [], | |||
| size = _default_size, | |||
| tags = _default_tags, | |||
| features = []): | |||
| """Runs test files under lit. | |||
| Args: | |||
| name: str, the name of the test. | |||
| data: [str], labels that should be provided as data inputs. | |||
| size: str, the size of the test. | |||
| tags: [str], tags to attach to the test. | |||
| features: [str], list of extra features to enable. | |||
| """ | |||
| _run_lit_test(name + ".test", data + [name], size, tags, features) | |||
| @@ -0,0 +1,52 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # MegEngine is Licensed under the Apache License, Version 2.0 (the "License") | |||
| # | |||
| # Copyright (c) 2014-2020 Megvii Inc. All rights reserved. | |||
| # | |||
| # Unless required by applicable law or agreed to in writing, | |||
| # software distributed under the License is distributed on an | |||
| # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| import os | |||
| import platform | |||
| import re | |||
| import subprocess | |||
| import tempfile | |||
| import lit.formats | |||
| import lit.util | |||
| from lit.llvm import llvm_config | |||
| from lit.llvm.subst import ToolSubst | |||
| from lit.llvm.subst import FindTool | |||
| # Configuration file for the 'lit' test runner. | |||
| # name: The name of this test suite. | |||
| config.name = 'MLIR_TEST' | |||
| config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) | |||
| # suffixes: A list of file extensions to treat as test files. | |||
| config.suffixes = ['.mlir'] | |||
| # test_source_root: The root path where tests are located. | |||
| config.test_source_root = config.mlir_test_dir | |||
| # test_exec_root: The root path where tests should be run. | |||
| config.test_exec_root = os.environ['RUNFILES_DIR'] | |||
| llvm_config.use_default_substitutions() | |||
| # Tweak the PATH to include the tools dir. | |||
| llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True) | |||
| tool_dirs = config.mlir_mgb_tools_dirs + [config.mlir_tools_dir, config.llvm_tools_dir] | |||
| tool_names = [ | |||
| 'mgb-opt', | |||
| 'mlir-tblgen', | |||
| 'mlir-translate', | |||
| 'mgb-file-check', | |||
| ] | |||
| tools = [ToolSubst(s, unresolved='ignore') for s in tool_names] | |||
| llvm_config.add_tool_substitutions(tools, tool_dirs) | |||
| @@ -0,0 +1,43 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # MegEngine is Licensed under the Apache License, Version 2.0 (the "License") | |||
| # | |||
| # Copyright (c) 2014-2020 Megvii Inc. All rights reserved. | |||
| # | |||
| # Unless required by applicable law or agreed to in writing, | |||
| # software distributed under the License is distributed on an | |||
| # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| """Lit runner site configuration.""" | |||
| import os | |||
| import lit.llvm | |||
| config.llvm_tools_dir = os.path.join(os.environ['TEST_SRCDIR'], 'llvm-project', 'llvm') | |||
| config.mlir_obj_root = os.path.join(os.environ['TEST_SRCDIR']) | |||
| config.mlir_tools_dir = os.path.join(os.environ['TEST_SRCDIR'], 'llvm-project', 'mlir') | |||
| config.suffixes = ['.td', '.mlir', '.pbtxt'] | |||
| mlir_mgb_tools_dirs = [ | |||
| 'brain/megbrain/tools/mlir', | |||
| ] | |||
| config.mlir_mgb_tools_dirs = [ | |||
| os.path.join(os.environ['TEST_SRCDIR'], os.environ['TEST_WORKSPACE'], s) | |||
| for s in mlir_mgb_tools_dirs | |||
| ] | |||
| test_dir = os.environ['TEST_TARGET'] | |||
| test_dir = test_dir.strip('/').rsplit(':', 1)[0] | |||
| config.mlir_test_dir = os.path.join( | |||
| os.environ['TEST_SRCDIR'], | |||
| os.environ['TEST_WORKSPACE'], | |||
| test_dir, | |||
| ) | |||
| lit.llvm.initialize(lit_config, config) | |||
| # Let the main config do the real work. | |||
| lit_config.load_config( | |||
| config, | |||
| os.path.join( | |||
| os.path.join( | |||
| os.environ['TEST_SRCDIR'], | |||
| os.environ['TEST_WORKSPACE'], | |||
| 'brain/megbrain/src/jit/test/mlir/utils/lit.bzl.cfg.py', | |||
| ))) | |||
| @@ -0,0 +1,49 @@ | |||
| @LIT_SITE_CFG_IN_HEADER@ | |||
| import sys | |||
| config.host_triple = "@LLVM_HOST_TRIPLE@" | |||
| config.target_triple = "@TARGET_TRIPLE@" | |||
| config.llvm_src_root = "@LLVM_SOURCE_DIR@" | |||
| config.llvm_obj_root = "@LLVM_BINARY_DIR@" | |||
| config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" | |||
| config.llvm_lib_dir = "@LLVM_LIBRARY_DIR@" | |||
| config.llvm_shlib_dir = "@SHLIBDIR@" | |||
| config.llvm_shlib_ext = "@SHLIBEXT@" | |||
| config.llvm_exe_ext = "@EXEEXT@" | |||
| config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" | |||
| config.python_executable = "@PYTHON_EXECUTABLE@" | |||
| config.gold_executable = "@GOLD_EXECUTABLE@" | |||
| config.ld64_executable = "@LD64_EXECUTABLE@" | |||
| config.enable_shared = @ENABLE_SHARED@ | |||
| config.enable_assertions = @ENABLE_ASSERTIONS@ | |||
| config.targets_to_build = "@TARGETS_TO_BUILD@" | |||
| config.native_target = "@LLVM_NATIVE_ARCH@" | |||
| config.llvm_bindings = "@LLVM_BINDINGS@".split(' ') | |||
| config.host_os = "@HOST_OS@" | |||
| config.host_cc = "@HOST_CC@" | |||
| config.host_cxx = "@HOST_CXX@" | |||
| # Note: ldflags can contain double-quoted paths, so must use single quotes here. | |||
| config.host_ldflags = '@HOST_LDFLAGS@' | |||
| config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" | |||
| config.llvm_host_triple = '@LLVM_HOST_TRIPLE@' | |||
| config.host_arch = "@HOST_ARCH@" | |||
| config.mgb_src_root = "@CMAKE_SOURCE_DIR@" | |||
| config.mgb_obj_root = "@CMAKE_BINARY_DIR@" | |||
| # Support substitution of the tools_dir with user parameters. This is | |||
| # used when we can't determine the tool dir at configuration time. | |||
| try: | |||
| config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params | |||
| config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params | |||
| except KeyError: | |||
| e = sys.exc_info()[1] | |||
| key, = e.args | |||
| lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) | |||
| import lit.llvm | |||
| lit.llvm.initialize(lit_config, config) | |||
| # Let the main config do the real work. | |||
| lit_config.load_config(config, "@CMAKE_SOURCE_DIR@/src/jit/test/mlir/utils/lit.cfg.py") | |||
| @@ -0,0 +1,58 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # MegEngine is Licensed under the Apache License, Version 2.0 (the "License") | |||
| # | |||
| # Copyright (c) 2014-2020 Megvii Inc. All rights reserved. | |||
| # | |||
| # Unless required by applicable law or agreed to in writing, | |||
| # software distributed under the License is distributed on an | |||
| # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| import os | |||
| import platform | |||
| import re | |||
| import subprocess | |||
| import tempfile | |||
| import lit.formats | |||
| import lit.util | |||
| from lit.llvm import llvm_config | |||
| from lit.llvm.subst import ToolSubst | |||
| from lit.llvm.subst import FindTool | |||
| # Configuration file for the 'lit' test runner. | |||
| # name: The name of this test suite. | |||
| config.name = 'MLIR_TEST' | |||
| config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) | |||
| # suffixes: A list of file extensions to treat as test files. | |||
| config.suffixes = ['.mlir'] | |||
| # test_source_root: The root path where tests are located. | |||
| config.test_source_root = os.path.join(os.path.dirname(__file__), '../ir') | |||
| # test_exec_root: The root path where tests should be run. | |||
| config.test_exec_root = config.test_source_root | |||
| # llvm_config.use_default_substitutions() | |||
| # Tweak the PATH to include the tools dir. | |||
| llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True) | |||
| tool_dirs = [ | |||
| os.path.join(config.mgb_obj_root, 'tools/mlir'), | |||
| os.path.join(config.mgb_obj_root, 'tools/mlir/mgb-opt'), | |||
| os.path.join(config.mgb_obj_root, 'tools/mlir/mgb-file-check'), | |||
| config.llvm_tools_dir] | |||
| tool_names = [ | |||
| 'mgb-opt', | |||
| 'mlir-tblgen', | |||
| 'mlir-translate', | |||
| 'mgb-file-check', | |||
| ] | |||
| tools = [ToolSubst(s, unresolved='ignore') for s in tool_names] | |||
| llvm_config.add_tool_substitutions(tools, tool_dirs) | |||
| lit.llvm.initialize(lit_config, config) | |||
| @@ -0,0 +1,49 @@ | |||
| @LIT_SITE_CFG_IN_HEADER@ | |||
| import sys | |||
| config.host_triple = "@LLVM_HOST_TRIPLE@" | |||
| config.target_triple = "@TARGET_TRIPLE@" | |||
| config.llvm_src_root = "@LLVM_SOURCE_DIR@" | |||
| config.llvm_obj_root = "@LLVM_BINARY_DIR@" | |||
| config.llvm_tools_dir = "@LLVM_BINARY_DIR@/bin" | |||
| config.llvm_lib_dir = "@LLVM_LIBRARY_DIR@" | |||
| config.llvm_shlib_dir = "@SHLIBDIR@" | |||
| config.llvm_shlib_ext = "@SHLIBEXT@" | |||
| config.llvm_exe_ext = "@EXEEXT@" | |||
| config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" | |||
| config.python_executable = "@PYTHON_EXECUTABLE@" | |||
| config.gold_executable = "@GOLD_EXECUTABLE@" | |||
| config.ld64_executable = "@LD64_EXECUTABLE@" | |||
| config.enable_shared = @ENABLE_SHARED@ | |||
| config.enable_assertions = @ENABLE_ASSERTIONS@ | |||
| config.targets_to_build = "@TARGETS_TO_BUILD@" | |||
| config.native_target = "@LLVM_NATIVE_ARCH@" | |||
| config.llvm_bindings = "@LLVM_BINDINGS@".split(' ') | |||
| config.host_os = "@HOST_OS@" | |||
| config.host_cc = "@HOST_CC@" | |||
| config.host_cxx = "@HOST_CXX@" | |||
| # Note: ldflags can contain double-quoted paths, so must use single quotes here. | |||
| config.host_ldflags = '@HOST_LDFLAGS@' | |||
| config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" | |||
| config.llvm_host_triple = '@LLVM_HOST_TRIPLE@' | |||
| config.host_arch = "@HOST_ARCH@" | |||
| config.mgb_src_root = "@CMAKE_SOURCE_DIR@" | |||
| config.mgb_obj_root = "@CMAKE_BINARY_DIR@" | |||
| # Support substitution of the tools_dir with user parameters. This is | |||
| # used when we can't determine the tool dir at configuration time. | |||
| try: | |||
| config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params | |||
| config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params | |||
| except KeyError: | |||
| e = sys.exc_info()[1] | |||
| key, = e.args | |||
| lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) | |||
| import lit.llvm | |||
| lit.llvm.initialize(lit_config, config) | |||
| # Let the main config do the real work. | |||
| lit_config.load_config(config, "@CMAKE_SOURCE_DIR@/src/jit/test/mlir/utils/lit.cfg.py") | |||
| @@ -43,3 +43,9 @@ endif() | |||
| if (MGE_WITH_DISTRIBUTED) | |||
| target_link_libraries(megbrain_test megray) | |||
| endif() | |||
| if(MGE_WITH_JIT) | |||
| if(MGE_WITH_JIT_MLIR) | |||
| add_subdirectory(${PROJECT_SOURCE_DIR}/src/jit/test/mlir ${CMAKE_CURRENT_BINARY_DIR}/../src/jit/test/mlir) | |||
| endif() | |||
| endif() | |||