KhronosGroup / KhronosGroup/SPIRV-Tools

Validator should catch structure members without offset decorations

Open
#1,737 0 comments 0 reactions 0 assignees View on GitHub
component:optimization
Dominant language
C++
Stars
1.4k
Forks
709
Avg merge
1d 22h
Merged PRs (30d)
28

Description

Shader that validates that shouldn't (not very minimal, I'm sorry):

```
; SPIR-V
; Version: 1.2
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 165
; Schema: 0
OpCapability Shader
OpExtension "SPV_KHR_storage_buffer_storage_class"
OpMemoryModel Logical Simple
OpEntryPoint GLCompute %main "main"
OpExecutionMode %main LocalSize 1 1 1
OpName %fn_return "fn_return"
OpName %anonymous_36 "anonymous_36"
OpName %anonymous_35 "anonymous_35"
OpName %anonymous_34 "anonymous_34"
OpName %anonymous_33 "anonymous_33"
OpName %anonymous_32 "anonymous_32"
OpName %anonymous_31 "anonymous_31"
OpName %storage_buffer_u32_array_runtime_array_ptr "storage_buffer_u32_array_runtime_array_ptr"
OpName %id "id"
OpName %anonymous_30 "anonymous_30"
OpName %input_u32_ptr "input_u32_ptr"
OpName %fn_start_3 "fn_start_3"
OpName %main "main"
OpName %fn_2 "fn_2"
OpName %x_2 "x_2"
OpName %y_ptr_2 "y_ptr_2"
OpName %x_ptr_2 "x_ptr_2"
OpName %cond_3 "cond_3"
OpName %var_9 "var_9"
OpName %var_8 "var_8"
OpName %loop_after_3 "loop_after_3"
OpName %loop_continue_3 "loop_continue_3"
OpName %loop_body_3 "loop_body_3"
OpName %loop_merge_3 "loop_merge_3"
OpName %loop_header_3 "loop_header_3"
OpName %anonymous_29 "anonymous_29"
OpName %fn_start_2 "fn_start_2"
OpName %bignum_copy_storage_buffer_storage_buffer_storage_buffer "bignum_copy_storage_buffer_storage_buffer_storage_buffer"
OpName %fn_1 "fn_1"
OpName %bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0 "bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0"
OpName %bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_1 "bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_1"
OpName %bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_0 "bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_0"
OpName %w_ptr_0 "w_ptr_0"
OpName %anonymous_28 "anonymous_28"
OpName %k_in_j_loop "k_in_j_loop"
OpName %anonymous_27 "anonymous_27"
OpName %anonymous_26 "anonymous_26"
OpName %anonymous_25 "anonymous_25"
OpName %anonymous_24 "anonymous_24"
OpName %anonymous_23 "anonymous_23"
OpName %anonymous_22 "anonymous_22"
OpName %anonymous_21 "anonymous_21"
OpName %anonymous_20 "anonymous_20"
OpName %anonymous_19 "anonymous_19"
OpName %anonymous_18 "anonymous_18"
OpName %anonymous_17 "anonymous_17"
OpName %w "w"
OpName %w_ptr "w_ptr"
OpName %x_1 "x_1"
OpName %x_ptr_1 "x_ptr_1"
OpName %k "k"
OpName %anonymous_16 "anonymous_16"
OpName %cond_2 "cond_2"
OpName %var_7 "var_7"
OpName %var_6 "var_6"
OpName %loop_after_2 "loop_after_2"
OpName %loop_continue_2 "loop_continue_2"
OpName %loop_body_2 "loop_body_2"
OpName %loop_merge_2 "loop_merge_2"
OpName %loop_header_2 "loop_header_2"
OpName %y_1 "y_1"
OpName %y_ptr_1 "y_ptr_1"
OpName %cond_1 "cond_1"
OpName %var_5 "var_5"
OpName %var_4 "var_4"
OpName %loop_after_1 "loop_after_1"
OpName %loop_continue_1 "loop_continue_1"
OpName %loop_body_1 "loop_body_1"
OpName %loop_merge_1 "loop_merge_1"
OpName %loop_header_1 "loop_header_1"
OpName %anonymous_15 "anonymous_15"
OpName %fn_start_1 "fn_start_1"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer "bignum_mul_storage_buffer_storage_buffer_storage_buffer"
OpName %fn_0 "fn_0"
OpName %void "void"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_2 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_2"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_1 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_1"
OpName %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_0 "bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_0"
OpName %return_borrow "return borrow"
OpName %r_ptr_0 "r_ptr_0"
OpName %anonymous_14 "anonymous_14"
OpName %anonymous_13 "anonymous_13"
OpName %anonymous_12 "anonymous_12"
OpName %anonymous_11 "anonymous_11"
OpName %borrow "borrow"
OpName %anonymous_10 "anonymous_10"
OpName %anonymous_9 "anonymous_9"
OpName %anonymous_8 "anonymous_8"
OpName %y_0 "y_0"
OpName %y_ptr_0 "y_ptr_0"
OpName %x_0 "x_0"
OpName %x_ptr_0 "x_ptr_0"
OpName %cond_0 "cond_0"
OpName %var_3 "var_3"
OpName %var_2 "var_2"
OpName %loop_after_0 "loop_after_0"
OpName %loop_continue_0 "loop_continue_0"
OpName %loop_body_0 "loop_body_0"
OpName %loop_merge_0 "loop_merge_0"
OpName %loop_header_0 "loop_header_0"
OpName %anonymous_7 "anonymous_7"
OpName %fn_start_0 "fn_start_0"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer "bignum_sub_storage_buffer_storage_buffer_storage_buffer"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1 "bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0 "bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_2 "bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_2"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_1 "bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_1"
OpName %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_0 "bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_0"
OpName %return_carry "return_carry"
OpName %r_ptr "r_ptr"
OpName %anonymous_6 "anonymous_6"
OpName %anonymous_5 "anonymous_5"
OpName %anonymous_4 "anonymous_4"
OpName %anonymous_3 "anonymous_3"
OpName %carry "carry"
OpName %anonymous_2 "anonymous_2"
OpName %anonymous_1 "anonymous_1"
OpName %anonymous_0 "anonymous_0"
OpName %struct_1 "struct_1"
OpName %y "y"
OpName %y_ptr "y_ptr"
OpName %x "x"
OpName %x_ptr "x_ptr"
OpName %storage_buffer_u32_ptr "storage_buffer_u32_ptr"
OpName %cond "cond"
OpName %var_1 "var_1"
OpName %var_0 "var_0"
OpName %loop_after "loop_after"
OpName %loop_continue "loop_continue"
OpName %loop_body "loop_body"
OpName %loop_merge "loop_merge"
OpName %loop_header "loop_header"
OpName %bool "bool"
OpName %anonymous "anonymous"
OpName %fn_start "fn_start"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer "bignum_add_storage_buffer_storage_buffer_storage_buffer"
OpName %fn "fn"
OpName %function_u32_ptr "function_u32_ptr"
OpName %storage_buffer_u32_array_ptr "storage_buffer_u32_array_ptr"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1 "bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0 "bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_2 "bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_2"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_1 "bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_1"
OpName %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_0 "bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_0"
OpName %c_u32_1 "c_u32_1"
OpName %c_u32_0 "c_u32_0"
OpName %descriptor_set_0_0 "descriptor_set_0_0"
OpName %descriptor_set_0_1 "descriptor_set_0_1"
OpName %descriptor_set_0_2 "descriptor_set_0_2"
OpName %storage_buffer_struct_ptr "storage_buffer_struct_ptr"
OpName %struct_0 "struct_0"
OpName %u32_array_runtime_array "u32_array_runtime_array"
OpName %u32_array "u32_array"
OpName %global_invocation "global_invocation"
OpName %input_vector_ptr "input_vector_ptr"
OpName %vector "vector"
OpName %u32 "u32"
OpDecorate %descriptor_set_0_0 Binding 0
OpDecorate %descriptor_set_0_0 DescriptorSet 0
OpDecorate %descriptor_set_0_1 Binding 1
OpDecorate %descriptor_set_0_1 DescriptorSet 0
OpDecorate %descriptor_set_0_2 Binding 2
OpDecorate %descriptor_set_0_2 DescriptorSet 0
OpDecorate %global_invocation BuiltIn GlobalInvocationId
%u32 = OpTypeInt 32 0
%164 = OpSpecConstant %u32 24
%vector = OpTypeVector %u32 3
%input_vector_ptr = OpTypePointer Input %vector
%u32_array = OpTypeArray %u32 %164
%u32_array_runtime_array = OpTypeRuntimeArray %u32_array
%struct_0 = OpTypeStruct %u32_array_runtime_array
%storage_buffer_struct_ptr = OpTypePointer StorageBuffer %struct_0
%storage_buffer_u32_array_ptr = OpTypePointer StorageBuffer %u32_array
%function_u32_ptr = OpTypePointer Function %u32
%fn = OpTypeFunction %u32 %storage_buffer_u32_array_ptr %storage_buffer_u32_array_ptr %storage_buffer_u32_array_ptr
%bool = OpTypeBool
%storage_buffer_u32_ptr = OpTypePointer StorageBuffer %u32
%struct_1 = OpTypeStruct %u32 %u32
%void = OpTypeVoid
%fn_0 = OpTypeFunction %void %storage_buffer_u32_array_ptr %storage_buffer_u32_array_ptr %storage_buffer_u32_array_ptr
%fn_1 = OpTypeFunction %void %storage_buffer_u32_array_ptr %storage_buffer_u32_array_ptr
%fn_2 = OpTypeFunction %void
%input_u32_ptr = OpTypePointer Input %u32
%storage_buffer_u32_array_runtime_array_ptr = OpTypePointer StorageBuffer %u32_array_runtime_array
%c_u32_0 = OpConstant %u32 0
%c_u32_1 = OpConstant %u32 1
%descriptor_set_0_0 = OpVariable %storage_buffer_struct_ptr StorageBuffer
%descriptor_set_0_1 = OpVariable %storage_buffer_struct_ptr StorageBuffer
%descriptor_set_0_2 = OpVariable %storage_buffer_struct_ptr StorageBuffer
%global_invocation = OpVariable %input_vector_ptr Input
%bignum_add_storage_buffer_storage_buffer_storage_buffer = OpFunction %u32 None %fn
%bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_0 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_1 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_2 = OpFunctionParameter %storage_buffer_u32_array_ptr
%fn_start = OpLabel
%bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0 = OpVariable %function_u32_ptr Function
%bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1 = OpVariable %function_u32_ptr Function
OpStore %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1 %c_u32_0
%anonymous = OpISub %u32 %164 %c_u32_1
OpStore %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0 %c_u32_0
OpBranch %loop_header
%loop_header = OpLabel
OpLoopMerge %loop_merge %loop_continue None
OpBranch %loop_merge
%loop_merge = OpLabel
%var_0 = OpLoad %u32 %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0
%cond = OpSLessThanEqual %bool %var_0 %anonymous
OpBranchConditional %cond %loop_body %loop_after
%loop_body = OpLabel
%x_ptr = OpAccessChain %storage_buffer_u32_ptr %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_1 %var_0
%x = OpLoad %u32 %x_ptr
%y_ptr = OpAccessChain %storage_buffer_u32_ptr %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_2 %var_0
%y = OpLoad %u32 %y_ptr
%anonymous_0 = OpIAddCarry %struct_1 %x %y
%anonymous_1 = OpCompositeExtract %u32 %anonymous_0 0
%anonymous_2 = OpCompositeExtract %u32 %anonymous_0 1
%carry = OpLoad %u32 %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1
%anonymous_3 = OpIAddCarry %struct_1 %anonymous_1 %carry
%anonymous_4 = OpCompositeExtract %u32 %anonymous_3 0
%anonymous_5 = OpCompositeExtract %u32 %anonymous_3 1
%anonymous_6 = OpBitwiseOr %u32 %anonymous_2 %anonymous_5
OpStore %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1 %anonymous_6
%r_ptr = OpAccessChain %storage_buffer_u32_ptr %bignum_add_storage_buffer_storage_buffer_storage_buffer_arg_0 %var_0
OpStore %r_ptr %anonymous_4
OpBranch %loop_continue
%loop_continue = OpLabel
%var_1 = OpIAdd %u32 %var_0 %c_u32_1
OpStore %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_0 %var_1
OpBranch %loop_header
%loop_after = OpLabel
%return_carry = OpLoad %u32 %bignum_add_storage_buffer_storage_buffer_storage_buffer_var_1
OpReturnValue %return_carry
OpFunctionEnd
%bignum_copy_storage_buffer_storage_buffer_storage_buffer = OpFunction %void None %fn_1
%bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_0 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_1 = OpFunctionParameter %storage_buffer_u32_array_ptr
%fn_start_2 = OpLabel
%bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0 = OpVariable %function_u32_ptr Function
%anonymous_29 = OpISub %u32 %164 %c_u32_1
OpStore %bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0 %c_u32_0
OpBranch %loop_header_3
%loop_header_3 = OpLabel
OpLoopMerge %loop_merge_3 %loop_continue_3 None
OpBranch %loop_merge_3
%loop_merge_3 = OpLabel
%var_8 = OpLoad %u32 %bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0
%cond_3 = OpSLessThanEqual %bool %var_8 %anonymous_29
OpBranchConditional %cond_3 %loop_body_3 %loop_after_3
%loop_body_3 = OpLabel
%x_ptr_2 = OpAccessChain %storage_buffer_u32_ptr %bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_0 %var_8
%y_ptr_2 = OpAccessChain %storage_buffer_u32_ptr %bignum_copy_storage_buffer_storage_buffer_storage_buffer_arg_1 %var_8
%x_2 = OpLoad %u32 %x_ptr_2
OpStore %y_ptr_2 %x_2
OpBranch %loop_continue_3
%loop_continue_3 = OpLabel
%var_9 = OpIAdd %u32 %var_8 %c_u32_1
OpStore %bignum_copy_storage_buffer_storage_buffer_storage_buffer_var_0 %var_9
OpBranch %loop_header_3
%loop_after_3 = OpLabel
OpReturn
OpFunctionEnd
%bignum_mul_storage_buffer_storage_buffer_storage_buffer = OpFunction %void None %fn_0
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_0 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_1 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_2 = OpFunctionParameter %storage_buffer_u32_array_ptr
%fn_start_1 = OpLabel
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0 = OpVariable %function_u32_ptr Function
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1 = OpVariable %function_u32_ptr Function
%bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2 = OpVariable %function_u32_ptr Function
%anonymous_15 = OpISub %u32 %164 %c_u32_1
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1 %c_u32_0
OpBranch %loop_header_1
%loop_header_1 = OpLabel
OpLoopMerge %loop_merge_1 %loop_continue_1 None
OpBranch %loop_merge_1
%loop_merge_1 = OpLabel
%var_4 = OpLoad %u32 %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1
%cond_1 = OpSLessThanEqual %bool %var_4 %anonymous_15
OpBranchConditional %cond_1 %loop_body_1 %loop_after_1
%loop_body_1 = OpLabel
%y_ptr_1 = OpAccessChain %storage_buffer_u32_ptr %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_2 %var_4
%y_1 = OpLoad %u32 %y_ptr_1
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2 %c_u32_0
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0 %c_u32_0
OpBranch %loop_header_2
%loop_header_2 = OpLabel
OpLoopMerge %loop_merge_2 %loop_continue_2 None
OpBranch %loop_merge_2
%loop_merge_2 = OpLabel
%var_6 = OpLoad %u32 %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0
%cond_2 = OpSLessThanEqual %bool %var_6 %anonymous_15
OpBranchConditional %cond_2 %loop_body_2 %loop_after_2
%loop_body_2 = OpLabel
%anonymous_16 = OpIAdd %u32 %var_6 %var_4
%k = OpLoad %u32 %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2
%x_ptr_1 = OpAccessChain %storage_buffer_u32_ptr %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_1 %var_6
%x_1 = OpLoad %u32 %x_ptr_1
%w_ptr = OpAccessChain %storage_buffer_u32_ptr %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_0 %anonymous_16
%w = OpLoad %u32 %w_ptr
%anonymous_17 = OpIAddCarry %struct_1 %k %w
%anonymous_18 = OpCompositeExtract %u32 %anonymous_17 0
%anonymous_19 = OpCompositeExtract %u32 %anonymous_17 1
%anonymous_20 = OpUMulExtended %struct_1 %x_1 %y_1
%anonymous_21 = OpCompositeExtract %u32 %anonymous_20 0
%anonymous_22 = OpCompositeExtract %u32 %anonymous_20 1
%anonymous_23 = OpIAddCarry %struct_1 %anonymous_21 %anonymous_18
%anonymous_24 = OpCompositeExtract %u32 %anonymous_23 0
%anonymous_25 = OpCompositeExtract %u32 %anonymous_23 1
%anonymous_26 = OpIAdd %u32 %anonymous_22 %anonymous_25
%anonymous_27 = OpIAdd %u32 %anonymous_26 %anonymous_19
OpStore %w_ptr %anonymous_24
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2 %anonymous_27
OpBranch %loop_continue_2
%loop_continue_2 = OpLabel
%var_7 = OpIAdd %u32 %var_6 %c_u32_1
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_0 %var_7
OpBranch %loop_header_2
%loop_after_2 = OpLabel
%k_in_j_loop = OpLoad %u32 %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_2
%anonymous_28 = OpIAdd %u32 %var_4 %164
%w_ptr_0 = OpAccessChain %storage_buffer_u32_ptr %bignum_mul_storage_buffer_storage_buffer_storage_buffer_arg_0 %anonymous_28
OpStore %w_ptr_0 %k_in_j_loop
OpBranch %loop_continue_1
%loop_continue_1 = OpLabel
%var_5 = OpIAdd %u32 %var_4 %c_u32_1
OpStore %bignum_mul_storage_buffer_storage_buffer_storage_buffer_var_1 %var_5
OpBranch %loop_header_1
%loop_after_1 = OpLabel
OpReturn
OpFunctionEnd
%bignum_sub_storage_buffer_storage_buffer_storage_buffer = OpFunction %u32 None %fn
%bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_0 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_1 = OpFunctionParameter %storage_buffer_u32_array_ptr
%bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_2 = OpFunctionParameter %storage_buffer_u32_array_ptr
%fn_start_0 = OpLabel
%bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0 = OpVariable %function_u32_ptr Function
%bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1 = OpVariable %function_u32_ptr Function
OpStore %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1 %c_u32_0
%anonymous_7 = OpISub %u32 %164 %c_u32_1
OpStore %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0 %c_u32_0
OpBranch %loop_header_0
%loop_header_0 = OpLabel
OpLoopMerge %loop_merge_0 %loop_continue_0 None
OpBranch %loop_merge_0
%loop_merge_0 = OpLabel
%var_2 = OpLoad %u32 %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0
%cond_0 = OpSLessThanEqual %bool %var_2 %anonymous_7
OpBranchConditional %cond_0 %loop_body_0 %loop_after_0
%loop_body_0 = OpLabel
%x_ptr_0 = OpAccessChain %storage_buffer_u32_ptr %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_1 %var_2
%x_0 = OpLoad %u32 %x_ptr_0
%y_ptr_0 = OpAccessChain %storage_buffer_u32_ptr %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_2 %var_2
%y_0 = OpLoad %u32 %y_ptr_0
%anonymous_8 = OpISubBorrow %struct_1 %x_0 %y_0
%anonymous_9 = OpCompositeExtract %u32 %anonymous_8 0
%anonymous_10 = OpCompositeExtract %u32 %anonymous_8 1
%borrow = OpLoad %u32 %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1
%anonymous_11 = OpISubBorrow %struct_1 %anonymous_9 %borrow
%anonymous_12 = OpCompositeExtract %u32 %anonymous_11 0
%anonymous_13 = OpCompositeExtract %u32 %anonymous_11 1
%anonymous_14 = OpBitwiseOr %u32 %anonymous_10 %anonymous_13
OpStore %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1 %anonymous_14
%r_ptr_0 = OpAccessChain %storage_buffer_u32_ptr %bignum_sub_storage_buffer_storage_buffer_storage_buffer_arg_0 %var_2
OpStore %r_ptr_0 %anonymous_12
OpBranch %loop_continue_0
%loop_continue_0 = OpLabel
%var_3 = OpIAdd %u32 %var_2 %c_u32_1
OpStore %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_0 %var_3
OpBranch %loop_header_0
%loop_after_0 = OpLabel
%return_borrow = OpLoad %u32 %bignum_sub_storage_buffer_storage_buffer_storage_buffer_var_1
OpReturnValue %return_borrow
OpFunctionEnd
%main = OpFunction %void None %fn_2
%fn_start_3 = OpLabel
%anonymous_30 = OpAccessChain %input_u32_ptr %global_invocation %c_u32_0
%id = OpLoad %u32 %anonymous_30
%anonymous_31 = OpAccessChain %storage_buffer_u32_array_runtime_array_ptr %descriptor_set_0_0 %c_u32_0
%anonymous_32 = OpAccessChain %storage_buffer_u32_array_runtime_array_ptr %descriptor_set_0_1 %c_u32_0
%anonymous_33 = OpAccessChain %storage_buffer_u32_array_runtime_array_ptr %descriptor_set_0_2 %c_u32_0
%anonymous_34 = OpAccessChain %storage_buffer_u32_array_ptr %anonymous_31 %id
%anonymous_35 = OpAccessChain %storage_buffer_u32_array_ptr %anonymous_32 %id
%anonymous_36 = OpAccessChain %storage_buffer_u32_array_ptr %anonymous_33 %id
%fn_return = OpFunctionCall %u32 %bignum_add_storage_buffer_storage_buffer_storage_buffer %anonymous_34 %anonymous_35 %anonymous_36
OpReturn
OpFunctionEnd
```

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the supplied SPIR-V shader with the validator and identify how structure members are checked for offset decorations. Trace the validator path for OpTypeStruct and member decorations, then add coverage showing that the supplied invalid structure is rejected with a diagnostic.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.