93 lines · plain
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s2 3spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {4 spirv.func @linkage_attr_test_kernel() "DontInline" attributes {} {5 %uchar_0 = spirv.Constant 0 : i86 %ushort_1 = spirv.Constant 1 : i167 %uint_0 = spirv.Constant 0 : i328 spirv.FunctionCall @outside.func.with.linkage(%uchar_0):(i8) -> ()9 spirv.Return10 }11 // CHECK: linkage_attributes = #spirv.linkage_attributes<linkage_name = "outside.func", linkage_type = <Import>>12 spirv.func @outside.func.with.linkage(%arg0 : i8) -> () "Pure" attributes {13 linkage_attributes=#spirv.linkage_attributes<14 linkage_name="outside.func",15 linkage_type=<Import>16 >17 }18 spirv.func @inside.func() -> () "Pure" attributes {} {spirv.Return}19}20 21// -----22 23// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<i32, PhysicalStorageBuffer> {spirv.decoration = #spirv.decoration<Aliased>}) "None"24spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Aliased> }) "None" {25 spirv.Return26}27 28// -----29 30// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<i32, PhysicalStorageBuffer> {spirv.decoration = #spirv.decoration<Restrict>}) "None"31spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Restrict> }) "None" {32 spirv.Return33}34 35// -----36 37// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> {spirv.decoration = #spirv.decoration<AliasedPointer>}) "None"38spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> { spirv.decoration = #spirv.decoration<AliasedPointer> }) "None" {39 spirv.Return40}41 42// -----43 44// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> {spirv.decoration = #spirv.decoration<RestrictPointer>}) "None"45spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> { spirv.decoration = #spirv.decoration<RestrictPointer> }) "None" {46 spirv.Return47}48 49// -----50 51// expected-error @+1 {{'spirv.func' op with physical buffer pointer must be decorated either 'Aliased' or 'Restrict'}}52spirv.func @no_arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer>) "None" {53 spirv.Return54}55 56// -----57 58// expected-error @+1 {{'spirv.func' op with a pointer points to a physical buffer pointer must be decorated either 'AliasedPointer' or 'RestrictPointer'}}59spirv.func @no_arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Function>) "None" {60 spirv.Return61}62 63// -----64 65// expected-error @+1 {{'spirv.func' op with physical buffer pointer must be decorated either 'Aliased' or 'Restrict'}}66spirv.func @no_decoration_name_attr(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { random_attr = #spirv.decoration<Aliased> }) "None" {67 spirv.Return68}69 70// -----71 72// expected-error @+1 {{'spirv.func' op arguments may only have dialect attributes}}73spirv.func @no_decoration_name_attr(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Restrict>, random_attr = #spirv.decoration<Aliased> }) "None" {74 spirv.Return75}76 77// -----78 79// expected-error @+1 {{'spirv.func' op entry block must have 1 arguments to match function signature}}80spirv.func @f(f32) "None" {81 %c0 = arith.constant 0 : index82 spirv.Return83}84 85// -----86 87// expected-error @+1 {{'spirv.func' op type of entry block argument #0('f64') must match the type of the corresponding argument in function signature('f32')}}88spirv.func @f(f32) "None" {89 ^bb0(%arg0: f64):90 %c0 = arith.constant 0 : index91 spirv.Return92}93