From 86929598d51b0a6cbd50f5c6154f8d6f57bc377c Mon Sep 17 00:00:00 2001 From: Igor Wodiany Date: Wed, 17 Sep 2025 12:04:47 +0100 Subject: [PATCH] [mlir][spirv] Fix execution mode and function call Target tests It fixes the problem where the execution mode is not valid for the given entry point (`LocalSizeHint` requires `Kernel`) and where an `Input` storage class pointer is incorrectly passed to a function call (there is a restriction on what storage classes are allowed for pointer operands to an `OpFunctionCall`, see "2.16.1. Universal Validation Rules"). --- mlir/test/Target/SPIRV/execution-mode.mlir | 9 ++++++-- mlir/test/Target/SPIRV/function-call.mlir | 25 +++++++++++++--------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/mlir/test/Target/SPIRV/execution-mode.mlir b/mlir/test/Target/SPIRV/execution-mode.mlir index e51ba7c0269a4..2178a8a77a225 100644 --- a/mlir/test/Target/SPIRV/execution-mode.mlir +++ b/mlir/test/Target/SPIRV/execution-mode.mlir @@ -1,10 +1,15 @@ // RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip %s | FileCheck %s -spirv.module Logical GLSL450 requires #spirv.vce { +// RUN: %if spirv-tools %{ rm -rf %t %} +// RUN: %if spirv-tools %{ mkdir %t %} +// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %} +// RUN: %if spirv-tools %{ spirv-val %t %} + +spirv.module Logical OpenCL requires #spirv.vce { spirv.func @foo() -> () "None" { spirv.Return } - spirv.EntryPoint "GLCompute" @foo + spirv.EntryPoint "Kernel" @foo // CHECK: spirv.ExecutionMode @foo "LocalSizeHint", 3, 4, 5 spirv.ExecutionMode @foo "LocalSizeHint", 3, 4, 5 } diff --git a/mlir/test/Target/SPIRV/function-call.mlir b/mlir/test/Target/SPIRV/function-call.mlir index a7473a8ccd7ba..2e94ded3401ce 100644 --- a/mlir/test/Target/SPIRV/function-call.mlir +++ b/mlir/test/Target/SPIRV/function-call.mlir @@ -1,26 +1,31 @@ // RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip %s | FileCheck %s -spirv.module Logical GLSL450 requires #spirv.vce { - spirv.GlobalVariable @var1 : !spirv.ptr, Input> +// RUN: %if spirv-tools %{ rm -rf %t %} +// RUN: %if spirv-tools %{ mkdir %t %} +// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %} +// RUN: %if spirv-tools %{ spirv-val %t %} + +spirv.module Logical GLSL450 requires #spirv.vce { + spirv.GlobalVariable @var1 : !spirv.ptr, StorageBuffer> spirv.func @fmain() -> i32 "None" { %0 = spirv.Constant 16 : i32 - %1 = spirv.mlir.addressof @var1 : !spirv.ptr, Input> + %1 = spirv.mlir.addressof @var1 : !spirv.ptr, StorageBuffer> // CHECK: {{%.*}} = spirv.FunctionCall @f_0({{%.*}}) : (i32) -> i32 %3 = spirv.FunctionCall @f_0(%0) : (i32) -> i32 - // CHECK: spirv.FunctionCall @f_1({{%.*}}, {{%.*}}) : (i32, !spirv.ptr, Input>) -> () - spirv.FunctionCall @f_1(%3, %1) : (i32, !spirv.ptr, Input>) -> () - // CHECK: {{%.*}} = spirv.FunctionCall @f_2({{%.*}}) : (!spirv.ptr, Input>) -> !spirv.ptr, Input> - %4 = spirv.FunctionCall @f_2(%1) : (!spirv.ptr, Input>) -> !spirv.ptr, Input> + // CHECK: spirv.FunctionCall @f_1({{%.*}}, {{%.*}}) : (i32, !spirv.ptr, StorageBuffer>) -> () + spirv.FunctionCall @f_1(%3, %1) : (i32, !spirv.ptr, StorageBuffer>) -> () + // CHECK: {{%.*}} = spirv.FunctionCall @f_2({{%.*}}) : (!spirv.ptr, StorageBuffer>) -> !spirv.ptr, StorageBuffer> + %4 = spirv.FunctionCall @f_2(%1) : (!spirv.ptr, StorageBuffer>) -> !spirv.ptr, StorageBuffer> spirv.ReturnValue %3 : i32 } spirv.func @f_0(%arg0 : i32) -> i32 "None" { spirv.ReturnValue %arg0 : i32 } - spirv.func @f_1(%arg0 : i32, %arg1 : !spirv.ptr, Input>) -> () "None" { + spirv.func @f_1(%arg0 : i32, %arg1 : !spirv.ptr, StorageBuffer>) -> () "None" { spirv.Return } - spirv.func @f_2(%arg0 : !spirv.ptr, Input>) -> !spirv.ptr, Input> "None" { - spirv.ReturnValue %arg0 : !spirv.ptr, Input> + spirv.func @f_2(%arg0 : !spirv.ptr, StorageBuffer>) -> !spirv.ptr, StorageBuffer> "None" { + spirv.ReturnValue %arg0 : !spirv.ptr, StorageBuffer> } spirv.func @f_loop_with_function_call(%count : i32) -> () "None" {