1; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s 2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 3 4; CHECK-DAG: %[[#IMPORT:]] = OpExtInstImport "OpenCL.std" 5 6; CHECK-DAG: OpName %[[#CALL1:]] "call1" 7; CHECK-DAG: OpName %[[#CALL2:]] "call2" 8; CHECK-DAG: OpName %[[#CALL3:]] "call3" 9; CHECK-DAG: OpName %[[#CALL4:]] "call4" 10; CHECK-DAG: OpName %[[#CALL5:]] "call5" 11 12; CHECK-DAG: %[[#INT8:]] = OpTypeInt 8 0 13; CHECK-DAG: %[[#INT16:]] = OpTypeInt 16 0 14; CHECK-DAG: %[[#INT32:]] = OpTypeInt 32 0 15; CHECK-DAG: %[[#INT64:]] = OpTypeInt 64 0 16; CHECK-DAG: %[[#FLOAT:]] = OpTypeFloat 32 17; CHECK-DAG: %[[#VINT8:]] = OpTypeVector %[[#INT8]] 2 18; CHECK-DAG: %[[#VINT16:]] = OpTypeVector %[[#INT16]] 2 19; CHECK-DAG: %[[#VINT32:]] = OpTypeVector %[[#INT32]] 2 20; CHECK-DAG: %[[#VINT64:]] = OpTypeVector %[[#INT64]] 2 21; CHECK-DAG: %[[#VFLOAT:]] = OpTypeVector %[[#FLOAT]] 2 22; CHECK-DAG: %[[#PTRINT8:]] = OpTypePointer CrossWorkgroup %[[#INT8]] 23; CHECK-DAG: %[[#PTRINT16:]] = OpTypePointer CrossWorkgroup %[[#INT16]] 24; CHECK-DAG: %[[#PTRINT32:]] = OpTypePointer CrossWorkgroup %[[#INT32]] 25; CHECK-DAG: %[[#PTRINT64:]] = OpTypePointer CrossWorkgroup %[[#INT64]] 26; CHECK-DAG: %[[#PTRFLOAT:]] = OpTypePointer CrossWorkgroup %[[#FLOAT]] 27 28; CHECK: %[[#OFFSET:]] = OpFunctionParameter %[[#INT64]] 29 30define spir_kernel void @test_fn(i64 %offset, ptr addrspace(1) %address) { 31; CHECK-DAG: %[[#CASTorPARAMofPTRI8:]] = {{OpBitcast|OpFunctionParameter}}{{.*}}%[[#PTRINT8]]{{.*}} 32; CHECK-DAG: %[[#CALL1]] = OpExtInst %[[#VINT8]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#CASTorPARAMofPTRI8]] 2 33 %call1 = call spir_func <2 x i8> @_Z6vload2mPU3AS1Kc(i64 %offset, ptr addrspace(1) %address) 34; CHECK-DAG: %[[#CASTorPARAMofPTRI16:]] = {{OpBitcast|OpFunctionParameter}}{{.*}}%[[#PTRINT16]]{{.*}} 35; CHECK-DAG: %[[#CALL2]] = OpExtInst %[[#VINT16]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#CASTorPARAMofPTRI16]] 2 36 %call2 = call spir_func <2 x i16> @_Z6vload2mPU3AS1Ks(i64 %offset, ptr addrspace(1) %address) 37; CHECK-DAG: %[[#CASTorPARAMofPTRI32:]] = {{OpBitcast|OpFunctionParameter}}{{.*}}%[[#PTRINT32]]{{.*}} 38; CHECK-DAG: %[[#CALL3]] = OpExtInst %[[#VINT32]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#CASTorPARAMofPTRI32]] 2 39 %call3 = call spir_func <2 x i32> @_Z6vload2mPU3AS1Ki(i64 %offset, ptr addrspace(1) %address) 40; CHECK-DAG: %[[#CASTorPARAMofPTRI64:]] = {{OpBitcast|OpFunctionParameter}}{{.*}}%[[#PTRINT64]]{{.*}} 41; CHECK-DAG: %[[#CALL4]] = OpExtInst %[[#VINT64]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#CASTorPARAMofPTRI64]] 2 42 %call4 = call spir_func <2 x i64> @_Z6vload2mPU3AS1Kl(i64 %offset, ptr addrspace(1) %address) 43; CHECK-DAG: %[[#CASTorPARAMofPTRFLOAT:]] = {{OpBitcast|OpFunctionParameter}}{{.*}}%[[#PTRFLOAT]]{{.*}} 44; CHECK-DAG: %[[#CALL5]] = OpExtInst %[[#VFLOAT]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#CASTorPARAMofPTRFLOAT]] 2 45 %call5 = call spir_func <2 x float> @_Z6vload2mPU3AS1Kf(i64 %offset, ptr addrspace(1) %address) 46 ret void 47} 48 49declare spir_func <2 x i8> @_Z6vload2mPU3AS1Kc(i64, ptr addrspace(1)) 50declare spir_func <2 x i16> @_Z6vload2mPU3AS1Ks(i64, ptr addrspace(1)) 51declare spir_func <2 x i32> @_Z6vload2mPU3AS1Ki(i64, ptr addrspace(1)) 52declare spir_func <2 x i64> @_Z6vload2mPU3AS1Kl(i64, ptr addrspace(1)) 53declare spir_func <2 x float> @_Z6vload2mPU3AS1Kf(i64, ptr addrspace(1)) 54