1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s 2 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 : i8 6 %ushort_1 = spirv.Constant 1 : i16 7 %uint_0 = spirv.Constant 0 : i32 8 spirv.FunctionCall @outside.func.with.linkage(%uchar_0):(i8) -> () 9 spirv.Return 10 } 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.Return 26} 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.Return 33} 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.Return 40} 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.Return 47} 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.Return 54} 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.Return 61} 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.Return 68} 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.Return 75} 76