blob: 8399cb8f31cefbc42f38173127f9cddbfa8b1f75 [file] [log] [blame] [edit]
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-pc-vulkan1.3-library %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-pc-vulkan1.3-library %s -o - -filetype=obj | spirv-val %}
; CHECK-DAG: %[[#float:]] = OpTypeFloat 32
; CHECK-DAG: %[[#vec4:]] = OpTypeVector %[[#float]] 4
; CHECK-DAG: %[[#ptr_vec4:]] = OpTypePointer Function %[[#vec4]]
; CHECK-DAG: %[[#ptr_float:]] = OpTypePointer Function %[[#float]]
; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0
; CHECK-DAG: %[[#idx_0:]] = OpConstant %[[#int]] 0
; CHECK-DAG: %[[#idx_1:]] = OpConstant %[[#int]] 1
; CHECK-DAG: %[[#idx_2:]] = OpConstant %[[#int]] 2
; CHECK-DAG: %[[#idx_5:]] = OpConstant %[[#int]] 5
; CHECK-DAG: %[[#idx_10:]] = OpConstant %[[#int]] 10
; CHECK-DAG: %[[#array_vec4:]] = OpTypeArray %[[#vec4]] %[[#idx_2]]
; CHECK-DAG: %[[#ptr_array_vec4:]] = OpTypePointer Function %[[#array_vec4]]
; CHECK-DAG: %[[#array_float:]] = OpTypeArray %[[#float]] %[[#idx_10]]
; CHECK-DAG: %[[#ptr_array_float:]] = OpTypePointer Function %[[#array_float]]
define spir_func void @vector_access(ptr %vec, ptr %out) convergent {
entry:
%0 = call token @llvm.experimental.convergence.entry()
; CHECK: %[[#vec_var:]] = OpFunctionParameter %[[#ptr_vec4]]
; CHECK: %[[#out_var:]] = OpFunctionParameter %[[#ptr_float]]
%1 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype(<4 x float>) %vec, i32 2)
; CHECK: %[[#ptr_elem:]] = OpInBoundsAccessChain %[[#ptr_float]] %[[#vec_var]] %[[#idx_2]]
%2 = load float, ptr %1, align 4
; CHECK: %[[#val:]] = OpLoad %[[#float]] %[[#ptr_elem]] Aligned 4
store float %2, ptr %out, align 4
; CHECK: OpStore %[[#out_var]] %[[#val]] Aligned 4
ret void
}
define spir_func void @array_of_vectors_access(ptr %arr, ptr %out) convergent {
entry:
%0 = call token @llvm.experimental.convergence.entry()
; CHECK: %[[#arr_var:]] = OpFunctionParameter %[[#ptr_array_vec4]]
; CHECK: %[[#out_var2:]] = OpFunctionParameter %[[#ptr_float]]
%1 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([2 x <4 x float>]) %arr, i32 1, i32 2)
; CHECK: %[[#ptr_elem2:]] = OpInBoundsAccessChain %[[#ptr_float]] %[[#arr_var]] %[[#idx_1]] %[[#idx_2]]
%2 = load float, ptr %1, align 4
; CHECK: %[[#val2:]] = OpLoad %[[#float]] %[[#ptr_elem2]] Aligned 4
store float %2, ptr %out, align 4
; CHECK: OpStore %[[#out_var2]] %[[#val2]] Aligned 4
ret void
}
define spir_func void @array_access(ptr %arr, ptr %out) convergent {
entry:
%0 = call token @llvm.experimental.convergence.entry()
; CHECK: %[[#arr_var3:]] = OpFunctionParameter %[[#ptr_array_float]]
; CHECK: %[[#out_var3:]] = OpFunctionParameter %[[#ptr_float]]
%1 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x float]) %arr, i32 0)
; CHECK: %[[#ptr_elem3_0:]] = OpInBoundsAccessChain %[[#ptr_float]] %[[#arr_var3]] %[[#idx_0]]
%2 = load float, ptr %1, align 4
; CHECK: %[[#val3_0:]] = OpLoad %[[#float]] %[[#ptr_elem3_0]] Aligned 4
%3 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x float]) %arr, i32 5)
; CHECK: %[[#ptr_elem3_5:]] = OpInBoundsAccessChain %[[#ptr_float]] %[[#arr_var3]] %[[#idx_5]]
%4 = load float, ptr %3, align 4
; CHECK: %[[#val3_5:]] = OpLoad %[[#float]] %[[#ptr_elem3_5]] Aligned 4
%5 = fadd float %2, %4
; CHECK: %[[#res:]] = OpFAdd %[[#float]] %[[#val3_0]] %[[#val3_5]]
store float %5, ptr %out, align 4
; CHECK: OpStore %[[#out_var3]] %[[#res]] Aligned 4
ret void
}
declare token @llvm.experimental.convergence.entry() #1
declare ptr @llvm.structured.gep.p0(ptr, ...) #3
attributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }