From aaafeac89b4fe8f0637f5dfca04b98e2f8bdf85c Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Sat, 23 Nov 2019 06:03:40 -0800 Subject: [spirv] NFC: rename test files and sort tests inside PiperOrigin-RevId: 282132339 --- mlir/include/mlir/Dialect/SPIRV/SPIRVLowering.h | 2 +- mlir/test/Conversion/GPUToSPIRV/load-store.mlir | 95 ++++++++++++++++ mlir/test/Conversion/GPUToSPIRV/load_store.mlir | 95 ---------------- .../Conversion/StandardToSPIRV/op_conversion.mlir | 103 ------------------ .../Conversion/StandardToSPIRV/std-to-spirv.mlir | 119 +++++++++++++++++++++ 5 files changed, 215 insertions(+), 199 deletions(-) create mode 100644 mlir/test/Conversion/GPUToSPIRV/load-store.mlir delete mode 100644 mlir/test/Conversion/GPUToSPIRV/load_store.mlir delete mode 100644 mlir/test/Conversion/StandardToSPIRV/op_conversion.mlir create mode 100644 mlir/test/Conversion/StandardToSPIRV/std-to-spirv.mlir diff --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVLowering.h b/mlir/include/mlir/Dialect/SPIRV/SPIRVLowering.h index 56182aedac8..417d0e1bb72 100644 --- a/mlir/include/mlir/Dialect/SPIRV/SPIRVLowering.h +++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVLowering.h @@ -15,7 +15,7 @@ // limitations under the License. // ============================================================================= // -// Defines, utilities and base classes to use while targeting SPIR-V dialect. +// Defines utilities to use while targeting SPIR-V dialect. // //===----------------------------------------------------------------------===// diff --git a/mlir/test/Conversion/GPUToSPIRV/load-store.mlir b/mlir/test/Conversion/GPUToSPIRV/load-store.mlir new file mode 100644 index 00000000000..daa975becaf --- /dev/null +++ b/mlir/test/Conversion/GPUToSPIRV/load-store.mlir @@ -0,0 +1,95 @@ +// RUN: mlir-opt -convert-gpu-to-spirv %s -o - | FileCheck %s + +module attributes {gpu.container_module} { + func @load_store(%arg0: memref<12x4xf32>, %arg1: memref<12x4xf32>, %arg2: memref<12x4xf32>) { + %c0 = constant 0 : index + %c12 = constant 12 : index + %0 = subi %c12, %c0 : index + %c1 = constant 1 : index + %c0_0 = constant 0 : index + %c4 = constant 4 : index + %1 = subi %c4, %c0_0 : index + %c1_1 = constant 1 : index + %c1_2 = constant 1 : index + "gpu.launch_func"(%0, %c1_2, %c1_2, %1, %c1_2, %c1_2, %arg0, %arg1, %arg2, %c0, %c0_0, %c1, %c1_1) {kernel = "load_store_kernel", kernel_module = @kernels} : (index, index, index, index, index, index, memref<12x4xf32>, memref<12x4xf32>, memref<12x4xf32>, index, index, index, index) -> () + return + } + + // CHECK-LABEL: spv.module "Logical" "GLSL450" + module @kernels attributes {gpu.kernel_module} { + // CHECK-DAG: spv.globalVariable [[WORKGROUPSIZEVAR:@.*]] built_in("WorkgroupSize") : !spv.ptr, Input> + // CHECK-DAG: spv.globalVariable [[NUMWORKGROUPSVAR:@.*]] built_in("NumWorkgroups") : !spv.ptr, Input> + // CHECK-DAG: spv.globalVariable [[LOCALINVOCATIONIDVAR:@.*]] built_in("LocalInvocationId") : !spv.ptr, Input> + // CHECK-DAG: spv.globalVariable [[WORKGROUPIDVAR:@.*]] built_in("WorkgroupId") : !spv.ptr, Input> + // CHECK-DAG: spv.globalVariable [[VAR0:@.*]] bind(0, 0) : !spv.ptr [16]> [0]>, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR1:@.*]] bind(0, 1) : !spv.ptr [16]> [0]>, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR2:@.*]] bind(0, 2) : !spv.ptr [16]> [0]>, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR3:@.*]] bind(0, 3) : !spv.ptr, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR4:@.*]] bind(0, 4) : !spv.ptr, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR5:@.*]] bind(0, 5) : !spv.ptr, StorageBuffer> + // CHECK-DAG: spv.globalVariable [[VAR6:@.*]] bind(0, 6) : !spv.ptr, StorageBuffer> + // CHECK: func [[FN:@.*]]() + func @load_store_kernel(%arg0: memref<12x4xf32>, %arg1: memref<12x4xf32>, %arg2: memref<12x4xf32>, %arg3: index, %arg4: index, %arg5: index, %arg6: index) + attributes {gpu.kernel} { + // CHECK: [[ADDRESSARG0:%.*]] = spv._address_of [[VAR0]] + // CHECK: [[CONST0:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG0:%.*]] = spv.AccessChain [[ADDRESSARG0]]{{\[}}[[CONST0]] + // CHECK: [[ADDRESSARG1:%.*]] = spv._address_of [[VAR1]] + // CHECK: [[CONST1:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG1:%.*]] = spv.AccessChain [[ADDRESSARG1]]{{\[}}[[CONST1]] + // CHECK: [[ADDRESSARG2:%.*]] = spv._address_of [[VAR2]] + // CHECK: [[CONST2:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG2:%.*]] = spv.AccessChain [[ADDRESSARG2]]{{\[}}[[CONST2]] + // CHECK: [[ADDRESSARG3:%.*]] = spv._address_of [[VAR3]] + // CHECK: [[CONST3:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG3PTR:%.*]] = spv.AccessChain [[ADDRESSARG3]]{{\[}}[[CONST3]] + // CHECK: [[ARG3:%.*]] = spv.Load "StorageBuffer" [[ARG3PTR]] + // CHECK: [[ADDRESSARG4:%.*]] = spv._address_of [[VAR4]] + // CHECK: [[CONST4:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG4PTR:%.*]] = spv.AccessChain [[ADDRESSARG4]]{{\[}}[[CONST4]] + // CHECK: [[ARG4:%.*]] = spv.Load "StorageBuffer" [[ARG4PTR]] + // CHECK: [[ADDRESSARG5:%.*]] = spv._address_of [[VAR5]] + // CHECK: [[CONST5:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG5PTR:%.*]] = spv.AccessChain [[ADDRESSARG5]]{{\[}}[[CONST5]] + // CHECK: [[ARG5:%.*]] = spv.Load "StorageBuffer" [[ARG5PTR]] + // CHECK: [[ADDRESSARG6:%.*]] = spv._address_of [[VAR6]] + // CHECK: [[CONST6:%.*]] = spv.constant 0 : i32 + // CHECK: [[ARG6PTR:%.*]] = spv.AccessChain [[ADDRESSARG6]]{{\[}}[[CONST6]] + // CHECK: [[ARG6:%.*]] = spv.Load "StorageBuffer" [[ARG6PTR]] + // CHECK: [[ADDRESSWORKGROUPID:%.*]] = spv._address_of [[WORKGROUPIDVAR]] + // CHECK: [[WORKGROUPID:%.*]] = spv.Load "Input" [[ADDRESSWORKGROUPID]] + // CHECK: [[WORKGROUPIDX:%.*]] = spv.CompositeExtract [[WORKGROUPID]]{{\[}}0 : i32{{\]}} + // CHECK: [[ADDRESSLOCALINVOCATIONID:%.*]] = spv._address_of [[LOCALINVOCATIONIDVAR]] + // CHECK: [[LOCALINVOCATIONID:%.*]] = spv.Load "Input" [[ADDRESSLOCALINVOCATIONID]] + // CHECK: [[LOCALINVOCATIONIDX:%.*]] = spv.CompositeExtract [[LOCALINVOCATIONID]]{{\[}}0 : i32{{\]}} + %0 = "gpu.block_id"() {dimension = "x"} : () -> index + %1 = "gpu.block_id"() {dimension = "y"} : () -> index + %2 = "gpu.block_id"() {dimension = "z"} : () -> index + %3 = "gpu.thread_id"() {dimension = "x"} : () -> index + %4 = "gpu.thread_id"() {dimension = "y"} : () -> index + %5 = "gpu.thread_id"() {dimension = "z"} : () -> index + %6 = "gpu.grid_dim"() {dimension = "x"} : () -> index + %7 = "gpu.grid_dim"() {dimension = "y"} : () -> index + %8 = "gpu.grid_dim"() {dimension = "z"} : () -> index + %9 = "gpu.block_dim"() {dimension = "x"} : () -> index + %10 = "gpu.block_dim"() {dimension = "y"} : () -> index + %11 = "gpu.block_dim"() {dimension = "z"} : () -> index + // CHECK: [[INDEX1:%.*]] = spv.IAdd [[ARG3]], [[WORKGROUPIDX]] + %12 = addi %arg3, %0 : index + // CHECK: [[INDEX2:%.*]] = spv.IAdd [[ARG4]], [[LOCALINVOCATIONIDX]] + %13 = addi %arg4, %3 : index + // CHECK: [[PTR1:%.*]] = spv.AccessChain [[ARG0]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} + // CHECK-NEXT: [[VAL1:%.*]] = spv.Load "StorageBuffer" [[PTR1]] + %14 = load %arg0[%12, %13] : memref<12x4xf32> + // CHECK: [[PTR2:%.*]] = spv.AccessChain [[ARG1]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} + // CHECK-NEXT: [[VAL2:%.*]] = spv.Load "StorageBuffer" [[PTR2]] + %15 = load %arg1[%12, %13] : memref<12x4xf32> + // CHECK: [[VAL3:%.*]] = spv.FAdd [[VAL1]], [[VAL2]] + %16 = addf %14, %15 : f32 + // CHECK: [[PTR3:%.*]] = spv.AccessChain [[ARG2]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} + // CHECK-NEXT: spv.Store "StorageBuffer" [[PTR3]], [[VAL3]] + store %16, %arg2[%12, %13] : memref<12x4xf32> + return + } + } +} diff --git a/mlir/test/Conversion/GPUToSPIRV/load_store.mlir b/mlir/test/Conversion/GPUToSPIRV/load_store.mlir deleted file mode 100644 index daa975becaf..00000000000 --- a/mlir/test/Conversion/GPUToSPIRV/load_store.mlir +++ /dev/null @@ -1,95 +0,0 @@ -// RUN: mlir-opt -convert-gpu-to-spirv %s -o - | FileCheck %s - -module attributes {gpu.container_module} { - func @load_store(%arg0: memref<12x4xf32>, %arg1: memref<12x4xf32>, %arg2: memref<12x4xf32>) { - %c0 = constant 0 : index - %c12 = constant 12 : index - %0 = subi %c12, %c0 : index - %c1 = constant 1 : index - %c0_0 = constant 0 : index - %c4 = constant 4 : index - %1 = subi %c4, %c0_0 : index - %c1_1 = constant 1 : index - %c1_2 = constant 1 : index - "gpu.launch_func"(%0, %c1_2, %c1_2, %1, %c1_2, %c1_2, %arg0, %arg1, %arg2, %c0, %c0_0, %c1, %c1_1) {kernel = "load_store_kernel", kernel_module = @kernels} : (index, index, index, index, index, index, memref<12x4xf32>, memref<12x4xf32>, memref<12x4xf32>, index, index, index, index) -> () - return - } - - // CHECK-LABEL: spv.module "Logical" "GLSL450" - module @kernels attributes {gpu.kernel_module} { - // CHECK-DAG: spv.globalVariable [[WORKGROUPSIZEVAR:@.*]] built_in("WorkgroupSize") : !spv.ptr, Input> - // CHECK-DAG: spv.globalVariable [[NUMWORKGROUPSVAR:@.*]] built_in("NumWorkgroups") : !spv.ptr, Input> - // CHECK-DAG: spv.globalVariable [[LOCALINVOCATIONIDVAR:@.*]] built_in("LocalInvocationId") : !spv.ptr, Input> - // CHECK-DAG: spv.globalVariable [[WORKGROUPIDVAR:@.*]] built_in("WorkgroupId") : !spv.ptr, Input> - // CHECK-DAG: spv.globalVariable [[VAR0:@.*]] bind(0, 0) : !spv.ptr [16]> [0]>, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR1:@.*]] bind(0, 1) : !spv.ptr [16]> [0]>, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR2:@.*]] bind(0, 2) : !spv.ptr [16]> [0]>, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR3:@.*]] bind(0, 3) : !spv.ptr, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR4:@.*]] bind(0, 4) : !spv.ptr, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR5:@.*]] bind(0, 5) : !spv.ptr, StorageBuffer> - // CHECK-DAG: spv.globalVariable [[VAR6:@.*]] bind(0, 6) : !spv.ptr, StorageBuffer> - // CHECK: func [[FN:@.*]]() - func @load_store_kernel(%arg0: memref<12x4xf32>, %arg1: memref<12x4xf32>, %arg2: memref<12x4xf32>, %arg3: index, %arg4: index, %arg5: index, %arg6: index) - attributes {gpu.kernel} { - // CHECK: [[ADDRESSARG0:%.*]] = spv._address_of [[VAR0]] - // CHECK: [[CONST0:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG0:%.*]] = spv.AccessChain [[ADDRESSARG0]]{{\[}}[[CONST0]] - // CHECK: [[ADDRESSARG1:%.*]] = spv._address_of [[VAR1]] - // CHECK: [[CONST1:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG1:%.*]] = spv.AccessChain [[ADDRESSARG1]]{{\[}}[[CONST1]] - // CHECK: [[ADDRESSARG2:%.*]] = spv._address_of [[VAR2]] - // CHECK: [[CONST2:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG2:%.*]] = spv.AccessChain [[ADDRESSARG2]]{{\[}}[[CONST2]] - // CHECK: [[ADDRESSARG3:%.*]] = spv._address_of [[VAR3]] - // CHECK: [[CONST3:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG3PTR:%.*]] = spv.AccessChain [[ADDRESSARG3]]{{\[}}[[CONST3]] - // CHECK: [[ARG3:%.*]] = spv.Load "StorageBuffer" [[ARG3PTR]] - // CHECK: [[ADDRESSARG4:%.*]] = spv._address_of [[VAR4]] - // CHECK: [[CONST4:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG4PTR:%.*]] = spv.AccessChain [[ADDRESSARG4]]{{\[}}[[CONST4]] - // CHECK: [[ARG4:%.*]] = spv.Load "StorageBuffer" [[ARG4PTR]] - // CHECK: [[ADDRESSARG5:%.*]] = spv._address_of [[VAR5]] - // CHECK: [[CONST5:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG5PTR:%.*]] = spv.AccessChain [[ADDRESSARG5]]{{\[}}[[CONST5]] - // CHECK: [[ARG5:%.*]] = spv.Load "StorageBuffer" [[ARG5PTR]] - // CHECK: [[ADDRESSARG6:%.*]] = spv._address_of [[VAR6]] - // CHECK: [[CONST6:%.*]] = spv.constant 0 : i32 - // CHECK: [[ARG6PTR:%.*]] = spv.AccessChain [[ADDRESSARG6]]{{\[}}[[CONST6]] - // CHECK: [[ARG6:%.*]] = spv.Load "StorageBuffer" [[ARG6PTR]] - // CHECK: [[ADDRESSWORKGROUPID:%.*]] = spv._address_of [[WORKGROUPIDVAR]] - // CHECK: [[WORKGROUPID:%.*]] = spv.Load "Input" [[ADDRESSWORKGROUPID]] - // CHECK: [[WORKGROUPIDX:%.*]] = spv.CompositeExtract [[WORKGROUPID]]{{\[}}0 : i32{{\]}} - // CHECK: [[ADDRESSLOCALINVOCATIONID:%.*]] = spv._address_of [[LOCALINVOCATIONIDVAR]] - // CHECK: [[LOCALINVOCATIONID:%.*]] = spv.Load "Input" [[ADDRESSLOCALINVOCATIONID]] - // CHECK: [[LOCALINVOCATIONIDX:%.*]] = spv.CompositeExtract [[LOCALINVOCATIONID]]{{\[}}0 : i32{{\]}} - %0 = "gpu.block_id"() {dimension = "x"} : () -> index - %1 = "gpu.block_id"() {dimension = "y"} : () -> index - %2 = "gpu.block_id"() {dimension = "z"} : () -> index - %3 = "gpu.thread_id"() {dimension = "x"} : () -> index - %4 = "gpu.thread_id"() {dimension = "y"} : () -> index - %5 = "gpu.thread_id"() {dimension = "z"} : () -> index - %6 = "gpu.grid_dim"() {dimension = "x"} : () -> index - %7 = "gpu.grid_dim"() {dimension = "y"} : () -> index - %8 = "gpu.grid_dim"() {dimension = "z"} : () -> index - %9 = "gpu.block_dim"() {dimension = "x"} : () -> index - %10 = "gpu.block_dim"() {dimension = "y"} : () -> index - %11 = "gpu.block_dim"() {dimension = "z"} : () -> index - // CHECK: [[INDEX1:%.*]] = spv.IAdd [[ARG3]], [[WORKGROUPIDX]] - %12 = addi %arg3, %0 : index - // CHECK: [[INDEX2:%.*]] = spv.IAdd [[ARG4]], [[LOCALINVOCATIONIDX]] - %13 = addi %arg4, %3 : index - // CHECK: [[PTR1:%.*]] = spv.AccessChain [[ARG0]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} - // CHECK-NEXT: [[VAL1:%.*]] = spv.Load "StorageBuffer" [[PTR1]] - %14 = load %arg0[%12, %13] : memref<12x4xf32> - // CHECK: [[PTR2:%.*]] = spv.AccessChain [[ARG1]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} - // CHECK-NEXT: [[VAL2:%.*]] = spv.Load "StorageBuffer" [[PTR2]] - %15 = load %arg1[%12, %13] : memref<12x4xf32> - // CHECK: [[VAL3:%.*]] = spv.FAdd [[VAL1]], [[VAL2]] - %16 = addf %14, %15 : f32 - // CHECK: [[PTR3:%.*]] = spv.AccessChain [[ARG2]]{{\[}}[[INDEX1]], [[INDEX2]]{{\]}} - // CHECK-NEXT: spv.Store "StorageBuffer" [[PTR3]], [[VAL3]] - store %16, %arg2[%12, %13] : memref<12x4xf32> - return - } - } -} diff --git a/mlir/test/Conversion/StandardToSPIRV/op_conversion.mlir b/mlir/test/Conversion/StandardToSPIRV/op_conversion.mlir deleted file mode 100644 index d0effdd3fe4..00000000000 --- a/mlir/test/Conversion/StandardToSPIRV/op_conversion.mlir +++ /dev/null @@ -1,103 +0,0 @@ -// RUN: mlir-opt -convert-std-to-spirv %s -o - | FileCheck %s - -// CHECK-LABEL: @fmul_scalar -func @fmul_scalar(%arg: f32) -> f32 { - // CHECK: spv.FMul - %0 = mulf %arg, %arg : f32 - return %0 : f32 -} - -// CHECK-LABEL: @fmul_vector2 -func @fmul_vector2(%arg: vector<2xf32>) -> vector<2xf32> { - // CHECK: spv.FMul - %0 = mulf %arg, %arg : vector<2xf32> - return %0 : vector<2xf32> -} - -// CHECK-LABEL: @fmul_vector3 -func @fmul_vector3(%arg: vector<3xf32>) -> vector<3xf32> { - // CHECK: spv.FMul - %0 = mulf %arg, %arg : vector<3xf32> - return %0 : vector<3xf32> -} - -// CHECK-LABEL: @fmul_vector4 -func @fmul_vector4(%arg: vector<4xf32>) -> vector<4xf32> { - // CHECK: spv.FMul - %0 = mulf %arg, %arg : vector<4xf32> - return %0 : vector<4xf32> -} - -// CHECK-LABEL: @fmul_vector5 -func @fmul_vector5(%arg: vector<5xf32>) -> vector<5xf32> { - // Vector length of only 2, 3, and 4 is valid for SPIR-V - // CHECK: mulf - %0 = mulf %arg, %arg : vector<5xf32> - return %0 : vector<5xf32> -} - -// CHECK-LABEL: @fmul_tensor -func @fmul_tensor(%arg: tensor<4xf32>) -> tensor<4xf32> { - // For tensors mulf cannot be lowered directly to spv.FMul - // CHECK: mulf - %0 = mulf %arg, %arg : tensor<4xf32> - return %0 : tensor<4xf32> -} - -// CHECK-LABEL: @constval -func @constval() { - // CHECK: spv.constant true - %0 = constant true - // CHECK: spv.constant 42 : i64 - %1 = constant 42 - // CHECK: spv.constant {{[0-9]*\.[0-9]*e?-?[0-9]*}} : f32 - %2 = constant 0.5 : f32 - // CHECK: spv.constant dense<[2, 3]> : vector<2xi32> - %3 = constant dense<[2, 3]> : vector<2xi32> - // CHECK: spv.constant 1 : i32 - %4 = constant 1 : index - return -} - -// CHECK-LABEL: @cmpiop -func @cmpiop(%arg0 : i32, %arg1 : i32) { - // CHECK: spv.IEqual - %0 = cmpi "eq", %arg0, %arg1 : i32 - // CHECK: spv.INotEqual - %1 = cmpi "ne", %arg0, %arg1 : i32 - // CHECK: spv.SLessThan - %2 = cmpi "slt", %arg0, %arg1 : i32 - // CHECK: spv.SLessThanEqual - %3 = cmpi "sle", %arg0, %arg1 : i32 - // CHECK: spv.SGreaterThan - %4 = cmpi "sgt", %arg0, %arg1 : i32 - // CHECK: spv.SGreaterThanEqual - %5 = cmpi "sge", %arg0, %arg1 : i32 - return -} - -// CHECK-LABEL: @select -func @selectOp(%arg0 : i32, %arg1 : i32) { - %0 = cmpi "sle", %arg0, %arg1 : i32 - // CHECK: spv.Select - %1 = select %0, %arg0, %arg1 : i32 - return -} - -// CHECK-LABEL: @div_rem -func @div_rem(%arg0 : i32, %arg1 : i32) { - // CHECK: spv.SDiv - %0 = divis %arg0, %arg1 : i32 - // CHECK: spv.SMod - %1 = remis %arg0, %arg1 : i32 - return -} - -// CHECK-LABEL: @add_sub -func @add_sub(%arg0 : i32, %arg1 : i32) { - // CHECK: spv.IAdd - %0 = addi %arg0, %arg1 : i32 - // CHECK: spv.ISub - %1 = subi %arg0, %arg1 : i32 - return -} diff --git a/mlir/test/Conversion/StandardToSPIRV/std-to-spirv.mlir b/mlir/test/Conversion/StandardToSPIRV/std-to-spirv.mlir new file mode 100644 index 00000000000..3e1b4420b1b --- /dev/null +++ b/mlir/test/Conversion/StandardToSPIRV/std-to-spirv.mlir @@ -0,0 +1,119 @@ +// RUN: mlir-opt -convert-std-to-spirv %s -o - | FileCheck %s + +//===----------------------------------------------------------------------===// +// std binary arithmetic ops +//===----------------------------------------------------------------------===// + +// CHECK-LABEL: @add_sub +func @add_sub(%arg0 : i32, %arg1 : i32) { + // CHECK: spv.IAdd + %0 = addi %arg0, %arg1 : i32 + // CHECK: spv.ISub + %1 = subi %arg0, %arg1 : i32 + return +} + +// CHECK-LABEL: @fmul_scalar +func @fmul_scalar(%arg: f32) -> f32 { + // CHECK: spv.FMul + %0 = mulf %arg, %arg : f32 + return %0 : f32 +} + +// CHECK-LABEL: @fmul_vector2 +func @fmul_vector2(%arg: vector<2xf32>) -> vector<2xf32> { + // CHECK: spv.FMul + %0 = mulf %arg, %arg : vector<2xf32> + return %0 : vector<2xf32> +} + +// CHECK-LABEL: @fmul_vector3 +func @fmul_vector3(%arg: vector<3xf32>) -> vector<3xf32> { + // CHECK: spv.FMul + %0 = mulf %arg, %arg : vector<3xf32> + return %0 : vector<3xf32> +} + +// CHECK-LABEL: @fmul_vector4 +func @fmul_vector4(%arg: vector<4xf32>) -> vector<4xf32> { + // CHECK: spv.FMul + %0 = mulf %arg, %arg : vector<4xf32> + return %0 : vector<4xf32> +} + +// CHECK-LABEL: @fmul_vector5 +func @fmul_vector5(%arg: vector<5xf32>) -> vector<5xf32> { + // Vector length of only 2, 3, and 4 is valid for SPIR-V + // CHECK: mulf + %0 = mulf %arg, %arg : vector<5xf32> + return %0 : vector<5xf32> +} + +// CHECK-LABEL: @fmul_tensor +func @fmul_tensor(%arg: tensor<4xf32>) -> tensor<4xf32> { + // For tensors mulf cannot be lowered directly to spv.FMul + // CHECK: mulf + %0 = mulf %arg, %arg : tensor<4xf32> + return %0 : tensor<4xf32> +} + +// CHECK-LABEL: @div_rem +func @div_rem(%arg0 : i32, %arg1 : i32) { + // CHECK: spv.SDiv + %0 = divis %arg0, %arg1 : i32 + // CHECK: spv.SMod + %1 = remis %arg0, %arg1 : i32 + return +} + +//===----------------------------------------------------------------------===// +// std.cmpi +//===----------------------------------------------------------------------===// + +// CHECK-LABEL: @cmpi +func @cmpi(%arg0 : i32, %arg1 : i32) { + // CHECK: spv.IEqual + %0 = cmpi "eq", %arg0, %arg1 : i32 + // CHECK: spv.INotEqual + %1 = cmpi "ne", %arg0, %arg1 : i32 + // CHECK: spv.SLessThan + %2 = cmpi "slt", %arg0, %arg1 : i32 + // CHECK: spv.SLessThanEqual + %3 = cmpi "sle", %arg0, %arg1 : i32 + // CHECK: spv.SGreaterThan + %4 = cmpi "sgt", %arg0, %arg1 : i32 + // CHECK: spv.SGreaterThanEqual + %5 = cmpi "sge", %arg0, %arg1 : i32 + return +} + +//===----------------------------------------------------------------------===// +// std.constant +//===----------------------------------------------------------------------===// + +// CHECK-LABEL: @constant +func @constant() { + // CHECK: spv.constant true + %0 = constant true + // CHECK: spv.constant 42 : i64 + %1 = constant 42 + // CHECK: spv.constant {{[0-9]*\.[0-9]*e?-?[0-9]*}} : f32 + %2 = constant 0.5 : f32 + // CHECK: spv.constant dense<[2, 3]> : vector<2xi32> + %3 = constant dense<[2, 3]> : vector<2xi32> + // CHECK: spv.constant 1 : i32 + %4 = constant 1 : index + return +} + +//===----------------------------------------------------------------------===// +// std.select +//===----------------------------------------------------------------------===// + +// CHECK-LABEL: @select +func @select(%arg0 : i32, %arg1 : i32) { + %0 = cmpi "sle", %arg0, %arg1 : i32 + // CHECK: spv.Select + %1 = select %0, %arg0, %arg1 : i32 + return +} -- cgit v1.2.3