blob: 9d17d50808d058337094287f6b42746cad21cd53 [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 = [],
target_cpu_features = None,
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.
target_cpu_features: target CPU features. Only for llvm-cpu backend.
**kwargs: any additional attributes to pass to the underlying tests and
test suite.
"""
if target_cpu_features:
fail("target_cpu_features must currently be empty")
iree_bytecode_module(
name = name + "_%s_module" % test_type,
module_name = tests_vmfb,
src = tests_src,
flags = [
"--iree-hal-target-backends=%s" % target_backend,
] + ([
"--iree-llvmcpu-target-cpu-features=%s" % target_cpu_features,
] if target_cpu_features else []) + 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 = [],
target_cpu_features = None,
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.
target_cpu_features: target CPU features. Only for llvm-cpu backend.
**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,
target_cpu_features = target_cpu_features,
**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: list of target cpu features variants.
Currently unimplemented in Bazel due to difficulty of specializing
to target architecture in Bazel. The following describes the
semantics that this should have if implemented. Each
entry is either "default" for the architecture defaults, or a colon-
separated triple "arch:name:cpu_features" where "arch" filters
for a target CPU architecture (in IREE_ARCH format), "name" is a
short name for the CPU features set (used to generate target names)
and cpu_features is a comma-separated list of LLVM target attributes
to enable. Example:
x86_64:avx2_fma:+avx,+avx2,+fma
**kwargs: any additional attributes to pass to the underlying tests and test suite.
"""
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 = compiler_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
)