skia2/tests/sksl/shared/MatricesNonsquare.asm.frag
John Stiles ffc9dec755 Eliminate redundant loads following stores.
We now have two functions `writeOpLoad` and `writeOpStore` which are
in charge of writing SpvOpLoad and SpvOpStore instructions.
`writeOpStore` also keeps track of pointer stores in a "store cache."
Subsequent loads from that same pointer will be found in the cache and
will return the value stored in that pointer instead.

Such a cache definitely cannot work in the face of control flow, so we
make the following concessions:
- `pruneReachableOps` is now `pruneConditionalOps`. Any pointers that
  are altered inside a potentially-unreachable block are cleared from
  the cache entirely.
- The entire store cache is cleared at all OpLabels within a loop.

The cache also cannot work in the presence of swizzled stores, so we
make another significant concession:
- The entire store cache is cleared whenever we store into a non-memory
  pointer (e.g., assigning into a swizzled LValue, such as `foo.xz`).

Despite these significant limitations, this manages to dramatically
shrink many real-world examples.

Change-Id: I0981a0cf7b45b064e153e9ada271494c8e00cad5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/530054
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
2022-04-18 14:57:48 +00:00

629 lines
20 KiB
JavaScript

OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %_entrypoint_v "_entrypoint" %sk_FragColor %sk_Clockwise
OpExecutionMode %_entrypoint_v OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
OpName %_UniformBuffer "_UniformBuffer"
OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint_v "_entrypoint_v"
OpName %test_half_b "test_half_b"
OpName %ok "ok"
OpName %m23 "m23"
OpName %m24 "m24"
OpName %m32 "m32"
OpName %m34 "m34"
OpName %m42 "m42"
OpName %m43 "m43"
OpName %m22 "m22"
OpName %m33 "m33"
OpName %main "main"
OpName %_0_ok "_0_ok"
OpName %_1_m23 "_1_m23"
OpName %_2_m24 "_2_m24"
OpName %_3_m32 "_3_m32"
OpName %_4_m34 "_4_m34"
OpName %_5_m42 "_5_m42"
OpName %_6_m43 "_6_m43"
OpName %_7_m22 "_7_m22"
OpName %_8_m33 "_8_m33"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpMemberDecorate %_UniformBuffer 0 Offset 0
OpMemberDecorate %_UniformBuffer 0 RelaxedPrecision
OpMemberDecorate %_UniformBuffer 1 Offset 16
OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %11 Binding 0
OpDecorate %11 DescriptorSet 0
OpDecorate %m23 RelaxedPrecision
OpDecorate %41 RelaxedPrecision
OpDecorate %43 RelaxedPrecision
OpDecorate %m24 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %59 RelaxedPrecision
OpDecorate %m32 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %75 RelaxedPrecision
OpDecorate %78 RelaxedPrecision
OpDecorate %m34 RelaxedPrecision
OpDecorate %92 RelaxedPrecision
OpDecorate %94 RelaxedPrecision
OpDecorate %97 RelaxedPrecision
OpDecorate %m42 RelaxedPrecision
OpDecorate %110 RelaxedPrecision
OpDecorate %112 RelaxedPrecision
OpDecorate %115 RelaxedPrecision
OpDecorate %118 RelaxedPrecision
OpDecorate %m43 RelaxedPrecision
OpDecorate %133 RelaxedPrecision
OpDecorate %135 RelaxedPrecision
OpDecorate %138 RelaxedPrecision
OpDecorate %141 RelaxedPrecision
OpDecorate %m22 RelaxedPrecision
OpDecorate %148 RelaxedPrecision
OpDecorate %155 RelaxedPrecision
OpDecorate %156 RelaxedPrecision
OpDecorate %158 RelaxedPrecision
OpDecorate %159 RelaxedPrecision
OpDecorate %m33 RelaxedPrecision
OpDecorate %166 RelaxedPrecision
OpDecorate %174 RelaxedPrecision
OpDecorate %175 RelaxedPrecision
OpDecorate %177 RelaxedPrecision
OpDecorate %178 RelaxedPrecision
OpDecorate %181 RelaxedPrecision
OpDecorate %182 RelaxedPrecision
OpDecorate %189 RelaxedPrecision
OpDecorate %190 RelaxedPrecision
OpDecorate %191 RelaxedPrecision
OpDecorate %197 RelaxedPrecision
OpDecorate %199 RelaxedPrecision
OpDecorate %205 RelaxedPrecision
OpDecorate %206 RelaxedPrecision
OpDecorate %207 RelaxedPrecision
OpDecorate %208 RelaxedPrecision
OpDecorate %216 RelaxedPrecision
OpDecorate %218 RelaxedPrecision
OpDecorate %221 RelaxedPrecision
OpDecorate %227 RelaxedPrecision
OpDecorate %228 RelaxedPrecision
OpDecorate %229 RelaxedPrecision
OpDecorate %236 RelaxedPrecision
OpDecorate %238 RelaxedPrecision
OpDecorate %396 RelaxedPrecision
OpDecorate %399 RelaxedPrecision
OpDecorate %400 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%sk_FragColor = OpVariable %_ptr_Output_v4float Output
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%_UniformBuffer = OpTypeStruct %v4float %v4float
%_ptr_Uniform__UniformBuffer = OpTypePointer Uniform %_UniformBuffer
%11 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
%void = OpTypeVoid
%16 = OpTypeFunction %void
%float_0 = OpConstant %float 0
%v2float = OpTypeVector %float 2
%20 = OpConstantComposite %v2float %float_0 %float_0
%_ptr_Function_v2float = OpTypePointer Function %v2float
%24 = OpTypeFunction %bool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
%v3float = OpTypeVector %float 3
%mat2v3float = OpTypeMatrix %v3float 2
%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
%float_2 = OpConstant %float 2
%34 = OpConstantComposite %v3float %float_2 %float_0 %float_0
%35 = OpConstantComposite %v3float %float_0 %float_2 %float_0
%36 = OpConstantComposite %mat2v3float %34 %35
%false = OpConstantFalse %bool
%v3bool = OpTypeVector %bool 3
%mat2v4float = OpTypeMatrix %v4float 2
%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
%float_3 = OpConstant %float 3
%51 = OpConstantComposite %v4float %float_3 %float_0 %float_0 %float_0
%52 = OpConstantComposite %v4float %float_0 %float_3 %float_0 %float_0
%53 = OpConstantComposite %mat2v4float %51 %52
%v4bool = OpTypeVector %bool 4
%mat3v2float = OpTypeMatrix %v2float 3
%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
%float_4 = OpConstant %float 4
%67 = OpConstantComposite %v2float %float_4 %float_0
%68 = OpConstantComposite %v2float %float_0 %float_4
%69 = OpConstantComposite %mat3v2float %67 %68 %20
%v2bool = OpTypeVector %bool 2
%mat3v4float = OpTypeMatrix %v4float 3
%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
%float_5 = OpConstant %float 5
%86 = OpConstantComposite %v4float %float_5 %float_0 %float_0 %float_0
%87 = OpConstantComposite %v4float %float_0 %float_5 %float_0 %float_0
%88 = OpConstantComposite %v4float %float_0 %float_0 %float_5 %float_0
%89 = OpConstantComposite %mat3v4float %86 %87 %88
%mat4v2float = OpTypeMatrix %v2float 4
%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
%float_6 = OpConstant %float 6
%105 = OpConstantComposite %v2float %float_6 %float_0
%106 = OpConstantComposite %v2float %float_0 %float_6
%107 = OpConstantComposite %mat4v2float %105 %106 %20 %20
%mat4v3float = OpTypeMatrix %v3float 4
%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
%float_7 = OpConstant %float 7
%126 = OpConstantComposite %v3float %float_7 %float_0 %float_0
%127 = OpConstantComposite %v3float %float_0 %float_7 %float_0
%128 = OpConstantComposite %v3float %float_0 %float_0 %float_7
%129 = OpConstantComposite %v3float %float_0 %float_0 %float_0
%130 = OpConstantComposite %mat4v3float %126 %127 %128 %129
%mat2v2float = OpTypeMatrix %v2float 2
%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
%float_8 = OpConstant %float 8
%152 = OpConstantComposite %v2float %float_8 %float_0
%153 = OpConstantComposite %v2float %float_0 %float_8
%154 = OpConstantComposite %mat2v2float %152 %153
%mat3v3float = OpTypeMatrix %v3float 3
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
%float_35 = OpConstant %float 35
%170 = OpConstantComposite %v3float %float_35 %float_0 %float_0
%171 = OpConstantComposite %v3float %float_0 %float_35 %float_0
%172 = OpConstantComposite %v3float %float_0 %float_0 %float_35
%173 = OpConstantComposite %mat3v3float %170 %171 %172
%float_1 = OpConstant %float 1
%187 = OpConstantComposite %v3float %float_1 %float_1 %float_1
%188 = OpConstantComposite %mat2v3float %187 %187
%194 = OpConstantComposite %v3float %float_3 %float_1 %float_1
%195 = OpConstantComposite %v3float %float_1 %float_3 %float_1
%196 = OpConstantComposite %mat2v3float %194 %195
%203 = OpConstantComposite %v2float %float_2 %float_2
%204 = OpConstantComposite %mat3v2float %203 %203 %203
%float_n2 = OpConstant %float -2
%212 = OpConstantComposite %v2float %float_2 %float_n2
%213 = OpConstantComposite %v2float %float_n2 %float_2
%214 = OpConstantComposite %v2float %float_n2 %float_n2
%215 = OpConstantComposite %mat3v2float %212 %213 %214
%225 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_4
%226 = OpConstantComposite %mat2v4float %225 %225
%float_0_75 = OpConstant %float 0.75
%233 = OpConstantComposite %v4float %float_0_75 %float_0 %float_0 %float_0
%234 = OpConstantComposite %v4float %float_0 %float_0_75 %float_0 %float_0
%235 = OpConstantComposite %mat2v4float %233 %234
%242 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%_entrypoint_v = OpFunction %void None %16
%17 = OpLabel
%21 = OpVariable %_ptr_Function_v2float Function
OpStore %21 %20
%23 = OpFunctionCall %v4float %main %21
OpStore %sk_FragColor %23
OpReturn
OpFunctionEnd
%test_half_b = OpFunction %bool None %24
%25 = OpLabel
%ok = OpVariable %_ptr_Function_bool Function
%m23 = OpVariable %_ptr_Function_mat2v3float Function
%m24 = OpVariable %_ptr_Function_mat2v4float Function
%m32 = OpVariable %_ptr_Function_mat3v2float Function
%m34 = OpVariable %_ptr_Function_mat3v4float Function
%m42 = OpVariable %_ptr_Function_mat4v2float Function
%m43 = OpVariable %_ptr_Function_mat4v3float Function
%m22 = OpVariable %_ptr_Function_mat2v2float Function
%m33 = OpVariable %_ptr_Function_mat3v3float Function
OpStore %ok %true
OpStore %m23 %36
OpSelectionMerge %39 None
OpBranchConditional %true %38 %39
%38 = OpLabel
%41 = OpFOrdEqual %v3bool %34 %34
%42 = OpAll %bool %41
%43 = OpFOrdEqual %v3bool %35 %35
%44 = OpAll %bool %43
%45 = OpLogicalAnd %bool %42 %44
OpBranch %39
%39 = OpLabel
%46 = OpPhi %bool %false %25 %45 %38
OpStore %ok %46
OpStore %m24 %53
OpSelectionMerge %55 None
OpBranchConditional %46 %54 %55
%54 = OpLabel
%57 = OpFOrdEqual %v4bool %51 %51
%58 = OpAll %bool %57
%59 = OpFOrdEqual %v4bool %52 %52
%60 = OpAll %bool %59
%61 = OpLogicalAnd %bool %58 %60
OpBranch %55
%55 = OpLabel
%62 = OpPhi %bool %false %39 %61 %54
OpStore %ok %62
OpStore %m32 %69
OpSelectionMerge %71 None
OpBranchConditional %62 %70 %71
%70 = OpLabel
%73 = OpFOrdEqual %v2bool %67 %67
%74 = OpAll %bool %73
%75 = OpFOrdEqual %v2bool %68 %68
%76 = OpAll %bool %75
%77 = OpLogicalAnd %bool %74 %76
%78 = OpFOrdEqual %v2bool %20 %20
%79 = OpAll %bool %78
%80 = OpLogicalAnd %bool %77 %79
OpBranch %71
%71 = OpLabel
%81 = OpPhi %bool %false %55 %80 %70
OpStore %ok %81
OpStore %m34 %89
OpSelectionMerge %91 None
OpBranchConditional %81 %90 %91
%90 = OpLabel
%92 = OpFOrdEqual %v4bool %86 %86
%93 = OpAll %bool %92
%94 = OpFOrdEqual %v4bool %87 %87
%95 = OpAll %bool %94
%96 = OpLogicalAnd %bool %93 %95
%97 = OpFOrdEqual %v4bool %88 %88
%98 = OpAll %bool %97
%99 = OpLogicalAnd %bool %96 %98
OpBranch %91
%91 = OpLabel
%100 = OpPhi %bool %false %71 %99 %90
OpStore %ok %100
OpStore %m42 %107
OpSelectionMerge %109 None
OpBranchConditional %100 %108 %109
%108 = OpLabel
%110 = OpFOrdEqual %v2bool %105 %105
%111 = OpAll %bool %110
%112 = OpFOrdEqual %v2bool %106 %106
%113 = OpAll %bool %112
%114 = OpLogicalAnd %bool %111 %113
%115 = OpFOrdEqual %v2bool %20 %20
%116 = OpAll %bool %115
%117 = OpLogicalAnd %bool %114 %116
%118 = OpFOrdEqual %v2bool %20 %20
%119 = OpAll %bool %118
%120 = OpLogicalAnd %bool %117 %119
OpBranch %109
%109 = OpLabel
%121 = OpPhi %bool %false %91 %120 %108
OpStore %ok %121
OpStore %m43 %130
OpSelectionMerge %132 None
OpBranchConditional %121 %131 %132
%131 = OpLabel
%133 = OpFOrdEqual %v3bool %126 %126
%134 = OpAll %bool %133
%135 = OpFOrdEqual %v3bool %127 %127
%136 = OpAll %bool %135
%137 = OpLogicalAnd %bool %134 %136
%138 = OpFOrdEqual %v3bool %128 %128
%139 = OpAll %bool %138
%140 = OpLogicalAnd %bool %137 %139
%141 = OpFOrdEqual %v3bool %129 %129
%142 = OpAll %bool %141
%143 = OpLogicalAnd %bool %140 %142
OpBranch %132
%132 = OpLabel
%144 = OpPhi %bool %false %109 %143 %131
OpStore %ok %144
%148 = OpMatrixTimesMatrix %mat2v2float %69 %36
OpStore %m22 %148
OpSelectionMerge %150 None
OpBranchConditional %144 %149 %150
%149 = OpLabel
%155 = OpCompositeExtract %v2float %148 0
%156 = OpFOrdEqual %v2bool %155 %152
%157 = OpAll %bool %156
%158 = OpCompositeExtract %v2float %148 1
%159 = OpFOrdEqual %v2bool %158 %153
%160 = OpAll %bool %159
%161 = OpLogicalAnd %bool %157 %160
OpBranch %150
%150 = OpLabel
%162 = OpPhi %bool %false %132 %161 %149
OpStore %ok %162
%166 = OpMatrixTimesMatrix %mat3v3float %130 %89
OpStore %m33 %166
OpSelectionMerge %168 None
OpBranchConditional %162 %167 %168
%167 = OpLabel
%174 = OpCompositeExtract %v3float %166 0
%175 = OpFOrdEqual %v3bool %174 %170
%176 = OpAll %bool %175
%177 = OpCompositeExtract %v3float %166 1
%178 = OpFOrdEqual %v3bool %177 %171
%179 = OpAll %bool %178
%180 = OpLogicalAnd %bool %176 %179
%181 = OpCompositeExtract %v3float %166 2
%182 = OpFOrdEqual %v3bool %181 %172
%183 = OpAll %bool %182
%184 = OpLogicalAnd %bool %180 %183
OpBranch %168
%168 = OpLabel
%185 = OpPhi %bool %false %150 %184 %167
OpStore %ok %185
%189 = OpFAdd %v3float %34 %187
%190 = OpFAdd %v3float %35 %187
%191 = OpCompositeConstruct %mat2v3float %189 %190
OpStore %m23 %191
OpSelectionMerge %193 None
OpBranchConditional %185 %192 %193
%192 = OpLabel
%197 = OpFOrdEqual %v3bool %189 %194
%198 = OpAll %bool %197
%199 = OpFOrdEqual %v3bool %190 %195
%200 = OpAll %bool %199
%201 = OpLogicalAnd %bool %198 %200
OpBranch %193
%193 = OpLabel
%202 = OpPhi %bool %false %168 %201 %192
OpStore %ok %202
%205 = OpFSub %v2float %67 %203
%206 = OpFSub %v2float %68 %203
%207 = OpFSub %v2float %20 %203
%208 = OpCompositeConstruct %mat3v2float %205 %206 %207
OpStore %m32 %208
OpSelectionMerge %210 None
OpBranchConditional %202 %209 %210
%209 = OpLabel
%216 = OpFOrdEqual %v2bool %205 %212
%217 = OpAll %bool %216
%218 = OpFOrdEqual %v2bool %206 %213
%219 = OpAll %bool %218
%220 = OpLogicalAnd %bool %217 %219
%221 = OpFOrdEqual %v2bool %207 %214
%222 = OpAll %bool %221
%223 = OpLogicalAnd %bool %220 %222
OpBranch %210
%210 = OpLabel
%224 = OpPhi %bool %false %193 %223 %209
OpStore %ok %224
%227 = OpFDiv %v4float %51 %225
%228 = OpFDiv %v4float %52 %225
%229 = OpCompositeConstruct %mat2v4float %227 %228
OpStore %m24 %229
OpSelectionMerge %231 None
OpBranchConditional %224 %230 %231
%230 = OpLabel
%236 = OpFOrdEqual %v4bool %227 %233
%237 = OpAll %bool %236
%238 = OpFOrdEqual %v4bool %228 %234
%239 = OpAll %bool %238
%240 = OpLogicalAnd %bool %237 %239
OpBranch %231
%231 = OpLabel
%241 = OpPhi %bool %false %210 %240 %230
OpStore %ok %241
OpReturnValue %241
OpFunctionEnd
%main = OpFunction %v4float None %242
%243 = OpFunctionParameter %_ptr_Function_v2float
%244 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function
%_1_m23 = OpVariable %_ptr_Function_mat2v3float Function
%_2_m24 = OpVariable %_ptr_Function_mat2v4float Function
%_3_m32 = OpVariable %_ptr_Function_mat3v2float Function
%_4_m34 = OpVariable %_ptr_Function_mat3v4float Function
%_5_m42 = OpVariable %_ptr_Function_mat4v2float Function
%_6_m43 = OpVariable %_ptr_Function_mat4v3float Function
%_7_m22 = OpVariable %_ptr_Function_mat2v2float Function
%_8_m33 = OpVariable %_ptr_Function_mat3v3float Function
%387 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true
OpStore %_1_m23 %36
OpSelectionMerge %248 None
OpBranchConditional %true %247 %248
%247 = OpLabel
%249 = OpFOrdEqual %v3bool %34 %34
%250 = OpAll %bool %249
%251 = OpFOrdEqual %v3bool %35 %35
%252 = OpAll %bool %251
%253 = OpLogicalAnd %bool %250 %252
OpBranch %248
%248 = OpLabel
%254 = OpPhi %bool %false %244 %253 %247
OpStore %_0_ok %254
OpStore %_2_m24 %53
OpSelectionMerge %257 None
OpBranchConditional %254 %256 %257
%256 = OpLabel
%258 = OpFOrdEqual %v4bool %51 %51
%259 = OpAll %bool %258
%260 = OpFOrdEqual %v4bool %52 %52
%261 = OpAll %bool %260
%262 = OpLogicalAnd %bool %259 %261
OpBranch %257
%257 = OpLabel
%263 = OpPhi %bool %false %248 %262 %256
OpStore %_0_ok %263
OpStore %_3_m32 %69
OpSelectionMerge %266 None
OpBranchConditional %263 %265 %266
%265 = OpLabel
%267 = OpFOrdEqual %v2bool %67 %67
%268 = OpAll %bool %267
%269 = OpFOrdEqual %v2bool %68 %68
%270 = OpAll %bool %269
%271 = OpLogicalAnd %bool %268 %270
%272 = OpFOrdEqual %v2bool %20 %20
%273 = OpAll %bool %272
%274 = OpLogicalAnd %bool %271 %273
OpBranch %266
%266 = OpLabel
%275 = OpPhi %bool %false %257 %274 %265
OpStore %_0_ok %275
OpStore %_4_m34 %89
OpSelectionMerge %278 None
OpBranchConditional %275 %277 %278
%277 = OpLabel
%279 = OpFOrdEqual %v4bool %86 %86
%280 = OpAll %bool %279
%281 = OpFOrdEqual %v4bool %87 %87
%282 = OpAll %bool %281
%283 = OpLogicalAnd %bool %280 %282
%284 = OpFOrdEqual %v4bool %88 %88
%285 = OpAll %bool %284
%286 = OpLogicalAnd %bool %283 %285
OpBranch %278
%278 = OpLabel
%287 = OpPhi %bool %false %266 %286 %277
OpStore %_0_ok %287
OpStore %_5_m42 %107
OpSelectionMerge %290 None
OpBranchConditional %287 %289 %290
%289 = OpLabel
%291 = OpFOrdEqual %v2bool %105 %105
%292 = OpAll %bool %291
%293 = OpFOrdEqual %v2bool %106 %106
%294 = OpAll %bool %293
%295 = OpLogicalAnd %bool %292 %294
%296 = OpFOrdEqual %v2bool %20 %20
%297 = OpAll %bool %296
%298 = OpLogicalAnd %bool %295 %297
%299 = OpFOrdEqual %v2bool %20 %20
%300 = OpAll %bool %299
%301 = OpLogicalAnd %bool %298 %300
OpBranch %290
%290 = OpLabel
%302 = OpPhi %bool %false %278 %301 %289
OpStore %_0_ok %302
OpStore %_6_m43 %130
OpSelectionMerge %305 None
OpBranchConditional %302 %304 %305
%304 = OpLabel
%306 = OpFOrdEqual %v3bool %126 %126
%307 = OpAll %bool %306
%308 = OpFOrdEqual %v3bool %127 %127
%309 = OpAll %bool %308
%310 = OpLogicalAnd %bool %307 %309
%311 = OpFOrdEqual %v3bool %128 %128
%312 = OpAll %bool %311
%313 = OpLogicalAnd %bool %310 %312
%314 = OpFOrdEqual %v3bool %129 %129
%315 = OpAll %bool %314
%316 = OpLogicalAnd %bool %313 %315
OpBranch %305
%305 = OpLabel
%317 = OpPhi %bool %false %290 %316 %304
OpStore %_0_ok %317
%319 = OpMatrixTimesMatrix %mat2v2float %69 %36
OpStore %_7_m22 %319
OpSelectionMerge %321 None
OpBranchConditional %317 %320 %321
%320 = OpLabel
%322 = OpCompositeExtract %v2float %319 0
%323 = OpFOrdEqual %v2bool %322 %152
%324 = OpAll %bool %323
%325 = OpCompositeExtract %v2float %319 1
%326 = OpFOrdEqual %v2bool %325 %153
%327 = OpAll %bool %326
%328 = OpLogicalAnd %bool %324 %327
OpBranch %321
%321 = OpLabel
%329 = OpPhi %bool %false %305 %328 %320
OpStore %_0_ok %329
%331 = OpMatrixTimesMatrix %mat3v3float %130 %89
OpStore %_8_m33 %331
OpSelectionMerge %333 None
OpBranchConditional %329 %332 %333
%332 = OpLabel
%334 = OpCompositeExtract %v3float %331 0
%335 = OpFOrdEqual %v3bool %334 %170
%336 = OpAll %bool %335
%337 = OpCompositeExtract %v3float %331 1
%338 = OpFOrdEqual %v3bool %337 %171
%339 = OpAll %bool %338
%340 = OpLogicalAnd %bool %336 %339
%341 = OpCompositeExtract %v3float %331 2
%342 = OpFOrdEqual %v3bool %341 %172
%343 = OpAll %bool %342
%344 = OpLogicalAnd %bool %340 %343
OpBranch %333
%333 = OpLabel
%345 = OpPhi %bool %false %321 %344 %332
OpStore %_0_ok %345
%346 = OpFAdd %v3float %34 %187
%347 = OpFAdd %v3float %35 %187
%348 = OpCompositeConstruct %mat2v3float %346 %347
OpStore %_1_m23 %348
OpSelectionMerge %350 None
OpBranchConditional %345 %349 %350
%349 = OpLabel
%351 = OpFOrdEqual %v3bool %346 %194
%352 = OpAll %bool %351
%353 = OpFOrdEqual %v3bool %347 %195
%354 = OpAll %bool %353
%355 = OpLogicalAnd %bool %352 %354
OpBranch %350
%350 = OpLabel
%356 = OpPhi %bool %false %333 %355 %349
OpStore %_0_ok %356
%357 = OpFSub %v2float %67 %203
%358 = OpFSub %v2float %68 %203
%359 = OpFSub %v2float %20 %203
%360 = OpCompositeConstruct %mat3v2float %357 %358 %359
OpStore %_3_m32 %360
OpSelectionMerge %362 None
OpBranchConditional %356 %361 %362
%361 = OpLabel
%363 = OpFOrdEqual %v2bool %357 %212
%364 = OpAll %bool %363
%365 = OpFOrdEqual %v2bool %358 %213
%366 = OpAll %bool %365
%367 = OpLogicalAnd %bool %364 %366
%368 = OpFOrdEqual %v2bool %359 %214
%369 = OpAll %bool %368
%370 = OpLogicalAnd %bool %367 %369
OpBranch %362
%362 = OpLabel
%371 = OpPhi %bool %false %350 %370 %361
OpStore %_0_ok %371
%372 = OpFDiv %v4float %51 %225
%373 = OpFDiv %v4float %52 %225
%374 = OpCompositeConstruct %mat2v4float %372 %373
OpStore %_2_m24 %374
OpSelectionMerge %376 None
OpBranchConditional %371 %375 %376
%375 = OpLabel
%377 = OpFOrdEqual %v4bool %372 %233
%378 = OpAll %bool %377
%379 = OpFOrdEqual %v4bool %373 %234
%380 = OpAll %bool %379
%381 = OpLogicalAnd %bool %378 %380
OpBranch %376
%376 = OpLabel
%382 = OpPhi %bool %false %362 %381 %375
OpStore %_0_ok %382
OpSelectionMerge %384 None
OpBranchConditional %382 %383 %384
%383 = OpLabel
%385 = OpFunctionCall %bool %test_half_b
OpBranch %384
%384 = OpLabel
%386 = OpPhi %bool %false %376 %385 %383
OpSelectionMerge %391 None
OpBranchConditional %386 %389 %390
%389 = OpLabel
%392 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%396 = OpLoad %v4float %392
OpStore %387 %396
OpBranch %391
%390 = OpLabel
%397 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%399 = OpLoad %v4float %397
OpStore %387 %399
OpBranch %391
%391 = OpLabel
%400 = OpLoad %v4float %387
OpReturnValue %400
OpFunctionEnd