528 lines · plain
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// spirv.Bitcast5//===----------------------------------------------------------------------===//6 7func.func @cast1(%arg0 : f32) {8 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : f32 to i329 %0 = spirv.Bitcast %arg0 : f32 to i3210 return11}12 13func.func @cast2(%arg0 : vector<2xf32>) {14 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : vector<2xf32> to vector<2xi32>15 %0 = spirv.Bitcast %arg0 : vector<2xf32> to vector<2xi32>16 return17}18 19func.func @cast3(%arg0 : vector<2xf32>) {20 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : vector<2xf32> to i6421 %0 = spirv.Bitcast %arg0 : vector<2xf32> to i6422 return23}24 25func.func @cast4(%arg0 : !spirv.ptr<f32, Function>) {26 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : !spirv.ptr<f32, Function> to !spirv.ptr<i32, Function>27 %0 = spirv.Bitcast %arg0 : !spirv.ptr<f32, Function> to !spirv.ptr<i32, Function>28 return29}30 31func.func @cast5(%arg0 : !spirv.ptr<f32, Function>) {32 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : !spirv.ptr<f32, Function> to !spirv.ptr<vector<2xi32>, Function>33 %0 = spirv.Bitcast %arg0 : !spirv.ptr<f32, Function> to !spirv.ptr<vector<2xi32>, Function>34 return35}36 37func.func @cast6(%arg0 : vector<4xf32>) {38 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : vector<4xf32> to vector<2xi64>39 %0 = spirv.Bitcast %arg0 : vector<4xf32> to vector<2xi64>40 return41}42 43// -----44 45func.func @cast1(%arg0 : f32) {46 // expected-error @+1 {{result type must be different from operand type}}47 %0 = spirv.Bitcast %arg0 : f32 to f3248 return49}50 51// -----52 53func.func @cast1(%arg0 : f32) {54 // expected-error @+1 {{mismatch in result type bitwidth 64 and operand type bitwidth 32}}55 %0 = spirv.Bitcast %arg0 : f32 to i6456 return57}58 59// -----60 61func.func @cast1(%arg0 : vector<2xf32>) {62 // expected-error @+1 {{mismatch in result type bitwidth 96 and operand type bitwidth 64}}63 %0 = spirv.Bitcast %arg0 : vector<2xf32> to vector<3xf32>64 return65}66 67// -----68 69func.func @cast3(%arg0 : !spirv.ptr<f32, Function>) {70 // expected-error @+1 {{unhandled bit cast conversion from pointer type to non-pointer type}}71 %0 = spirv.Bitcast %arg0 : !spirv.ptr<f32, Function> to i6472 return73}74 75// -----76 77func.func @cast3(%arg0 : i64) {78 // expected-error @+1 {{unhandled bit cast conversion from non-pointer type to pointer type}}79 %0 = spirv.Bitcast %arg0 : i64 to !spirv.ptr<f32, Function>80 return81}82 83// -----84 85//===----------------------------------------------------------------------===//86// spirv.ConvertFToS87//===----------------------------------------------------------------------===//88 89func.func @convert_f_to_s_scalar(%arg0 : f32) -> i32 {90 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : f32 to i3291 %0 = spirv.ConvertFToS %arg0 : f32 to i3292 spirv.ReturnValue %0 : i3293}94 95// -----96 97func.func @convert_f64_to_s32_scalar(%arg0 : f64) -> i32 {98 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : f64 to i3299 %0 = spirv.ConvertFToS %arg0 : f64 to i32100 spirv.ReturnValue %0 : i32101}102 103// -----104 105func.func @convert_f_to_s_vector(%arg0 : vector<3xf32>) -> vector<3xi32> {106 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : vector<3xf32> to vector<3xi32>107 %0 = spirv.ConvertFToS %arg0 : vector<3xf32> to vector<3xi32>108 spirv.ReturnValue %0 : vector<3xi32>109}110 111// -----112 113func.func @convert_bf16_to_s32_scalar(%arg0 : bf16) -> i32 {114 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : bf16 to i32115 %0 = spirv.ConvertFToS %arg0 : bf16 to i32116 spirv.ReturnValue %0 : i32117}118 119// -----120 121//===----------------------------------------------------------------------===//122// spirv.ConvertFToU123//===----------------------------------------------------------------------===//124 125func.func @convert_f_to_u_scalar(%arg0 : f32) -> i32 {126 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : f32 to i32127 %0 = spirv.ConvertFToU %arg0 : f32 to i32128 spirv.ReturnValue %0 : i32129}130 131// -----132 133func.func @convert_f64_to_u32_scalar(%arg0 : f64) -> i32 {134 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : f64 to i32135 %0 = spirv.ConvertFToU %arg0 : f64 to i32136 spirv.ReturnValue %0 : i32137}138 139// -----140 141func.func @convert_f_to_u_vector(%arg0 : vector<3xf32>) -> vector<3xi32> {142 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : vector<3xf32> to vector<3xi32>143 %0 = spirv.ConvertFToU %arg0 : vector<3xf32> to vector<3xi32>144 spirv.ReturnValue %0 : vector<3xi32>145}146 147// -----148 149func.func @convert_f_to_u.coopmatrix(%arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB>) {150 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB> to !spirv.coopmatrix<8x16xi32, Subgroup, MatrixB>151 %0 = spirv.ConvertFToU %arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixB> to !spirv.coopmatrix<8x16xi32, Subgroup, MatrixB>152 spirv.Return153}154 155// -----156 157func.func @convert_bf16_to_u32_scalar(%arg0 : bf16) -> i32 {158 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : bf16 to i32159 %0 = spirv.ConvertFToU %arg0 : bf16 to i32160 spirv.ReturnValue %0 : i32161}162 163// -----164 165//===----------------------------------------------------------------------===//166// spirv.ConvertSToF167//===----------------------------------------------------------------------===//168 169func.func @convert_s_to_f_scalar(%arg0 : i32) -> f32 {170 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : i32 to f32171 %0 = spirv.ConvertSToF %arg0 : i32 to f32172 spirv.ReturnValue %0 : f32173}174 175// -----176 177func.func @convert_s64_to_f32_scalar(%arg0 : i64) -> f32 {178 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : i64 to f32179 %0 = spirv.ConvertSToF %arg0 : i64 to f32180 spirv.ReturnValue %0 : f32181}182 183// -----184 185func.func @convert_s_to_f_vector(%arg0 : vector<3xi32>) -> vector<3xf32> {186 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : vector<3xi32> to vector<3xf32>187 %0 = spirv.ConvertSToF %arg0 : vector<3xi32> to vector<3xf32>188 spirv.ReturnValue %0 : vector<3xf32>189}190 191// -----192 193func.func @convert_s32_to_bf16_scalar(%arg0 : i32) -> bf16 {194 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : i32 to bf16195 %0 = spirv.ConvertSToF %arg0 : i32 to bf16196 spirv.ReturnValue %0 : bf16197}198 199// -----200 201//===----------------------------------------------------------------------===//202// spirv.ConvertUToF203//===----------------------------------------------------------------------===//204 205func.func @convert_u_to_f_scalar(%arg0 : i32) -> f32 {206 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : i32 to f32207 %0 = spirv.ConvertUToF %arg0 : i32 to f32208 spirv.ReturnValue %0 : f32209}210 211// -----212 213func.func @convert_u64_to_f32_scalar(%arg0 : i64) -> f32 {214 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : i64 to f32215 %0 = spirv.ConvertUToF %arg0 : i64 to f32216 spirv.ReturnValue %0 : f32217}218 219// -----220 221func.func @convert_u_to_f_vector(%arg0 : vector<3xi32>) -> vector<3xf32> {222 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : vector<3xi32> to vector<3xf32>223 %0 = spirv.ConvertUToF %arg0 : vector<3xi32> to vector<3xf32>224 spirv.ReturnValue %0 : vector<3xf32>225}226 227// -----228 229func.func @convert_u32_to_bf16_scalar(%arg0 : i32) -> bf16 {230 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : i32 to bf16231 %0 = spirv.ConvertUToF %arg0 : i32 to bf16232 spirv.ReturnValue %0 : bf16233}234 235// -----236 237//===----------------------------------------------------------------------===//238// spirv.FConvert239//===----------------------------------------------------------------------===//240 241func.func @f_convert_scalar(%arg0 : f32) -> f64 {242 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : f32 to f64243 %0 = spirv.FConvert %arg0 : f32 to f64244 spirv.ReturnValue %0 : f64245}246 247// -----248 249func.func @f_convert_vector(%arg0 : vector<3xf32>) -> vector<3xf64> {250 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : vector<3xf32> to vector<3xf64>251 %0 = spirv.FConvert %arg0 : vector<3xf32> to vector<3xf64>252 spirv.ReturnValue %0 : vector<3xf64>253}254 255// -----256 257func.func @f_convert_coop_matrix(%arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>) {258 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> to !spirv.coopmatrix<8x16xf64, Subgroup, MatrixA>259 %0 = spirv.FConvert %arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> to !spirv.coopmatrix<8x16xf64, Subgroup, MatrixA>260 spirv.Return261}262 263// -----264 265func.func @f_convert_vector(%arg0 : f32) -> f32 {266 // expected-error @+1 {{expected the different bit widths for operand type and result type, but provided 'f32' and 'f32'}}267 %0 = spirv.FConvert %arg0 : f32 to f32268 spirv.ReturnValue %0 : f32269}270 271// -----272 273func.func @f_convert_bf16_to_f32_scalar(%arg0 : bf16) -> f32 {274 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : bf16 to f32275 %0 = spirv.FConvert %arg0 : bf16 to f32276 spirv.ReturnValue %0 : f32277}278 279// -----280 281func.func @f_convert_f32_to_bf16_vector(%arg0 : vector<3xf32>) -> vector<3xbf16> {282 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : vector<3xf32> to vector<3xbf16>283 %0 = spirv.FConvert %arg0 : vector<3xf32> to vector<3xbf16>284 spirv.ReturnValue %0 : vector<3xbf16>285}286 287// -----288 289func.func @f_convert_f32_to_bf16_coop_matrix(%arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA>) -> !spirv.coopmatrix<8x16xbf16, Subgroup, MatrixA> {290 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> to !spirv.coopmatrix<8x16xbf16, Subgroup, MatrixA>291 %0 = spirv.FConvert %arg0 : !spirv.coopmatrix<8x16xf32, Subgroup, MatrixA> to !spirv.coopmatrix<8x16xbf16, Subgroup, MatrixA>292 spirv.ReturnValue %0 : !spirv.coopmatrix<8x16xbf16, Subgroup, MatrixA>293}294 295// -----296 297//===----------------------------------------------------------------------===//298// spirv.SConvert299//===----------------------------------------------------------------------===//300 301func.func @s_convert_scalar(%arg0 : i32) -> i64 {302 // CHECK: {{%.*}} = spirv.SConvert {{%.*}} : i32 to i64303 %0 = spirv.SConvert %arg0 : i32 to i64304 spirv.ReturnValue %0 : i64305}306 307// -----308 309//===----------------------------------------------------------------------===//310// spirv.UConvert311//===----------------------------------------------------------------------===//312 313func.func @u_convert_scalar(%arg0 : i32) -> i64 {314 // CHECK: {{%.*}} = spirv.UConvert {{%.*}} : i32 to i64315 %0 = spirv.UConvert %arg0 : i32 to i64316 spirv.ReturnValue %0 : i64317}318 319// -----320 321//===----------------------------------------------------------------------===//322// spirv.PtrCastToGeneric323//===----------------------------------------------------------------------===//324 325func.func @ptrcasttogeneric1(%arg0 : !spirv.ptr<f32, CrossWorkgroup>) {326 // CHECK: {{%.*}} = spirv.PtrCastToGeneric {{%.*}} : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<f32, Generic>327 %0 = spirv.PtrCastToGeneric %arg0 : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<f32, Generic>328 return329}330// -----331 332func.func @ptrcasttogeneric2(%arg0 : !spirv.ptr<f32, StorageBuffer>) {333 // expected-error @+1 {{pointer must point to the Workgroup, CrossWorkgroup, or Function Storage Class}}334 %0 = spirv.PtrCastToGeneric %arg0 : !spirv.ptr<f32, StorageBuffer> to !spirv.ptr<f32, Generic>335 return336}337 338// -----339 340func.func @ptrcasttogeneric3(%arg0 : !spirv.ptr<f32, CrossWorkgroup>) {341 // expected-error @+1 {{result type must be of storage class Generic}}342 %0 = spirv.PtrCastToGeneric %arg0 : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<f32, Uniform>343 return344}345 346// -----347 348func.func @ptrcasttogeneric4(%arg0 : !spirv.ptr<f32, CrossWorkgroup>) {349 // expected-error @+1 {{pointee type must have the same as the op result type}}350 %0 = spirv.PtrCastToGeneric %arg0 : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<vector<2xi32>, Generic>351 return352}353 354// -----355 356//===----------------------------------------------------------------------===//357// spirv.GenericCastToPtr358//===----------------------------------------------------------------------===//359 360func.func @genericcasttoptr1(%arg0 : !spirv.ptr<vector<2xi32>, Generic>) {361 // CHECK: {{%.*}} = spirv.GenericCastToPtr {{%.*}} : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup>362 %0 = spirv.GenericCastToPtr %arg0 : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup>363 return364}365// -----366 367func.func @genericcasttoptr2(%arg0 : !spirv.ptr<f32, Uniform>) {368 // expected-error @+1 {{pointer type must be of storage class Generic}}369 %0 = spirv.GenericCastToPtr %arg0 : !spirv.ptr<f32, Uniform> to !spirv.ptr<f32, Workgroup>370 return371}372 373// -----374 375func.func @genericcasttoptr3(%arg0 : !spirv.ptr<f32, Generic>) {376 // expected-error @+1 {{result must point to the Workgroup, CrossWorkgroup, or Function Storage Class}}377 %0 = spirv.GenericCastToPtr %arg0 : !spirv.ptr<f32, Generic> to !spirv.ptr<f32, Uniform>378 return379}380 381// -----382 383func.func @genericcasttoptr4(%arg0 : !spirv.ptr<f32, Generic>) {384 // expected-error @+1 {{pointee type must have the same as the op result type}}385 %0 = spirv.GenericCastToPtr %arg0 : !spirv.ptr<f32, Generic> to !spirv.ptr<vector<2xi32>, Workgroup>386 return387}388// -----389 390//===----------------------------------------------------------------------===//391// spirv.GenericCastToPtrExplicit392//===----------------------------------------------------------------------===//393 394func.func @genericcasttoptrexplicit1(%arg0 : !spirv.ptr<vector<2xi32>, Generic>) {395 // CHECK: {{%.*}} = spirv.GenericCastToPtrExplicit {{%.*}} : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup>396 %0 = spirv.GenericCastToPtrExplicit %arg0 : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup>397 return398}399// -----400 401func.func @genericcasttoptrexplicit2(%arg0 : !spirv.ptr<f32, Uniform>) {402 // expected-error @+1 {{pointer type must be of storage class Generic}}403 %0 = spirv.GenericCastToPtrExplicit %arg0 : !spirv.ptr<f32, Uniform> to !spirv.ptr<f32, Workgroup>404 return405}406 407// -----408 409func.func @genericcasttoptrexplicit3(%arg0 : !spirv.ptr<f32, Generic>) {410 // expected-error @+1 {{result must point to the Workgroup, CrossWorkgroup, or Function Storage Class}}411 %0 = spirv.GenericCastToPtrExplicit %arg0 : !spirv.ptr<f32, Generic> to !spirv.ptr<f32, Uniform>412 return413}414 415// -----416 417func.func @genericcasttoptrexplicit4(%arg0 : !spirv.ptr<f32, Generic>) {418 // expected-error @+1 {{pointee type must have the same as the op result type}}419 %0 = spirv.GenericCastToPtrExplicit %arg0 : !spirv.ptr<f32, Generic> to !spirv.ptr<vector<2xi32>, Workgroup>420 return421}422 423// -----424 425//===----------------------------------------------------------------------===//426// spirv.ConvertPtrToU427//===----------------------------------------------------------------------===//428spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses], []> {429 spirv.func @covert_ptr_to_u(%arg0 : !spirv.ptr<i32, Generic>) "None" {430 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, Generic> to i32431 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i32432 spirv.Return433 }434 spirv.func @covert_ptr_to_u_truncate(%arg0 : !spirv.ptr<i64, Generic>) "None" {435 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i64, Generic> to i32436 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i64, Generic> to i32437 spirv.Return438 }439 spirv.func @covert_ptr_to_u_extend(%arg0 : !spirv.ptr<i32, Generic>) "None" {440 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, Generic> to i64441 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i64442 spirv.Return443 }444}445 446// -----447 448spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> {449 spirv.func @covert_ptr_to_u_PhysicalStorageBuffer(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Aliased> }) "None" {450 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, PhysicalStorageBuffer> to i32451 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> to i32452 spirv.Return453 }454}455 456// -----457 458spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> {459 spirv.func @covert_ptr_to_u_fail(%arg0 : !spirv.ptr<i32, Generic>) "None" {460 // expected-error @+1 {{operand must be a physical pointer}}461 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i32462 spirv.Return463 }464}465 466// -----467 468spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {469 spirv.func @covert_ptr_to_u_fail_2(%arg0 : !spirv.ptr<i32, Generic>) "None" {470 // expected-error @+1 {{operand must be a physical pointer}}471 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i32472 spirv.Return473 }474}475 476// -----477 478//===----------------------------------------------------------------------===//479// spirv.ConvertUToPtr480//===----------------------------------------------------------------------===//481spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses], []> {482 spirv.func @covert_u_to_ptr(%arg0 : i32) "None" {483 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i32, Generic> 484 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, Generic>485 spirv.Return486 }487 spirv.func @covert_u_to_ptr_truncate(%arg0 : i64) "None" {488 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i64 to !spirv.ptr<i32, Generic> 489 %0 = spirv.ConvertUToPtr %arg0 : i64 to !spirv.ptr<i32, Generic>490 spirv.Return491 }492 spirv.func @covert_u_to_ptr_extend(%arg0 : i32) "None" {493 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i64, Generic> 494 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i64, Generic>495 spirv.Return496 }497}498 499// -----500 501spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> {502 spirv.func @covert_u_to_ptr_PhysicalStorageBuffer(%arg0 : i32) "None" {503 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i32, PhysicalStorageBuffer>504 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, PhysicalStorageBuffer>505 spirv.Return506 }507}508 509// -----510 511spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> {512 spirv.func @covert_u_to_ptr_fail(%arg0 : i32) "None" {513 // expected-error @+1 {{result must be a physical pointer}}514 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, Generic>515 spirv.Return516 }517}518 519// -----520 521spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {522 spirv.func @covert_u_to_ptr_fail_2(%arg0 : i32) "None" {523 // expected-error @+1 {{result must be a physical pointer}}524 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, Generic>525 spirv.Return526 }527}528