1; RUN: llc -verify-machineinstrs -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: %[[#INT8:]] = OpTypeInt 8 0 5; CHECK-DAG: %[[#VEC3:]] = OpTypeVector %[[#INT8]] 3 6; CHECK-DAG: %[[#VEC4:]] = OpTypeVector %[[#INT8]] 4 7; CHECK-DAG: %[[#PTR_VEC3:]] = OpTypePointer CrossWorkgroup %[[#VEC3]] 8; CHECK-DAG: %[[#PTR_VEC4:]] = OpTypePointer CrossWorkgroup %[[#VEC4]] 9 10; CHECK: %[[#AC1:]] = OpInBoundsPtrAccessChain %[[#PTR_VEC3]] %[[#]] %[[#]] 11; CHECK: %[[#BC1:]] = OpBitcast %[[#PTR_VEC4]] %[[#AC1]] 12; CHECK: %[[#LD1:]] = OpLoad %[[#VEC4]] %[[#BC1]] Aligned 4 13; CHECK: OpReturn 14 15define spir_kernel void @foo(ptr addrspace(1) %a, i64 %b) { 16 %index = getelementptr inbounds <3 x i8>, ptr addrspace(1) %a, i64 %b 17 %loadv = load <4 x i8>, ptr addrspace(1) %index, align 4 18 ret void 19} 20 21; CHECK: %[[#AC2:]] = OpInBoundsPtrAccessChain %[[#PTR_VEC3]] %[[#]] %[[#]] 22; CHECK: %[[#BC2:]] = OpBitcast %[[#PTR_VEC4]] %[[#AC2]] 23; CHECK: %[[#LD2:]] = OpLoad %[[#VEC4]] %[[#BC2]] Aligned 4 24; CHECK: OpReturn 25 26define spir_kernel void @bar(ptr addrspace(1) %a, i64 %b) { 27 %index = getelementptr inbounds <3 x i8>, ptr addrspace(1) %a, i64 %b 28; This redundant bitcast is left here itentionally to simulate the conversion 29; from older LLVM IR with typed pointers. 30 %cast = bitcast ptr addrspace(1) %index to ptr addrspace(1) 31 %loadv = load <4 x i8>, ptr addrspace(1) %cast, align 4 32 ret void 33} 34