blob: 68115c26e102b754bec9b869991d919684eed57b [file] [log] [blame]
# Copyright 2021 The IREE Authors
#
# Licensed 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
"""Macros for defining tests that use the iree-e2e-${test_type}-test runner."""
load("//build_tools/bazel:iree_bytecode_module.bzl", "iree_bytecode_module")
load("//build_tools/bazel:native_binary.bzl", "native_test")
def iree_e2e_runner_test(
name,
test_type,
tests_src,
tests_vmfb,
calls_src,
calls_vmfb,
target_backend,
driver,
test_runner,
compiler_flags = [],
runner_args = [],
tags = [],
timeout = None,
**kwargs):
"""Creates a test using a specified test runner program.
Args:
name: Name of the target
test_type: Name of the test (e.g., matmuls, conv2ds).
tests_src: mlir source file with tests to be compiled.
tests_vmfb: specifies the path to use for the generated IREE module.
calls_src: mlir source file with calls to be compiled.
calls_vmfb: specifies the path to use for the generated IREE module.
target_backend: target backend to compile for.
driver: driver to run the module with.
compiler_flags: additional flags to pass to the compiler. Bytecode
output format and backend flags are passed automatically.
runner_args: additional args to pass to the test runner program. The
driver and input file flags are passed automatically.
tags: Additional labels to apply to the test. "driver=${DRIVER}" is
added automatically.
test_runner: test runner program to run.
timeout: timeout for the generated tests.
**kwargs: any additional attributes to pass to the underlying tests and
test suite.
"""
iree_bytecode_module(
name = name + "_%s_module" % test_type,
module_name = tests_vmfb,
src = tests_src,
flags = [
"--iree-hal-target-backends=%s" % target_backend,
] + compiler_flags,
visibility = ["//visibility:private"],
testonly = True,
**kwargs
)
iree_bytecode_module(
name = name + "_calls_module",
module_name = calls_vmfb,
src = calls_src,
flags = [
"--iree-hal-target-backends=%s" % target_backend,
] + compiler_flags,
visibility = ["//visibility:private"],
testonly = True,
**kwargs
)
native_test(
name = name,
args = [
"--device=%s" % driver,
"--module=$(location :%s)" % tests_vmfb,
"--module=$(location :%s)" % calls_vmfb,
] + runner_args,
data = [
":%s" % tests_vmfb,
":%s" % calls_vmfb,
],
src = test_runner,
tags = tags + ["driver=%s" % driver],
timeout = timeout,
**kwargs
)
def iree_single_backend_e2e_runner_test(
name,
test_type,
generator,
test_runner,
target_backend,
driver,
generator_args = [],
compiler_flags = [],
runner_args = [],
tags = [],
timeout = None,
**kwargs):
"""Generates an iree_e2e_runner_test using a custom python generator script.
The generator script produces .mlir sources which are compiled and passed to
iree_e2e_runner_test.
Args:
name: Name of the target
test_type: Name of the test (e.g., matmul, conv2d).
generator: Target to run to generate the source MLIR files.
It will be invoked with the following standard flags, in addition
to generator_args:
--output_${test_type}_mlir=(current binary dir)/name_${test_type}.mlir
--output_calls_mlir=(current binary dir)/name_calls.mlir
generator_args: additional args to pass to the generator program.
target_backend: target backend to compile for.
driver: driver to run the module with.
compiler_flags: additional flags to pass to the compiler. Bytecode
output format and backend flags are passed automatically.
runner_args: additional args to pass to the test runner program. The
driver and input file flags are passed automatically.
tags: Additional labels to apply to the test. "driver=${DRIVER}" is
added automatically.
test_runner: test runner program to run.
timeout: timeout for the generated tests.
**kwargs: any additional attributes to pass to the underlying tests and
test suite.
"""
tests_src = "%s.mlir" % (name)
tests_vmfb = "%s.vmfb" % (name)
calls_src = "%s_calls.mlir" % (name)
calls_vmfb = "%s_calls.vmfb" % (name)
native.genrule(
name = "%s_generate" % (name),
outs = [tests_src, calls_src],
cmd = " ".join([
"$(location %s)" % (generator),
" ".join([('"%s"' % arg) for arg in generator_args]),
"--output_%s_mlir=$(location %s)" % (test_type, tests_src),
"--output_calls_mlir=$(location %s)" % (calls_src),
] + [('"%s"' % arg) for arg in generator_args]),
tools = [generator],
message = "Generating code and calls for test %s..." % (name),
output_to_bindir = 1,
testonly = True,
**kwargs
)
iree_e2e_runner_test(
name = name,
test_type = test_type,
tests_src = tests_src,
tests_vmfb = tests_vmfb,
calls_src = calls_src,
calls_vmfb = calls_vmfb,
target_backend = target_backend,
driver = driver,
test_runner = test_runner,
compiler_flags = compiler_flags,
runner_args = runner_args,
tags = tags,
timeout = timeout,
**kwargs
)
def iree_generated_e2e_runner_test(
name,
test_type,
generator,
test_runner,
target_backends_and_drivers,
generator_args = [],
compiler_flags = [],
runner_args = [],
tags = [],
timeout = None,
target_cpu_features_variants = [],
**kwargs):
"""Generates a suite of iree_e2e_runner_test on multiple backends/drivers.
Args:
name: Name of the target
test_type: Name of the test (e.g., matmul, conv2d).
generator: Target to run to generate the source MLIR files.
It will be invoked with the following standard flags, in addition
to generator_args:
--output_${test_type}_mlir=(current binary dir)/name_${test_type}.mlir
--output_calls_mlir=(current binary dir)/name_calls.mlir
generator_args: additional args to pass to the generator program.
target_backends_and_drivers: backend/driver pairs to compile and run
the module.
compiler_flags: additional flags to pass to the compiler. Bytecode
output format and backend flags are passed automatically.
runner_args: additional args to pass to the test runner program. The
driver and input file flags are passed automatically.
tags: Additional labels to apply to the test. "driver=${DRIVER}" is
added automatically.
test_runner: test runner program to run.
timeout: timeout for the generated tests.
target_cpu_features_variants: ignored, assumed to be ["generic"] in this
Bazel implementation. See the CMake implementation for what this does
in general.
**kwargs: any additional attributes to pass to the underlying tests and test suite.
"""
# Like CMake, default to "generic". Unlike CMake, do not honor other values.
generic_flags = compiler_flags + ["--iree-llvmcpu-target-cpu=generic"]
tests = []
for backend, driver in target_backends_and_drivers:
# CUDA/ROCm backend/driver not supported by Bazel build.
if backend == "cuda" or driver == "cuda" or backend == "rocm" or driver == "hip":
continue
suite_entry_name = "_".join([name, backend, driver])
iree_single_backend_e2e_runner_test(
name = suite_entry_name,
test_type = test_type,
generator = generator,
test_runner = test_runner,
driver = driver,
target_backend = backend,
generator_args = generator_args,
compiler_flags = generic_flags,
runner_args = runner_args,
tags = tags,
timeout = timeout,
**kwargs
)
tests.append(suite_entry_name)
native.test_suite(
name = name,
tests = tests,
tags = tags,
**kwargs
)