| // RUN: iree-opt --split-input-file \ |
| // RUN: --pass-pipeline='builtin.module(hal.executable(iree-hal-serialize-target-executables{target=llvm-cpu}))' \ |
| // RUN: --verify-diagnostics %s -o - |
| |
| // The range reaches LLVM as a `vscale_range` function attribute, so an invalid |
| // one has to be rejected before it can be attached. |
| |
| #pipeline_layout = #hal.pipeline.layout<bindings = [#hal.pipeline.binding<storage_buffer>]> |
| |
| // `+zvl512b` guarantees an RVV VLEN of 512 bits, i.e. a vscale of at least 8, |
| // which the configured maximum of 4 contradicts. |
| #executable_target_riscv64 = #hal.executable.target<"llvm-cpu", "embedded-elf-riscv_64", {cpu = "generic-rv64", cpu_features = "+m,+a,+f,+d,+c,+v,+zvl512b", data_layout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128", native_vector_size = 64 : index, target_triple = "riscv64-unknown-unknown-eabi-elf", vscale_range = [1, 4]}> |
| builtin.module { |
| hal.executable public @vscale_min_exceeds_max { |
| // expected-error @+2 {{invalid vscale range [8, 4]: minimum exceeds maximum; the minimum is raised to 8 by the target's RVV VLEN features}} |
| // expected-error @+1 {{failed to serialize executable for target backend llvm-cpu}} |
| hal.executable.variant public @embedded_elf_riscv_64 target(#executable_target_riscv64) { |
| hal.executable.export public @fn ordinal(0) layout(#pipeline_layout) count(%arg0: !hal.device) -> (index, index, index) { |
| %c1 = arith.constant 1 : index |
| hal.return %c1, %c1, %c1 : index, index, index |
| } |
| builtin.module { |
| llvm.func @fn() { |
| llvm.return |
| } |
| } |
| } |
| } |
| } |
| |
| // ----- |
| |
| #pipeline_layout = #hal.pipeline.layout<bindings = [#hal.pipeline.binding<storage_buffer>]> |
| |
| // LLVM requires both ends of a `vscale_range` to be powers of two. |
| #executable_target_arm_64 = #hal.executable.target<"llvm-cpu", "embedded-elf-arm_64", {cpu = "generic", cpu_features = "+sve", data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", native_vector_size = 16 : index, target_triple = "aarch64-none-elf", vscale_range = [1, 12]}> |
| builtin.module { |
| hal.executable public @vscale_range_not_power_of_two { |
| // expected-error @+2 {{'vscale_range' [1, 12] must consist of powers of two}} |
| // expected-error @+1 {{failed to serialize executable for target backend llvm-cpu}} |
| hal.executable.variant public @embedded_elf_arm_64 target(#executable_target_arm_64) { |
| hal.executable.export public @fn ordinal(0) layout(#pipeline_layout) count(%arg0: !hal.device) -> (index, index, index) { |
| %c1 = arith.constant 1 : index |
| hal.return %c1, %c1, %c1 : index, index, index |
| } |
| builtin.module { |
| llvm.func @fn() { |
| llvm.return |
| } |
| } |
| } |
| } |
| } |