Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Structs with no members segfault #5

Closed
emberian opened this issue Jul 27, 2018 · 2 comments
Closed

Structs with no members segfault #5

emberian opened this issue Jul 27, 2018 · 2 comments
Assignees

Comments

@emberian
Copy link

calcShaderBlockSize does getStructMemberType(0) but there's no members! Shader triggering this is attached. (It has other problems)

; 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 %push_constants "push_constants"
               OpName %push_constant_struct_ptr "push_constant_struct_ptr"
               OpName %struct "struct"
               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
     %struct = OpTypeStruct
%push_constant_struct_ptr = OpTypePointer PushConstant %struct
  %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
%push_constants = OpVariable %push_constant_struct_ptr PushConstant
%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
@emberian
Copy link
Author

backtrace from a RelWithDebInfo:

Program received signal SIGSEGV, Segmentation fault.
0x000055555587f337 in SPIRV::SPIRVTypeStruct::getMemberType (I=0, this=0x555558b0f1c0)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/libSPIRV/SPIRVType.h:640
640         return static_cast<SPIRVType *>(getEntry(MemberTypeIdVec[I]));
(gdb) where
#0  0x000055555587f337 in SPIRV::SPIRVTypeStruct::getMemberType (I=0, this=0x555558b0f1c0)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/libSPIRV/SPIRVType.h:640
#1  SPIRV::SPIRVType::getStructMemberType (this=0x555558b0f1c0, Index=0)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/libSPIRV/SPIRVType.cpp:106
#2  0x00005555557b22fd in SPIRV::SPIRVToLLVM::calcShaderBlockSize (this=this@entry=0x7fffffffa850,
    BT=BT@entry=0x555558b0f1c0, BlockSize=BlockSize@entry=0, MatrixStride=MatrixStride@entry=4294967295,
    IsRowMajor=IsRowMajor@entry=false) at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:4512
#3  0x00005555557c0f6c in SPIRV::SPIRVToLLVM::transShaderDecoration (this=this@entry=0x7fffffffa850,
    BV=BV@entry=0x55555ac27f00, V=V@entry=0x555557a3c868)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:4358
#4  0x00005555557c11ff in SPIRV::SPIRVToLLVM::transDecoration (this=0x7fffffffa850, BV=0x55555ac27f00, V=0x555557a3c868)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:3883
#5  0x00005555557c71b5 in SPIRV::SPIRVToLLVM::transValue (this=this@entry=0x7fffffffa850, BV=0x55555ac27f00,
    F=F@entry=0x0, BB=BB@entry=0x0, CreatePlaceHolder=CreatePlaceHolder@entry=true)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:1096
#6  0x00005555557d07fe in SPIRV::SPIRVToLLVM::translate (this=this@entry=0x7fffffffa850,
    EntryExecModel=EntryExecModel@entry=spv::ExecutionModelGLCompute,
    EntryName=EntryName@entry=0x555557673aa8 <EntryTarget+168> "main")
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:3818
#7  0x00005555557d0e7f in llvm::readSpirv (C=..., IS=...,
    EntryExecModel=EntryExecModel@entry=spv::ExecutionModelGLCompute,
    EntryName=EntryName@entry=0x555557673aa8 <EntryTarget+168> "main", SpecConstMap=std::map with 0 elements,
    M=@0x7fffffffaf98: 0x555557763540, ErrMsg="", forceLoopUnrollCount=0)
    at /home/cmr/proj/vulkandriver/drivers/llpc/translator/SPIRVReader.cpp:5484
#8  0x0000555555731fa4 in Llpc::Compiler::TranslateSpirvToLlvm (this=this@entry=0x555557719890,
    pSpirvBin=<optimized out>, pSpirvBin@entry=0x55555acbef48, shaderStage=shaderStage@entry=Llpc::ShaderStageCompute,
    pEntryTarget=0x555557673aa8 <EntryTarget+168> "main", pSpecializationInfo=0x0,
    pContext=pContext@entry=0x55555771d5f0, forceLoopUnrollCount=0, ppModule=0x7fffffffaf98)
    at /home/cmr/proj/vulkandriver/drivers/llpc/context/llpcCompiler.cpp:1631
#9  0x00005555557372b2 in Llpc::Compiler::BuildComputePipelineInternal (this=this@entry=0x555557719890,
    pComputeContext=pComputeContext@entry=0x7fffffffb1a0, pPipelineInfo=pPipelineInfo@entry=0x7fffffffde00,
    forceLoopUnrollCount=forceLoopUnrollCount@entry=0, pPipelineElf=pPipelineElf@entry=0x7fffffffc100,
    pDynamicLoopUnroll=pDynamicLoopUnroll@entry=0x7fffffffb110)
    at /home/cmr/proj/vulkandriver/drivers/llpc/context/llpcCompiler.cpp:1127
#10 0x0000555555738657 in Llpc::Compiler::BuildComputePipeline (this=0x555557719890, pPipelineInfo=0x7fffffffde00,
    pPipelineOut=0x7fffffffde78) at /home/cmr/proj/vulkandriver/drivers/llpc/context/llpcCompiler.cpp:1410
#11 0x00005555556d832d in BuildPipeline (pCompileInfo=0x7fffffffda30, pCompiler=0x555557719890)
    at /home/cmr/proj/vulkandriver/drivers/llpc/tool/amdllpc.cpp:828
#12 main (argc=<optimized out>, argv=<optimized out>) at /home/cmr/proj/vulkandriver/drivers/llpc/tool/amdllpc.cpp:1194

@linqun linqun self-assigned this Jul 28, 2018
@linqun
Copy link
Member

linqun commented Jul 28, 2018

Reproduced. there are 3 issues.

  • decoration Offset and ArrayStride are missed in your shader source. please add following code in your source code.
    OpMemberDecorate %struct_0 0 Offset 0
    OpMemberDecorate %struct_1 0 Offset 0
    OpMemberDecorate %struct_1 1 Offset 4
    OpDecorate %u32_array_runtime_array ArrayStride 128
    OpDecorate %u32_array ArrayStride 4
  • calcShaderBlockSize doesn't handle Structs with no members, please try to add following code in calcShaderBlockSize
    if (BT->isTypeStruct()) {
  • if (BT->getStructMemberCount() == 0)
  • BlockSize = 0;
    
  • else {
  • the order of lower pass in incorrect. please move pass SpirvLowerAccessChain after pass PassDeadFuncRemove in llpcSpirvLower.cpp

    // Function inlining
    passMgr.add(createFunctionInliningPass(InlineThreshold));
    passMgr.add(PassDeadFuncRemove::Create());

  • // Lower SPIR-V access chain
  • passMgr.add(SpirvLowerAccessChain::Create());
  • after apply these three changes, this shader is passed in my local machine.

PS: I will send out the pull request next week.

nhaehnle pushed a commit to nhaehnle/llpc that referenced this issue Apr 7, 2020
…force stg

  Issue: GPUOpen-Drivers#5
  Pull Requests: GPUOpen-Drivers#6
                 GPUOpen-Drivers#7
  Commits: d7347c5
           06a82c0

  pull request 6 introduces a regression, pull request 7 fixed it.

git-pf-change: stg@1588028
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants