| // RUN: mlir-opt -allow-unregistered-dialect -split-input-file -verify-diagnostics %s | FileCheck %s |
| |
| //===----------------------------------------------------------------------===// |
| // spv.mlir.addressof |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| spv.GlobalVariable @var1 : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| spv.func @access_chain() -> () "None" { |
| %0 = spv.Constant 1: i32 |
| // CHECK: [[VAR1:%.*]] = spv.mlir.addressof @var1 : !spv.ptr<!spv.struct<(f32, !spv.array<4 x f32>)>, Input> |
| // CHECK-NEXT: spv.AccessChain [[VAR1]][{{.*}}, {{.*}}] : !spv.ptr<!spv.struct<(f32, !spv.array<4 x f32>)>, Input> |
| %1 = spv.mlir.addressof @var1 : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| %2 = spv.AccessChain %1[%0, %0] : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input>, i32, i32 |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| // Allow taking address of global variables in other module-like ops |
| spv.GlobalVariable @var : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| func @addressof() -> () { |
| // CHECK: spv.mlir.addressof @var |
| %1 = spv.mlir.addressof @var : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| return |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.GlobalVariable @var1 : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| spv.func @foo() -> () "None" { |
| // expected-error @+1 {{expected spv.GlobalVariable symbol}} |
| %0 = spv.mlir.addressof @var2 : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.GlobalVariable @var1 : !spv.ptr<!spv.struct<(f32, !spv.array<4xf32>)>, Input> |
| spv.func @foo() -> () "None" { |
| // expected-error @+1 {{result type mismatch with the referenced global variable's type}} |
| %0 = spv.mlir.addressof @var1 : !spv.ptr<f32, Input> |
| } |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.Constant |
| //===----------------------------------------------------------------------===// |
| |
| func @const() -> () { |
| // CHECK: spv.Constant true |
| // CHECK: spv.Constant 42 : i32 |
| // CHECK: spv.Constant 5.000000e-01 : f32 |
| // CHECK: spv.Constant dense<[2, 3]> : vector<2xi32> |
| // CHECK: spv.Constant [dense<3.000000e+00> : vector<2xf32>] : !spv.array<1 x vector<2xf32>> |
| // CHECK: spv.Constant dense<1> : tensor<2x3xi32> : !spv.array<2 x !spv.array<3 x i32>> |
| // CHECK: spv.Constant dense<1.000000e+00> : tensor<2x3xf32> : !spv.array<2 x !spv.array<3 x f32>> |
| // CHECK: spv.Constant dense<{{\[}}[1, 2, 3], [4, 5, 6]]> : tensor<2x3xi32> : !spv.array<2 x !spv.array<3 x i32>> |
| // CHECK: spv.Constant dense<{{\[}}[1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf32> : !spv.array<2 x !spv.array<3 x f32>> |
| |
| %0 = spv.Constant true |
| %1 = spv.Constant 42 : i32 |
| %2 = spv.Constant 0.5 : f32 |
| %3 = spv.Constant dense<[2, 3]> : vector<2xi32> |
| %4 = spv.Constant [dense<3.0> : vector<2xf32>] : !spv.array<1xvector<2xf32>> |
| %5 = spv.Constant dense<1> : tensor<2x3xi32> : !spv.array<2 x !spv.array<3 x i32>> |
| %6 = spv.Constant dense<1.0> : tensor<2x3xf32> : !spv.array<2 x !spv.array<3 x f32>> |
| %7 = spv.Constant dense<[[1, 2, 3], [4, 5, 6]]> : tensor<2x3xi32> : !spv.array<2 x !spv.array<3 x i32>> |
| %8 = spv.Constant dense<[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]> : tensor<2x3xf32> : !spv.array<2 x !spv.array<3 x f32>> |
| return |
| } |
| |
| // ----- |
| |
| func @unaccepted_std_attr() -> () { |
| // expected-error @+1 {{cannot have value of type 'none'}} |
| %0 = spv.Constant unit : none |
| return |
| } |
| |
| // ----- |
| |
| func @array_constant() -> () { |
| // expected-error @+1 {{has array element whose type ('vector<2xi32>') does not match the result element type ('vector<2xf32>')}} |
| %0 = spv.Constant [dense<3.0> : vector<2xf32>, dense<4> : vector<2xi32>] : !spv.array<2xvector<2xf32>> |
| return |
| } |
| |
| // ----- |
| |
| func @array_constant() -> () { |
| // expected-error @+1 {{must have spv.array result type for array value}} |
| %0 = spv.Constant [dense<3.0> : vector<2xf32>] : !spv.rtarray<vector<2xf32>> |
| return |
| } |
| |
| // ----- |
| |
| func @non_nested_array_constant() -> () { |
| // expected-error @+1 {{only support nested array result type}} |
| %0 = spv.Constant dense<3.0> : tensor<2x2xf32> : !spv.array<2xvector<2xf32>> |
| return |
| } |
| |
| // ----- |
| |
| func @value_result_type_mismatch() -> () { |
| // expected-error @+1 {{must have spv.array result type for array value}} |
| %0 = "spv.Constant"() {value = dense<0> : tensor<4xi32>} : () -> (vector<4xi32>) |
| } |
| |
| // ----- |
| |
| func @value_result_type_mismatch() -> () { |
| // expected-error @+1 {{result element type ('i32') does not match value element type ('f32')}} |
| %0 = spv.Constant dense<1.0> : tensor<2x3xf32> : !spv.array<2 x !spv.array<3 x i32>> |
| } |
| |
| // ----- |
| |
| func @value_result_num_elements_mismatch() -> () { |
| // expected-error @+1 {{result number of elements (6) does not match value number of elements (4)}} |
| %0 = spv.Constant dense<1.0> : tensor<2x2xf32> : !spv.array<2 x !spv.array<3 x f32>> |
| return |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.EntryPoint |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| // CHECK: spv.EntryPoint "GLCompute" @do_nothing |
| spv.EntryPoint "GLCompute" @do_nothing |
| } |
| |
| spv.module Logical GLSL450 { |
| spv.GlobalVariable @var2 : !spv.ptr<f32, Input> |
| spv.GlobalVariable @var3 : !spv.ptr<f32, Output> |
| spv.func @do_something(%arg0 : !spv.ptr<f32, Input>, %arg1 : !spv.ptr<f32, Output>) -> () "None" { |
| %1 = spv.Load "Input" %arg0 : f32 |
| spv.Store "Output" %arg1, %1 : f32 |
| spv.Return |
| } |
| // CHECK: spv.EntryPoint "GLCompute" @do_something, @var2, @var3 |
| spv.EntryPoint "GLCompute" @do_something, @var2, @var3 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| // expected-error @+1 {{invalid kind of attribute specified}} |
| spv.EntryPoint "GLCompute" "do_nothing" |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| // expected-error @+1 {{function 'do_something' not found in 'spv.module'}} |
| spv.EntryPoint "GLCompute" @do_something |
| } |
| |
| /// TODO: Add a test that verifies an error is thrown |
| /// when interface entries of EntryPointOp are not |
| /// spv.Variables. There is currently no other op that has a spv.ptr |
| /// return type |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| // expected-error @+1 {{op must appear in a module-like op's block}} |
| spv.EntryPoint "GLCompute" @do_something |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| spv.EntryPoint "GLCompute" @do_nothing |
| // expected-error @+1 {{duplicate of a previous EntryPointOp}} |
| spv.EntryPoint "GLCompute" @do_nothing |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| spv.EntryPoint "GLCompute" @do_nothing |
| // expected-error @+1 {{'spv.EntryPoint' invalid execution_model attribute specification: "ContractionOff"}} |
| spv.EntryPoint "ContractionOff" @do_nothing |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.ExecutionMode |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| spv.EntryPoint "GLCompute" @do_nothing |
| // CHECK: spv.ExecutionMode {{@.*}} "ContractionOff" |
| spv.ExecutionMode @do_nothing "ContractionOff" |
| } |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| spv.EntryPoint "GLCompute" @do_nothing |
| // CHECK: spv.ExecutionMode {{@.*}} "LocalSizeHint", 3, 4, 5 |
| spv.ExecutionMode @do_nothing "LocalSizeHint", 3, 4, 5 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| spv.EntryPoint "GLCompute" @do_nothing |
| // expected-error @+1 {{custom op 'spv.ExecutionMode' invalid execution_mode attribute specification: "GLCompute"}} |
| spv.ExecutionMode @do_nothing "GLCompute", 3, 4, 5 |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.func |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: spv.func @foo() "None" |
| spv.func @foo() "None" |
| |
| // CHECK: spv.func @bar(%{{.+}}: i32) -> i32 "Inline|Pure" { |
| spv.func @bar(%arg: i32) -> (i32) "Inline|Pure" { |
| // CHECK-NEXT: spv. |
| spv.ReturnValue %arg: i32 |
| // CHECK-NEXT: } |
| } |
| |
| // CHECK: spv.func @baz(%{{.+}}: i32) "DontInline" attributes {additional_stuff = 64 : i64} |
| spv.func @baz(%arg: i32) "DontInline" attributes { |
| additional_stuff = 64 |
| } { spv.Return } |
| |
| // ----- |
| |
| // expected-error @+1 {{expected function_control attribute specified as string}} |
| spv.func @missing_function_control() { spv.Return } |
| |
| // ----- |
| |
| // expected-error @+1 {{cannot have more than one result}} |
| spv.func @cannot_have_more_than_one_result(%arg: i32) -> (i32, i32) "None" |
| |
| // ----- |
| |
| // expected-error @+1 {{expected SSA identifier}} |
| spv.func @cannot_have_variadic_arguments(%arg: i32, ...) "None" |
| |
| // ----- |
| |
| // Nested function |
| spv.module Logical GLSL450 { |
| spv.func @outer_func() -> () "None" { |
| // expected-error @+1 {{must appear in a module-like op's block}} |
| spv.func @inner_func() -> () "None" { |
| spv.Return |
| } |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.GlobalVariable |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| // CHECK: spv.GlobalVariable @var0 : !spv.ptr<f32, Input> |
| spv.GlobalVariable @var0 : !spv.ptr<f32, Input> |
| } |
| |
| // TODO: Fix test case after initialization with normal constant is addressed |
| // spv.module Logical GLSL450 { |
| // %0 = spv.Constant 4.0 : f32 |
| // // CHECK1: spv.Variable init(%0) : !spv.ptr<f32, Private> |
| // spv.GlobalVariable @var1 init(%0) : !spv.ptr<f32, Private> |
| // } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc = 4.0 : f32 |
| // CHECK: spv.GlobalVariable @var initializer(@sc) : !spv.ptr<f32, Private> |
| spv.GlobalVariable @var initializer(@sc) : !spv.ptr<f32, Private> |
| } |
| |
| // ----- |
| |
| // Allow initializers coming from other module-like ops |
| spv.SpecConstant @sc = 4.0 : f32 |
| // CHECK: spv.GlobalVariable @var initializer(@sc) |
| spv.GlobalVariable @var initializer(@sc) : !spv.ptr<f32, Private> |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // CHECK: spv.GlobalVariable @var0 bind(1, 2) : !spv.ptr<f32, Uniform> |
| spv.GlobalVariable @var0 bind(1, 2) : !spv.ptr<f32, Uniform> |
| } |
| |
| // TODO: Fix test case after initialization with constant is addressed |
| // spv.module Logical GLSL450 { |
| // %0 = spv.Constant 4.0 : f32 |
| // // CHECK1: spv.GlobalVariable @var1 initializer(%0) {binding = 5 : i32} : !spv.ptr<f32, Private> |
| // spv.GlobalVariable @var1 initializer(%0) {binding = 5 : i32} : !spv.ptr<f32, Private> |
| // } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // CHECK: spv.GlobalVariable @var1 built_in("GlobalInvocationID") : !spv.ptr<vector<3xi32>, Input> |
| spv.GlobalVariable @var1 built_in("GlobalInvocationID") : !spv.ptr<vector<3xi32>, Input> |
| // CHECK: spv.GlobalVariable @var2 built_in("GlobalInvocationID") : !spv.ptr<vector<3xi32>, Input> |
| spv.GlobalVariable @var2 {built_in = "GlobalInvocationID"} : !spv.ptr<vector<3xi32>, Input> |
| } |
| |
| // ----- |
| |
| // Allow in other module-like ops |
| module { |
| // CHECK: spv.GlobalVariable |
| spv.GlobalVariable @var0 : !spv.ptr<f32, Input> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{expected spv.ptr type}} |
| spv.GlobalVariable @var0 : f32 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{op initializer must be result of a spv.SpecConstant or spv.GlobalVariable op}} |
| spv.GlobalVariable @var0 initializer(@var1) : !spv.ptr<f32, Private> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{storage class cannot be 'Generic'}} |
| spv.GlobalVariable @var0 : !spv.ptr<f32, Generic> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{storage class cannot be 'Function'}} |
| spv.GlobalVariable @var0 : !spv.ptr<f32, Function> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() "None" { |
| // expected-error @+1 {{op must appear in a module-like op's block}} |
| spv.GlobalVariable @var0 : !spv.ptr<f32, Input> |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.module |
| //===----------------------------------------------------------------------===// |
| |
| // Module without capability and extension |
| // CHECK: spv.module Logical GLSL450 |
| spv.module Logical GLSL450 { } |
| |
| // Module with a name |
| // CHECK: spv.module @{{.*}} Logical GLSL450 |
| spv.module @name Logical GLSL450 { } |
| |
| // Module with (version, capabilities, extensions) triple |
| // CHECK: spv.module Logical GLSL450 requires #spv.vce<v1.0, [Shader], [SPV_KHR_16bit_storage]> |
| spv.module Logical GLSL450 requires #spv.vce<v1.0, [Shader], [SPV_KHR_16bit_storage]> { } |
| |
| // Module with additional attributes |
| // CHECK: spv.module Logical GLSL450 attributes {foo = "bar"} |
| spv.module Logical GLSL450 attributes {foo = "bar"} { } |
| |
| // Module with VCE triple and additional attributes |
| // CHECK: spv.module Logical GLSL450 requires #spv.vce<v1.0, [Shader], [SPV_KHR_16bit_storage]> attributes {foo = "bar"} |
| spv.module Logical GLSL450 |
| requires #spv.vce<v1.0, [Shader], [SPV_KHR_16bit_storage]> |
| attributes {foo = "bar"} { } |
| |
| // Module with function |
| // CHECK: spv.module |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| // Missing addressing model |
| // expected-error@+1 {{'spv.module' expected valid keyword}} |
| spv.module { } |
| |
| // ----- |
| |
| // Wrong addressing model |
| // expected-error@+1 {{'spv.module' invalid addressing_model attribute specification: Physical}} |
| spv.module Physical { } |
| |
| // ----- |
| |
| // Missing memory model |
| // expected-error@+1 {{'spv.module' expected valid keyword}} |
| spv.module Logical { } |
| |
| // ----- |
| |
| // Wrong memory model |
| // expected-error@+1 {{'spv.module' invalid memory_model attribute specification: Bla}} |
| spv.module Logical Bla { } |
| |
| // ----- |
| |
| // Module with multiple blocks |
| // expected-error @+1 {{expects region #0 to have 0 or 1 blocks}} |
| spv.module Logical GLSL450 { |
| ^first: |
| spv.Return |
| ^second: |
| spv.Return |
| } |
| |
| // ----- |
| |
| // Use non SPIR-V op inside module |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{'spv.module' can only contain spv.* ops}} |
| "dialect.op"() : () -> () |
| } |
| |
| // ----- |
| |
| // Use non SPIR-V op inside function |
| spv.module Logical GLSL450 { |
| spv.func @do_nothing() -> () "None" { |
| // expected-error @+1 {{functions in 'spv.module' can only contain spv.* ops}} |
| "dialect.op"() : () -> () |
| } |
| } |
| |
| // ----- |
| |
| // Use external function |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{'spv.module' cannot contain external functions}} |
| spv.func @extern() -> () "None" |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.mlir.referenceof |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = false |
| spv.SpecConstant @sc2 = 42 : i64 |
| spv.SpecConstant @sc3 = 1.5 : f32 |
| |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.struct<(i1, i64, f32)> |
| |
| // CHECK-LABEL: @reference |
| spv.func @reference() -> i1 "None" { |
| // CHECK: spv.mlir.referenceof @sc1 : i1 |
| %0 = spv.mlir.referenceof @sc1 : i1 |
| spv.ReturnValue %0 : i1 |
| } |
| |
| // CHECK-LABEL: @reference_composite |
| spv.func @reference_composite() -> i1 "None" { |
| // CHECK: spv.mlir.referenceof @scc : !spv.struct<(i1, i64, f32)> |
| %0 = spv.mlir.referenceof @scc : !spv.struct<(i1, i64, f32)> |
| %1 = spv.CompositeExtract %0[0 : i32] : !spv.struct<(i1, i64, f32)> |
| spv.ReturnValue %1 : i1 |
| } |
| |
| // CHECK-LABEL: @initialize |
| spv.func @initialize() -> i64 "None" { |
| // CHECK: spv.mlir.referenceof @sc2 : i64 |
| %0 = spv.mlir.referenceof @sc2 : i64 |
| %1 = spv.Variable init(%0) : !spv.ptr<i64, Function> |
| %2 = spv.Load "Function" %1 : i64 |
| spv.ReturnValue %2 : i64 |
| } |
| |
| // CHECK-LABEL: @compute |
| spv.func @compute() -> f32 "None" { |
| // CHECK: spv.mlir.referenceof @sc3 : f32 |
| %0 = spv.mlir.referenceof @sc3 : f32 |
| %1 = spv.Constant 6.0 : f32 |
| %2 = spv.FAdd %0, %1 : f32 |
| spv.ReturnValue %2 : f32 |
| } |
| } |
| |
| // ----- |
| |
| // Allow taking reference of spec constant in other module-like ops |
| spv.SpecConstant @sc = 5 : i32 |
| func @reference_of() { |
| // CHECK: spv.mlir.referenceof @sc |
| %0 = spv.mlir.referenceof @sc : i32 |
| return |
| } |
| |
| // ----- |
| |
| spv.SpecConstant @sc = 5 : i32 |
| spv.SpecConstantComposite @scc (@sc) : !spv.array<1 x i32> |
| |
| func @reference_of_composite() { |
| // CHECK: spv.mlir.referenceof @scc : !spv.array<1 x i32> |
| %0 = spv.mlir.referenceof @scc : !spv.array<1 x i32> |
| %1 = spv.CompositeExtract %0[0 : i32] : !spv.array<1 x i32> |
| return |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() -> () "None" { |
| // expected-error @+1 {{expected spv.SpecConstant or spv.SpecConstantComposite symbol}} |
| %0 = spv.mlir.referenceof @sc : i32 |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc = 42 : i32 |
| spv.func @foo() -> () "None" { |
| // expected-error @+1 {{result type mismatch with the referenced specialization constant's type}} |
| %0 = spv.mlir.referenceof @sc : f32 |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc = 42 : i32 |
| spv.SpecConstantComposite @scc (@sc) : !spv.array<1 x i32> |
| spv.func @foo() -> () "None" { |
| // expected-error @+1 {{result type mismatch with the referenced specialization constant's type}} |
| %0 = spv.mlir.referenceof @scc : f32 |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstant |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| // CHECK: spv.SpecConstant @sc1 = false |
| spv.SpecConstant @sc1 = false |
| // CHECK: spv.SpecConstant @sc2 spec_id(5) = 42 : i64 |
| spv.SpecConstant @sc2 spec_id(5) = 42 : i64 |
| // CHECK: spv.SpecConstant @sc3 = 1.500000e+00 : f32 |
| spv.SpecConstant @sc3 = 1.5 : f32 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{SpecId cannot be negative}} |
| spv.SpecConstant @sc2 spec_id(-5) = 42 : i64 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{default value bitwidth disallowed}} |
| spv.SpecConstant @sc = 15 : i4 |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{default value can only be a bool, integer, or float scalar}} |
| spv.SpecConstant @sc = dense<[2, 3]> : vector<2xi32> |
| } |
| |
| // ----- |
| |
| func @use_in_function() -> () { |
| // expected-error @+1 {{op must appear in a module-like op's block}} |
| spv.SpecConstant @sc = false |
| return |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantComposite |
| //===----------------------------------------------------------------------===// |
| |
| spv.module Logical GLSL450 { |
| // expected-error @+1 {{result type must be a composite type}} |
| spv.SpecConstantComposite @scc2 (@sc1, @sc2, @sc3) : i32 |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantComposite (spv.array) |
| //===----------------------------------------------------------------------===// |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1.5 : f32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // CHECK: spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.array<3 x f32> |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.array<3 x f32> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = false |
| spv.SpecConstant @sc2 spec_id(5) = 42 : i64 |
| spv.SpecConstant @sc3 = 1.5 : f32 |
| // expected-error @+1 {{has incorrect number of operands: expected 4, but provided 3}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.array<4 x f32> |
| |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1 : i32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // expected-error @+1 {{has incorrect types of operands: expected 'f32', but provided 'i32'}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.array<3 x f32> |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantComposite (spv.struct) |
| //===----------------------------------------------------------------------===// |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1 : i32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // CHECK: spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.struct<(i32, f32, f32)> |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.struct<(i32, f32, f32)> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1 : i32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // expected-error @+1 {{has incorrect number of operands: expected 2, but provided 3}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.struct<(i32, f32)> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1.5 : f32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // expected-error @+1 {{has incorrect types of operands: expected 'i32', but provided 'f32'}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : !spv.struct<(i32, f32, f32)> |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantComposite (vector) |
| //===----------------------------------------------------------------------===// |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1.5 : f32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // CHECK: spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : vector<3xf32> |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : vector<3 x f32> |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = false |
| spv.SpecConstant @sc2 spec_id(5) = 42 : i64 |
| spv.SpecConstant @sc3 = 1.5 : f32 |
| // expected-error @+1 {{has incorrect number of operands: expected 4, but provided 3}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : vector<4xf32> |
| |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1 : i32 |
| spv.SpecConstant @sc2 = 2.5 : f32 |
| spv.SpecConstant @sc3 = 3.5 : f32 |
| // expected-error @+1 {{has incorrect types of operands: expected 'f32', but provided 'i32'}} |
| spv.SpecConstantComposite @scc (@sc1, @sc2, @sc3) : vector<3xf32> |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantComposite (spv.coopmatrix) |
| //===----------------------------------------------------------------------===// |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc1 = 1.5 : f32 |
| // expected-error @+1 {{unsupported composite type}} |
| spv.SpecConstantComposite @scc (@sc1) : !spv.coopmatrix<8x16xf32, Device> |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // spv.SpecConstantOperation |
| //===----------------------------------------------------------------------===// |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() -> i32 "None" { |
| // CHECK: [[LHS:%.*]] = spv.Constant |
| %0 = spv.Constant 1: i32 |
| // CHECK: [[RHS:%.*]] = spv.Constant |
| %1 = spv.Constant 1: i32 |
| |
| // CHECK: spv.SpecConstantOperation wraps "spv.IAdd"([[LHS]], [[RHS]]) : (i32, i32) -> i32 |
| %2 = spv.SpecConstantOperation wraps "spv.IAdd"(%0, %1) : (i32, i32) -> i32 |
| |
| spv.ReturnValue %2 : i32 |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.SpecConstant @sc = 42 : i32 |
| |
| spv.func @foo() -> i32 "None" { |
| // CHECK: [[SC:%.*]] = spv.mlir.referenceof @sc |
| %0 = spv.mlir.referenceof @sc : i32 |
| // CHECK: spv.SpecConstantOperation wraps "spv.ISub"([[SC]], [[SC]]) : (i32, i32) -> i32 |
| %1 = spv.SpecConstantOperation wraps "spv.ISub"(%0, %0) : (i32, i32) -> i32 |
| spv.ReturnValue %1 : i32 |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() -> i32 "None" { |
| %0 = spv.Constant 1: i32 |
| // expected-error @+1 {{op expects parent op 'spv.SpecConstantOperation'}} |
| spv.mlir.yield %0 : i32 |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() -> () "None" { |
| %0 = spv.Variable : !spv.ptr<i32, Function> |
| |
| // expected-error @+1 {{invalid enclosed op}} |
| %1 = spv.SpecConstantOperation wraps "spv.Load"(%0) {memory_access = 0 : i32} : (!spv.ptr<i32, Function>) -> i32 |
| spv.Return |
| } |
| } |
| |
| // ----- |
| |
| spv.module Logical GLSL450 { |
| spv.func @foo() -> () "None" { |
| %0 = spv.Variable : !spv.ptr<i32, Function> |
| %1 = spv.Load "Function" %0 : i32 |
| |
| // expected-error @+1 {{invalid operand, must be defined by a constant operation}} |
| %2 = spv.SpecConstantOperation wraps "spv.IAdd"(%1, %1) : (i32, i32) -> i32 |
| |
| spv.Return |
| } |
| } |