| ; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s | |
| ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} | |
| ; Make sure SPIRV operation function calls for generic_cast_to_ptr_explicit are lowered correctly. | |
| ; CHECK: %[[#Char:]] = OpTypeInt 8 0 | |
| ; CHECK: %[[#GenericPtr:]] = OpTypePointer Generic %[[#Char]] | |
| ; CHECK: %[[#GlobalPtr:]] = OpTypePointer CrossWorkgroup %[[#Char]] | |
| ; CHECK: %[[#LocalPtr:]] = OpTypePointer Workgroup %[[#Char]] | |
| ; CHECK: %[[#PrivatePtr:]] = OpTypePointer Function %[[#Char]] | |
| ; CHECK: OpFunction %[[#GlobalPtr]] | |
| ; CHECK-NEXT: %[[#Arg:]] = OpFunctionParameter %[[#GenericPtr]] | |
| ; CHECK-NEXT: OpLabel | |
| ; CHECK-NEXT: OpGenericCastToPtrExplicit %[[#GlobalPtr]] %[[#Arg]] CrossWorkgroup | |
| define ptr addrspace(1) @test_to_global(ptr addrspace(4) noundef %ptr) { | |
| entry: | |
| %cast = call spir_func noundef ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit.p1(ptr addrspace(4) noundef %ptr) | |
| ret ptr addrspace(1) %cast | |
| } | |
| ; CHECK: OpFunction %[[#LocalPtr]] | |
| ; CHECK-NEXT: %[[#Arg:]] = OpFunctionParameter %[[#GenericPtr]] | |
| ; CHECK-NEXT: OpLabel | |
| ; CHECK-NEXT: OpGenericCastToPtrExplicit %[[#LocalPtr]] %[[#Arg]] Workgroup | |
| define ptr addrspace(3) @test_to_local(ptr addrspace(4) noundef %ptr) { | |
| entry: | |
| %cast = call spir_func noundef ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit.p3(ptr addrspace(4) noundef %ptr) | |
| ret ptr addrspace(3) %cast | |
| } | |
| ; CHECK: OpFunction %[[#PrivatePtr]] | |
| ; CHECK-NEXT: %[[#Arg:]] = OpFunctionParameter %[[#GenericPtr]] | |
| ; CHECK-NEXT: OpLabel | |
| ; CHECK-NEXT: OpGenericCastToPtrExplicit %[[#PrivatePtr]] %[[#Arg]] Function | |
| define ptr @test_to_private(ptr addrspace(4) noundef %ptr) { | |
| entry: | |
| %cast = call spir_func noundef ptr @llvm.spv.generic.cast.to.ptr.explicit.p0(ptr addrspace(4) noundef %ptr) | |
| ret ptr %cast | |
| } | |
| declare noundef ptr @llvm.spv.generic.cast.to.ptr.explicit.p0(ptr addrspace(4)) | |
| declare noundef ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit.p1(ptr addrspace(4)) | |
| declare noundef ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit.p3(ptr addrspace(4)) |