Files
wgpu/naga/tests/out/spv/access.spvasm
Jim Blandy 1b09a44af5 [naga spv-out] Avoid duplicating SPIR-V OpTypePointer instructions.
Simplify `naga::back::spv::LocalType` to have only one variant for
representing pointers, and use the SPIR-V type as the base type, so
that `LocalType` values are equal when the SPIR-V pointer types they
map to would be equal as well.

This avoids emitting multiple `OpTypePointer` instructions, which
SPIR-V would interpret as distinct types, for equivalent Naga IR
pointer types.

Change the `get_pointer_type_id` utility function accordingly, and
adjust its callers.

Change `LocalType::from_inner` into `Writer::localtype_from_inner`, so
that it can call `Writer` methods to build base types. Adjust users.
2025-03-06 09:58:25 -08:00

1067 lines
26 KiB
Plaintext

; SPIR-V
; Version: 1.1
; Generator: rspirv
; Bound: 402
OpCapability Shader
OpExtension "SPV_KHR_storage_buffer_storage_class"
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %311 "foo_vert" %306 %309
OpEntryPoint Fragment %363 "foo_frag" %362
OpEntryPoint GLCompute %381 "assign_through_ptr"
OpEntryPoint GLCompute %392 "assign_to_ptr_components"
OpExecutionMode %363 OriginUpperLeft
OpExecutionMode %381 LocalSize 1 1 1
OpExecutionMode %392 LocalSize 1 1 1
%3 = OpString "access.wgsl"
OpSource Unknown 0 %3 "// This snapshot tests accessing various containers, dereferencing pointers.
struct GlobalConst {
a: u32,
b: vec3<u32>,
c: i32,
}
// tests msl padding insertion for global constants
var<private> global_const: GlobalConst = GlobalConst(0u, vec3<u32>(0u, 0u, 0u), 0);
struct AlignedWrapper {
\t@align(8) value: i32
}
struct Bar {
\t_matrix: mat4x3<f32>,
\tmatrix_array: array<mat2x2<f32>, 2>,
\tatom: atomic<i32>,
\tatom_arr: array<atomic<i32>, 10>,
\tarr: array<vec2<u32>, 2>,
\tdata: array<AlignedWrapper>,
}
@group(0) @binding(0)
var<storage,read_write> bar: Bar;
struct Baz {
\tm: mat3x2<f32>,
}
@group(0) @binding(1)
var<uniform> baz: Baz;
@group(0) @binding(2)
var<storage,read_write> qux: vec2<i32>;
fn test_matrix_within_struct_accesses() {
\tvar idx = 1;
idx--;
\t// loads
let l0 = baz.m;
let l1 = baz.m[0];
let l2 = baz.m[idx];
let l3 = baz.m[0][1];
let l4 = baz.m[0][idx];
let l5 = baz.m[idx][1];
let l6 = baz.m[idx][idx];
var t = Baz(mat3x2<f32>(vec2<f32>(1.0), vec2<f32>(2.0), vec2<f32>(3.0)));
idx++;
\t// stores
t.m = mat3x2<f32>(vec2<f32>(6.0), vec2<f32>(5.0), vec2<f32>(4.0));
t.m[0] = vec2<f32>(9.0);
t.m[idx] = vec2<f32>(90.0);
t.m[0][1] = 10.0;
t.m[0][idx] = 20.0;
t.m[idx][1] = 30.0;
t.m[idx][idx] = 40.0;
}
struct MatCx2InArray {
\tam: array<mat4x2<f32>, 2>,
}
@group(0) @binding(3)
var<uniform> nested_mat_cx2: MatCx2InArray;
fn test_matrix_within_array_within_struct_accesses() {
\tvar idx = 1;
idx--;
\t// loads
let l0 = nested_mat_cx2.am;
let l1 = nested_mat_cx2.am[0];
let l2 = nested_mat_cx2.am[0][0];
let l3 = nested_mat_cx2.am[0][idx];
let l4 = nested_mat_cx2.am[0][0][1];
let l5 = nested_mat_cx2.am[0][0][idx];
let l6 = nested_mat_cx2.am[0][idx][1];
let l7 = nested_mat_cx2.am[0][idx][idx];
var t = MatCx2InArray(array<mat4x2<f32>, 2>());
idx++;
\t// stores
t.am = array<mat4x2<f32>, 2>();
t.am[0] = mat4x2<f32>(vec2<f32>(8.0), vec2<f32>(7.0), vec2<f32>(6.0), vec2<f32>(5.0));
t.am[0][0] = vec2<f32>(9.0);
t.am[0][idx] = vec2<f32>(90.0);
t.am[0][0][1] = 10.0;
t.am[0][0][idx] = 20.0;
t.am[0][idx][1] = 30.0;
t.am[0][idx][idx] = 40.0;
}
fn read_from_private(foo: ptr<function, f32>) -> f32 {
return *foo;
}
fn test_arr_as_arg(a: array<array<f32, 10>, 5>) -> f32 {
return a[4][9];
}
@vertex
fn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4<f32> {
var foo: f32 = 0.0;
// We should check that backed doesn't skip this expression
let baz: f32 = foo;
foo = 1.0;
\ttest_matrix_within_struct_accesses();
\ttest_matrix_within_array_within_struct_accesses();
// test storage loads
\tlet _matrix = bar._matrix;
\tlet arr = bar.arr;
\tlet index = 3u;
\tlet b = bar._matrix[index].x;
\tlet a = bar.data[arrayLength(&bar.data) - 2u].value;
\tlet c = qux;
\t// test pointer types
\tlet data_pointer: ptr<storage, i32, read_write> = &bar.data[0].value;
\tlet foo_value = read_from_private(&foo);
\t// test array indexing
\tvar c2 = array<i32, 5>(a, i32(b), 3, 4, 5);
\tc2[vi + 1u] = 42;
\tlet value = c2[vi];
\ttest_arr_as_arg(array<array<f32, 10>, 5>());
\treturn vec4<f32>(_matrix * vec4<f32>(vec4<i32>(value)), 2.0);
}
@fragment
fn foo_frag() -> @location(0) vec4<f32> {
\t// test storage stores
\tbar._matrix[1].z = 1.0;
\tbar._matrix = mat4x3<f32>(vec3<f32>(0.0), vec3<f32>(1.0), vec3<f32>(2.0), vec3<f32>(3.0));
\tbar.arr = array<vec2<u32>, 2>(vec2<u32>(0u), vec2<u32>(1u));
\tbar.data[1].value = 1;
\tqux = vec2<i32>();
\treturn vec4<f32>(0.0);
}
fn assign_through_ptr_fn(p: ptr<function, u32>) {
*p = 42u;
}
fn assign_array_through_ptr_fn(foo: ptr<function, array<vec4<f32>, 2>>) {
*foo = array<vec4<f32>, 2>(vec4(1.0), vec4(2.0));
}
@compute @workgroup_size(1)
fn assign_through_ptr() {
var val = 33u;
assign_through_ptr_fn(&val);
\tvar arr = array<vec4<f32>, 2>(vec4(6.0), vec4(7.0));
assign_array_through_ptr_fn(&arr);
}
struct AssignToMember {
x: u32,
}
fn fetch_arg_ptr_member(p: ptr<function, AssignToMember>) -> u32 {
return (*p).x;
}
fn assign_to_arg_ptr_member(p: ptr<function, AssignToMember>) {
(*p).x = 10u;
}
fn fetch_arg_ptr_array_element(p: ptr<function, array<u32, 4>>) -> u32 {
return (*p)[1];
}
fn assign_to_arg_ptr_array_element(p: ptr<function, array<u32, 4>>) {
(*p)[1] = 10u;
}
@compute @workgroup_size(1)
fn assign_to_ptr_components() {
var s1: AssignToMember;
assign_to_arg_ptr_member(&s1);
fetch_arg_ptr_member(&s1);
var a1: array<u32, 4>;
assign_to_arg_ptr_array_element(&a1);
fetch_arg_ptr_array_element(&a1);
}
fn index_ptr(value: bool) -> bool {
var a = array<bool, 1>(value);
let p = &a;
return p[0];
}
struct S { m: i32 };
fn member_ptr() -> i32 {
var s: S = S(42);
let p = &s;
return p.m;
}
struct Inner { delicious: i32 }
struct Outer { om_nom_nom: Inner, thing: u32 }
fn let_members_of_members() -> i32 {
let thing = Outer();
let inner = thing.om_nom_nom;
let delishus = inner.delicious;
if (thing.thing != u32(delishus)) {
// LOL
}
return thing.om_nom_nom.delicious;
}
fn var_members_of_members() -> i32 {
var thing = Outer();
var inner = thing.om_nom_nom;
var delishus = inner.delicious;
if (thing.thing != u32(delishus)) {
// LOL
}
return thing.om_nom_nom.delicious;
}
"
OpMemberName %7 0 "a"
OpMemberName %7 1 "b"
OpMemberName %7 2 "c"
OpName %7 "GlobalConst"
OpMemberName %8 0 "value"
OpName %8 "AlignedWrapper"
OpMemberName %21 0 "_matrix"
OpMemberName %21 1 "matrix_array"
OpMemberName %21 2 "atom"
OpMemberName %21 3 "atom_arr"
OpMemberName %21 4 "arr"
OpMemberName %21 5 "data"
OpName %21 "Bar"
OpMemberName %23 0 "m"
OpName %23 "Baz"
OpMemberName %27 0 "am"
OpName %27 "MatCx2InArray"
OpMemberName %37 0 "x"
OpName %37 "AssignToMember"
OpMemberName %45 0 "m"
OpName %45 "S"
OpMemberName %46 0 "delicious"
OpName %46 "Inner"
OpMemberName %47 0 "om_nom_nom"
OpMemberName %47 1 "thing"
OpName %47 "Outer"
OpName %52 "global_const"
OpName %54 "bar"
OpName %56 "baz"
OpName %59 "qux"
OpName %62 "nested_mat_cx2"
OpName %66 "test_matrix_within_struct_accesses"
OpName %94 "idx"
OpName %96 "t"
OpName %140 "test_matrix_within_array_within_struct_accesses"
OpName %150 "idx"
OpName %151 "t"
OpName %197 "foo"
OpName %198 "read_from_private"
OpName %203 "a"
OpName %204 "test_arr_as_arg"
OpName %210 "p"
OpName %211 "assign_through_ptr_fn"
OpName %216 "foo"
OpName %217 "assign_array_through_ptr_fn"
OpName %224 "p"
OpName %225 "fetch_arg_ptr_member"
OpName %231 "p"
OpName %232 "assign_to_arg_ptr_member"
OpName %237 "p"
OpName %238 "fetch_arg_ptr_array_element"
OpName %244 "p"
OpName %245 "assign_to_arg_ptr_array_element"
OpName %250 "value"
OpName %251 "index_ptr"
OpName %253 "a"
OpName %262 "member_ptr"
OpName %266 "s"
OpName %272 "let_members_of_members"
OpName %284 "var_members_of_members"
OpName %285 "thing"
OpName %287 "inner"
OpName %290 "delishus"
OpName %306 "vi"
OpName %311 "foo_vert"
OpName %322 "foo"
OpName %323 "c2"
OpName %363 "foo_frag"
OpName %381 "assign_through_ptr"
OpName %386 "val"
OpName %387 "arr"
OpName %392 "assign_to_ptr_components"
OpName %393 "s1"
OpName %395 "a1"
OpMemberDecorate %7 0 Offset 0
OpMemberDecorate %7 1 Offset 16
OpMemberDecorate %7 2 Offset 28
OpMemberDecorate %8 0 Offset 0
OpDecorate %14 ArrayStride 16
OpDecorate %16 ArrayStride 4
OpDecorate %19 ArrayStride 8
OpDecorate %20 ArrayStride 8
OpMemberDecorate %21 0 Offset 0
OpMemberDecorate %21 0 ColMajor
OpMemberDecorate %21 0 MatrixStride 16
OpMemberDecorate %21 1 Offset 64
OpMemberDecorate %21 1 ColMajor
OpMemberDecorate %21 1 MatrixStride 8
OpMemberDecorate %21 2 Offset 96
OpMemberDecorate %21 3 Offset 100
OpMemberDecorate %21 4 Offset 144
OpMemberDecorate %21 5 Offset 160
OpDecorate %21 Block
OpMemberDecorate %23 0 Offset 0
OpMemberDecorate %23 0 ColMajor
OpMemberDecorate %23 0 MatrixStride 8
OpDecorate %26 ArrayStride 32
OpMemberDecorate %27 0 Offset 0
OpMemberDecorate %27 0 ColMajor
OpMemberDecorate %27 0 MatrixStride 8
OpDecorate %29 ArrayStride 4
OpDecorate %30 ArrayStride 40
OpDecorate %33 ArrayStride 4
OpDecorate %35 ArrayStride 16
OpMemberDecorate %37 0 Offset 0
OpDecorate %39 ArrayStride 4
OpDecorate %43 ArrayStride 1
OpMemberDecorate %45 0 Offset 0
OpMemberDecorate %46 0 Offset 0
OpMemberDecorate %47 0 Offset 0
OpMemberDecorate %47 1 Offset 4
OpDecorate %54 DescriptorSet 0
OpDecorate %54 Binding 0
OpDecorate %56 DescriptorSet 0
OpDecorate %56 Binding 1
OpDecorate %57 Block
OpMemberDecorate %57 0 Offset 0
OpDecorate %59 DescriptorSet 0
OpDecorate %59 Binding 2
OpDecorate %60 Block
OpMemberDecorate %60 0 Offset 0
OpDecorate %62 DescriptorSet 0
OpDecorate %62 Binding 3
OpDecorate %63 Block
OpMemberDecorate %63 0 Offset 0
OpDecorate %306 BuiltIn VertexIndex
OpDecorate %309 BuiltIn Position
OpDecorate %362 Location 0
%2 = OpTypeVoid
%4 = OpTypeInt 32 0
%5 = OpTypeVector %4 3
%6 = OpTypeInt 32 1
%7 = OpTypeStruct %4 %5 %6
%8 = OpTypeStruct %6
%9 = OpTypeFloat 32
%11 = OpTypeVector %9 3
%10 = OpTypeMatrix %11 4
%13 = OpTypeVector %9 2
%12 = OpTypeMatrix %13 2
%15 = OpConstant %4 2
%14 = OpTypeArray %12 %15
%17 = OpConstant %4 10
%16 = OpTypeArray %6 %17
%18 = OpTypeVector %4 2
%19 = OpTypeArray %18 %15
%20 = OpTypeRuntimeArray %8
%21 = OpTypeStruct %10 %14 %6 %16 %19 %20
%22 = OpTypeMatrix %13 3
%23 = OpTypeStruct %22
%24 = OpTypeVector %6 2
%25 = OpTypeMatrix %13 4
%26 = OpTypeArray %25 %15
%27 = OpTypeStruct %26
%28 = OpTypePointer Function %9
%29 = OpTypeArray %9 %17
%31 = OpConstant %4 5
%30 = OpTypeArray %29 %31
%32 = OpTypeVector %9 4
%33 = OpTypeArray %6 %31
%34 = OpTypePointer Function %4
%35 = OpTypeArray %32 %15
%36 = OpTypePointer Function %35
%37 = OpTypeStruct %4
%38 = OpTypePointer Function %37
%40 = OpConstant %4 4
%39 = OpTypeArray %4 %40
%41 = OpTypePointer Function %39
%42 = OpTypeBool
%44 = OpConstant %4 1
%43 = OpTypeArray %42 %44
%45 = OpTypeStruct %6
%46 = OpTypeStruct %6
%47 = OpTypeStruct %46 %4
%48 = OpConstant %4 0
%49 = OpConstantComposite %5 %48 %48 %48
%50 = OpConstant %6 0
%51 = OpConstantComposite %7 %48 %49 %50
%53 = OpTypePointer Private %7
%52 = OpVariable %53 Private %51
%55 = OpTypePointer StorageBuffer %21
%54 = OpVariable %55 StorageBuffer
%57 = OpTypeStruct %23
%58 = OpTypePointer Uniform %57
%56 = OpVariable %58 Uniform
%60 = OpTypeStruct %24
%61 = OpTypePointer StorageBuffer %60
%59 = OpVariable %61 StorageBuffer
%63 = OpTypeStruct %27
%64 = OpTypePointer Uniform %63
%62 = OpVariable %64 Uniform
%67 = OpTypeFunction %2
%68 = OpTypePointer Uniform %23
%70 = OpConstant %6 1
%71 = OpConstant %9 1.0
%72 = OpConstantComposite %13 %71 %71
%73 = OpConstant %9 2.0
%74 = OpConstantComposite %13 %73 %73
%75 = OpConstant %9 3.0
%76 = OpConstantComposite %13 %75 %75
%77 = OpConstantComposite %22 %72 %74 %76
%78 = OpConstantComposite %23 %77
%79 = OpConstant %9 6.0
%80 = OpConstantComposite %13 %79 %79
%81 = OpConstant %9 5.0
%82 = OpConstantComposite %13 %81 %81
%83 = OpConstant %9 4.0
%84 = OpConstantComposite %13 %83 %83
%85 = OpConstantComposite %22 %80 %82 %84
%86 = OpConstant %9 9.0
%87 = OpConstantComposite %13 %86 %86
%88 = OpConstant %9 90.0
%89 = OpConstantComposite %13 %88 %88
%90 = OpConstant %9 10.0
%91 = OpConstant %9 20.0
%92 = OpConstant %9 30.0
%93 = OpConstant %9 40.0
%95 = OpTypePointer Function %6
%97 = OpTypePointer Function %23
%101 = OpTypePointer Uniform %22
%104 = OpTypePointer Uniform %13
%110 = OpTypePointer Uniform %9
%125 = OpTypePointer Function %22
%127 = OpTypePointer Function %13
%141 = OpTypePointer Uniform %27
%143 = OpConstantNull %26
%144 = OpConstantComposite %27 %143
%145 = OpConstant %9 8.0
%146 = OpConstantComposite %13 %145 %145
%147 = OpConstant %9 7.0
%148 = OpConstantComposite %13 %147 %147
%149 = OpConstantComposite %25 %146 %148 %80 %82
%152 = OpTypePointer Function %27
%156 = OpTypePointer Uniform %26
%159 = OpTypePointer Uniform %25
%181 = OpTypePointer Function %26
%183 = OpTypePointer Function %25
%199 = OpTypeFunction %9 %28
%205 = OpTypeFunction %9 %30
%212 = OpTypeFunction %2 %34
%213 = OpConstant %4 42
%218 = OpTypeFunction %2 %36
%219 = OpConstantComposite %32 %71 %71 %71 %71
%220 = OpConstantComposite %32 %73 %73 %73 %73
%221 = OpConstantComposite %35 %219 %220
%226 = OpTypeFunction %4 %38
%233 = OpTypeFunction %2 %38
%239 = OpTypeFunction %4 %41
%246 = OpTypeFunction %2 %41
%252 = OpTypeFunction %42 %42
%254 = OpTypePointer Function %43
%255 = OpConstantNull %43
%258 = OpTypePointer Function %42
%263 = OpTypeFunction %6
%264 = OpConstant %6 42
%265 = OpConstantComposite %45 %264
%267 = OpTypePointer Function %45
%273 = OpConstantNull %47
%286 = OpTypePointer Function %47
%288 = OpTypePointer Function %46
%289 = OpConstantNull %46
%291 = OpConstantNull %6
%307 = OpTypePointer Input %4
%306 = OpVariable %307 Input
%310 = OpTypePointer Output %32
%309 = OpVariable %310 Output
%313 = OpTypePointer StorageBuffer %24
%316 = OpConstant %9 0.0
%317 = OpConstant %4 3
%318 = OpConstant %6 3
%319 = OpConstant %6 4
%320 = OpConstant %6 5
%321 = OpConstantNull %30
%324 = OpTypePointer Function %33
%325 = OpConstantNull %33
%330 = OpTypePointer StorageBuffer %10
%333 = OpTypePointer StorageBuffer %19
%336 = OpTypePointer StorageBuffer %11
%337 = OpTypePointer StorageBuffer %9
%340 = OpTypePointer StorageBuffer %20
%343 = OpTypePointer StorageBuffer %8
%344 = OpTypePointer StorageBuffer %6
%356 = OpTypeVector %6 4
%362 = OpVariable %310 Output
%365 = OpConstantComposite %11 %316 %316 %316
%366 = OpConstantComposite %11 %71 %71 %71
%367 = OpConstantComposite %11 %73 %73 %73
%368 = OpConstantComposite %11 %75 %75 %75
%369 = OpConstantComposite %10 %365 %366 %367 %368
%370 = OpConstantComposite %18 %48 %48
%371 = OpConstantComposite %18 %44 %44
%372 = OpConstantComposite %19 %370 %371
%373 = OpConstantNull %24
%374 = OpConstantComposite %32 %316 %316 %316 %316
%382 = OpConstant %4 33
%383 = OpConstantComposite %32 %79 %79 %79 %79
%384 = OpConstantComposite %32 %147 %147 %147 %147
%385 = OpConstantComposite %35 %383 %384
%394 = OpConstantNull %37
%396 = OpConstantNull %39
%66 = OpFunction %2 None %67
%65 = OpLabel
%94 = OpVariable %95 Function %70
%96 = OpVariable %97 Function %78
%69 = OpAccessChain %68 %56 %48
OpBranch %98
%98 = OpLabel
OpLine %3 40 5
%99 = OpLoad %6 %94
%100 = OpISub %6 %99 %70
OpLine %3 40 5
OpStore %94 %100
OpLine %3 43 14
%102 = OpAccessChain %101 %69 %48
%103 = OpLoad %22 %102
OpLine %3 44 14
OpLine %3 44 14
%105 = OpAccessChain %104 %69 %48 %48
%106 = OpLoad %13 %105
OpLine %3 45 14
%107 = OpLoad %6 %94
%108 = OpAccessChain %104 %69 %48 %107
%109 = OpLoad %13 %108
OpLine %3 46 14
OpLine %3 46 14
OpLine %3 46 14
%111 = OpAccessChain %110 %69 %48 %48 %44
%112 = OpLoad %9 %111
OpLine %3 47 14
OpLine %3 47 14
%113 = OpLoad %6 %94
%114 = OpAccessChain %110 %69 %48 %48 %113
%115 = OpLoad %9 %114
OpLine %3 48 14
%116 = OpLoad %6 %94
OpLine %3 48 14
%117 = OpAccessChain %110 %69 %48 %116 %44
%118 = OpLoad %9 %117
OpLine %3 49 14
%119 = OpLoad %6 %94
%120 = OpLoad %6 %94
%121 = OpAccessChain %110 %69 %48 %119 %120
%122 = OpLoad %9 %121
OpLine %3 51 29
OpLine %3 51 45
OpLine %3 51 13
OpLine %3 53 5
%123 = OpLoad %6 %94
%124 = OpIAdd %6 %123 %70
OpLine %3 53 5
OpStore %94 %124
OpLine %3 56 5
OpLine %3 56 23
OpLine %3 56 39
OpLine %3 56 11
OpLine %3 56 5
%126 = OpAccessChain %125 %96 %48
OpStore %126 %85
OpLine %3 57 5
OpLine %3 57 5
OpLine %3 57 14
OpLine %3 57 5
%128 = OpAccessChain %127 %96 %48 %48
OpStore %128 %87
OpLine %3 58 5
%129 = OpLoad %6 %94
OpLine %3 58 16
OpLine %3 58 5
%130 = OpAccessChain %127 %96 %48 %129
OpStore %130 %89
OpLine %3 59 5
OpLine %3 59 5
OpLine %3 59 5
OpLine %3 59 5
%131 = OpAccessChain %28 %96 %48 %48 %44
OpStore %131 %90
OpLine %3 60 5
OpLine %3 60 5
%132 = OpLoad %6 %94
OpLine %3 60 5
%133 = OpAccessChain %28 %96 %48 %48 %132
OpStore %133 %91
OpLine %3 61 5
%134 = OpLoad %6 %94
OpLine %3 61 5
OpLine %3 61 5
%135 = OpAccessChain %28 %96 %48 %134 %44
OpStore %135 %92
OpLine %3 62 5
%136 = OpLoad %6 %94
%137 = OpLoad %6 %94
OpLine %3 62 5
%138 = OpAccessChain %28 %96 %48 %136 %137
OpStore %138 %93
OpReturn
OpFunctionEnd
%140 = OpFunction %2 None %67
%139 = OpLabel
%150 = OpVariable %95 Function %70
%151 = OpVariable %152 Function %144
%142 = OpAccessChain %141 %62 %48
OpBranch %153
%153 = OpLabel
OpLine %3 75 5
%154 = OpLoad %6 %150
%155 = OpISub %6 %154 %70
OpLine %3 75 5
OpStore %150 %155
OpLine %3 78 14
%157 = OpAccessChain %156 %142 %48
%158 = OpLoad %26 %157
OpLine %3 79 14
OpLine %3 79 14
%160 = OpAccessChain %159 %142 %48 %48
%161 = OpLoad %25 %160
OpLine %3 80 14
OpLine %3 80 14
OpLine %3 80 14
%162 = OpAccessChain %104 %142 %48 %48 %48
%163 = OpLoad %13 %162
OpLine %3 81 14
OpLine %3 81 14
%164 = OpLoad %6 %150
%165 = OpAccessChain %104 %142 %48 %48 %164
%166 = OpLoad %13 %165
OpLine %3 82 14
OpLine %3 82 14
OpLine %3 82 14
OpLine %3 82 14
%167 = OpAccessChain %110 %142 %48 %48 %48 %44
%168 = OpLoad %9 %167
OpLine %3 83 14
OpLine %3 83 14
OpLine %3 83 14
%169 = OpLoad %6 %150
%170 = OpAccessChain %110 %142 %48 %48 %48 %169
%171 = OpLoad %9 %170
OpLine %3 84 14
OpLine %3 84 14
%172 = OpLoad %6 %150
OpLine %3 84 14
%173 = OpAccessChain %110 %142 %48 %48 %172 %44
%174 = OpLoad %9 %173
OpLine %3 85 14
OpLine %3 85 14
%175 = OpLoad %6 %150
%176 = OpLoad %6 %150
%177 = OpAccessChain %110 %142 %48 %48 %175 %176
%178 = OpLoad %9 %177
OpLine %3 87 13
OpLine %3 89 5
%179 = OpLoad %6 %150
%180 = OpIAdd %6 %179 %70
OpLine %3 89 5
OpStore %150 %180
OpLine %3 92 5
OpLine %3 92 5
%182 = OpAccessChain %181 %151 %48
OpStore %182 %143
OpLine %3 93 5
OpLine %3 93 5
OpLine %3 93 27
OpLine %3 93 43
OpLine %3 93 59
OpLine %3 93 15
OpLine %3 93 5
%184 = OpAccessChain %183 %151 %48 %48
OpStore %184 %149
OpLine %3 94 5
OpLine %3 94 5
OpLine %3 94 5
OpLine %3 94 18
OpLine %3 94 5
%185 = OpAccessChain %127 %151 %48 %48 %48
OpStore %185 %87
OpLine %3 95 5
OpLine %3 95 5
%186 = OpLoad %6 %150
OpLine %3 95 20
OpLine %3 95 5
%187 = OpAccessChain %127 %151 %48 %48 %186
OpStore %187 %89
OpLine %3 96 5
OpLine %3 96 5
OpLine %3 96 5
OpLine %3 96 5
OpLine %3 96 5
%188 = OpAccessChain %28 %151 %48 %48 %48 %44
OpStore %188 %90
OpLine %3 97 5
OpLine %3 97 5
OpLine %3 97 5
%189 = OpLoad %6 %150
OpLine %3 97 5
%190 = OpAccessChain %28 %151 %48 %48 %48 %189
OpStore %190 %91
OpLine %3 98 5
OpLine %3 98 5
%191 = OpLoad %6 %150
OpLine %3 98 5
OpLine %3 98 5
%192 = OpAccessChain %28 %151 %48 %48 %191 %44
OpStore %192 %92
OpLine %3 99 5
OpLine %3 99 5
%193 = OpLoad %6 %150
%194 = OpLoad %6 %150
OpLine %3 99 5
%195 = OpAccessChain %28 %151 %48 %48 %193 %194
OpStore %195 %93
OpReturn
OpFunctionEnd
%198 = OpFunction %9 None %199
%197 = OpFunctionParameter %28
%196 = OpLabel
OpBranch %200
%200 = OpLabel
OpLine %3 102 22
%201 = OpLoad %9 %197
OpReturnValue %201
OpFunctionEnd
%204 = OpFunction %9 None %205
%203 = OpFunctionParameter %30
%202 = OpLabel
OpBranch %206
%206 = OpLabel
OpLine %3 107 12
%207 = OpCompositeExtract %29 %203 4
OpLine %3 107 12
%208 = OpCompositeExtract %9 %207 9
OpReturnValue %208
OpFunctionEnd
%211 = OpFunction %2 None %212
%210 = OpFunctionParameter %34
%209 = OpLabel
OpBranch %214
%214 = OpLabel
OpLine %3 155 5
OpStore %210 %213
OpReturn
OpFunctionEnd
%217 = OpFunction %2 None %218
%216 = OpFunctionParameter %36
%215 = OpLabel
OpBranch %222
%222 = OpLabel
OpLine %3 159 32
OpLine %3 159 43
OpLine %3 159 32
OpLine %3 159 12
OpLine %3 159 5
OpStore %216 %221
OpReturn
OpFunctionEnd
%225 = OpFunction %4 None %226
%224 = OpFunctionParameter %38
%223 = OpLabel
OpBranch %227
%227 = OpLabel
OpLine %3 176 10
%228 = OpAccessChain %34 %224 %48
%229 = OpLoad %4 %228
OpReturnValue %229
OpFunctionEnd
%232 = OpFunction %2 None %233
%231 = OpFunctionParameter %38
%230 = OpLabel
OpBranch %234
%234 = OpLabel
OpLine %3 180 3
OpLine %3 180 3
%235 = OpAccessChain %34 %231 %48
OpStore %235 %17
OpReturn
OpFunctionEnd
%238 = OpFunction %4 None %239
%237 = OpFunctionParameter %41
%236 = OpLabel
OpBranch %240
%240 = OpLabel
OpLine %3 184 10
%241 = OpAccessChain %34 %237 %44
%242 = OpLoad %4 %241
OpReturnValue %242
OpFunctionEnd
%245 = OpFunction %2 None %246
%244 = OpFunctionParameter %41
%243 = OpLabel
OpBranch %247
%247 = OpLabel
OpLine %3 188 3
OpLine %3 188 3
%248 = OpAccessChain %34 %244 %44
OpStore %248 %17
OpReturn
OpFunctionEnd
%251 = OpFunction %42 None %252
%250 = OpFunctionParameter %42
%249 = OpLabel
%253 = OpVariable %254 Function %255
OpBranch %256
%256 = OpLabel
OpLine %3 203 13
%257 = OpCompositeConstruct %43 %250
OpLine %3 203 5
OpStore %253 %257
OpLine %3 205 12
%259 = OpAccessChain %258 %253 %48
%260 = OpLoad %42 %259
OpReturnValue %260
OpFunctionEnd
%262 = OpFunction %6 None %263
%261 = OpLabel
%266 = OpVariable %267 Function %265
OpBranch %268
%268 = OpLabel
OpLine %3 211 16
OpLine %3 213 12
%269 = OpAccessChain %95 %266 %48
%270 = OpLoad %6 %269
OpReturnValue %270
OpFunctionEnd
%272 = OpFunction %6 None %263
%271 = OpLabel
OpBranch %274
%274 = OpLabel
OpLine %3 223 17
%275 = OpCompositeExtract %46 %273 0
OpLine %3 224 20
%276 = OpCompositeExtract %6 %275 0
OpLine %3 226 9
%277 = OpCompositeExtract %4 %273 1
%278 = OpBitcast %4 %276
%279 = OpINotEqual %42 %277 %278
OpLine %3 226 5
OpSelectionMerge %280 None
OpBranchConditional %279 %280 %280
%280 = OpLabel
OpLine %3 230 12
%281 = OpCompositeExtract %46 %273 0
%282 = OpCompositeExtract %6 %281 0
OpReturnValue %282
OpFunctionEnd
%284 = OpFunction %6 None %263
%283 = OpLabel
%285 = OpVariable %286 Function %273
%287 = OpVariable %288 Function %289
%290 = OpVariable %95 Function %291
OpBranch %292
%292 = OpLabel
OpLine %3 236 17
%293 = OpAccessChain %288 %285 %48
%294 = OpLoad %46 %293
OpLine %3 236 5
OpStore %287 %294
OpLine %3 237 20
%295 = OpAccessChain %95 %287 %48
%296 = OpLoad %6 %295
OpLine %3 237 5
OpStore %290 %296
OpLine %3 239 9
%297 = OpAccessChain %34 %285 %44
%298 = OpLoad %4 %297
%299 = OpLoad %6 %290
%300 = OpBitcast %4 %299
%301 = OpINotEqual %42 %298 %300
OpLine %3 239 5
OpSelectionMerge %302 None
OpBranchConditional %301 %302 %302
%302 = OpLabel
OpLine %3 243 12
%303 = OpAccessChain %95 %285 %48 %48
%304 = OpLoad %6 %303
OpReturnValue %304
OpFunctionEnd
%311 = OpFunction %2 None %67
%305 = OpLabel
%322 = OpVariable %28 Function %316
%323 = OpVariable %324 Function %325
%308 = OpLoad %4 %306
%312 = OpAccessChain %68 %56 %48
%314 = OpAccessChain %313 %59 %48
%315 = OpAccessChain %141 %62 %48
OpBranch %326
%326 = OpLabel
OpLine %3 1 1
%327 = OpLoad %9 %322
OpLine %3 115 5
OpStore %322 %71
OpLine %3 117 2
%328 = OpFunctionCall %2 %66
OpLine %3 118 2
%329 = OpFunctionCall %2 %140
OpLine %3 121 16
%331 = OpAccessChain %330 %54 %48
%332 = OpLoad %10 %331
OpLine %3 122 12
%334 = OpAccessChain %333 %54 %40
%335 = OpLoad %19 %334
OpLine %3 124 10
%338 = OpAccessChain %337 %54 %48 %317 %48
%339 = OpLoad %9 %338
OpLine %3 125 10
OpLine %3 125 19
%341 = OpArrayLength %4 %54 5
OpLine %3 125 10
%342 = OpISub %4 %341 %15
%345 = OpAccessChain %344 %54 %31 %342 %48
%346 = OpLoad %6 %345
OpLine %3 126 10
%347 = OpLoad %24 %314
OpLine %3 129 53
OpLine %3 129 53
OpLine %3 130 18
%348 = OpFunctionCall %9 %198 %322
OpLine %3 133 28
%349 = OpConvertFToS %6 %339
OpLine %3 133 11
%350 = OpCompositeConstruct %33 %346 %349 %318 %319 %320
OpLine %3 133 2
OpStore %323 %350
OpLine %3 134 2
%351 = OpIAdd %4 %308 %44
OpLine %3 134 2
%352 = OpAccessChain %95 %323 %351
OpStore %352 %264
OpLine %3 135 14
%353 = OpAccessChain %95 %323 %308
%354 = OpLoad %6 %353
OpLine %3 137 2
%355 = OpFunctionCall %9 %204 %321
OpLine %3 139 19
%357 = OpCompositeConstruct %356 %354 %354 %354 %354
%358 = OpConvertSToF %32 %357
%359 = OpMatrixTimesVector %11 %332 %358
OpLine %3 139 9
%360 = OpCompositeConstruct %32 %359 %73
OpStore %309 %360
OpReturn
OpFunctionEnd
%363 = OpFunction %2 None %67
%361 = OpLabel
%364 = OpAccessChain %313 %59 %48
OpBranch %375
%375 = OpLabel
OpLine %3 145 2
OpLine %3 145 2
OpLine %3 145 2
%376 = OpAccessChain %337 %54 %48 %44 %15
OpStore %376 %71
OpLine %3 146 2
OpLine %3 146 28
OpLine %3 146 44
OpLine %3 146 60
OpLine %3 146 16
OpLine %3 146 2
%377 = OpAccessChain %330 %54 %48
OpStore %377 %369
OpLine %3 147 2
OpLine %3 147 32
OpLine %3 147 12
OpLine %3 147 2
%378 = OpAccessChain %333 %54 %40
OpStore %378 %372
OpLine %3 148 2
OpLine %3 148 2
OpLine %3 148 2
%379 = OpAccessChain %344 %54 %31 %44 %48
OpStore %379 %70
OpLine %3 149 2
OpStore %364 %373
OpLine %3 151 9
OpStore %362 %374
OpReturn
OpFunctionEnd
%381 = OpFunction %2 None %67
%380 = OpLabel
%386 = OpVariable %34 Function %382
%387 = OpVariable %36 Function %385
OpBranch %388
%388 = OpLabel
OpLine %3 165 5
%389 = OpFunctionCall %2 %211 %386
OpLine %3 167 32
OpLine %3 167 43
OpLine %3 167 32
OpLine %3 167 12
OpLine %3 168 5
%390 = OpFunctionCall %2 %217 %387
OpReturn
OpFunctionEnd
%392 = OpFunction %2 None %67
%391 = OpLabel
%393 = OpVariable %38 Function %394
%395 = OpVariable %41 Function %396
OpBranch %397
%397 = OpLabel
OpLine %3 194 4
%398 = OpFunctionCall %2 %232 %393
OpLine %3 195 4
%399 = OpFunctionCall %4 %225 %393
OpLine %3 198 4
%400 = OpFunctionCall %2 %245 %395
OpLine %3 199 4
%401 = OpFunctionCall %4 %238 %395
OpReturn
OpFunctionEnd