skia2/tests/sksl/shared/Matrices.asm.frag
John Stiles 6011bbcf48 Fix comma operator support with matrices in Metal.
MetalCodeGen would incorrectly identify `(someMatrix, someScalar)` as a
math operation between `someMatrix` and `someScalar` and attempt to
convert `someScalar` to a matrix. If `someScalar` was a Boolean type,
this would lead to an assertion.

The binary expression is now checked more thoroughly before converting
the scalar into a matrix.

Change-Id: Id7e104d5533d8c43375927d4815b83e1a3c36be1
Bug: skia:11125
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/410682
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-05-20 18:08:35 +00:00

941 lines
33 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 %m1 "m1"
OpName %m3 "m3"
OpName %m4 "m4"
OpName %m5 "m5"
OpName %m7 "m7"
OpName %m9 "m9"
OpName %m10 "m10"
OpName %m11 "m11"
OpName %test_comma_b "test_comma_b"
OpName %x "x"
OpName %y "y"
OpName %main "main"
OpName %_0_ok "_0_ok"
OpName %_1_m1 "_1_m1"
OpName %_2_m3 "_2_m3"
OpName %_3_m4 "_3_m4"
OpName %_4_m5 "_4_m5"
OpName %_5_m7 "_5_m7"
OpName %_6_m9 "_6_m9"
OpName %_7_m10 "_7_m10"
OpName %_8_m11 "_8_m11"
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 %12 Binding 0
OpDecorate %12 DescriptorSet 0
OpDecorate %m1 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %41 RelaxedPrecision
OpDecorate %44 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %46 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %m3 RelaxedPrecision
OpDecorate %60 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %64 RelaxedPrecision
OpDecorate %65 RelaxedPrecision
OpDecorate %66 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %m4 RelaxedPrecision
OpDecorate %80 RelaxedPrecision
OpDecorate %81 RelaxedPrecision
OpDecorate %82 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
OpDecorate %86 RelaxedPrecision
OpDecorate %87 RelaxedPrecision
OpDecorate %88 RelaxedPrecision
OpDecorate %89 RelaxedPrecision
OpDecorate %100 RelaxedPrecision
OpDecorate %101 RelaxedPrecision
OpDecorate %102 RelaxedPrecision
OpDecorate %103 RelaxedPrecision
OpDecorate %106 RelaxedPrecision
OpDecorate %110 RelaxedPrecision
OpDecorate %111 RelaxedPrecision
OpDecorate %112 RelaxedPrecision
OpDecorate %m5 RelaxedPrecision
OpDecorate %127 RelaxedPrecision
OpDecorate %128 RelaxedPrecision
OpDecorate %129 RelaxedPrecision
OpDecorate %130 RelaxedPrecision
OpDecorate %131 RelaxedPrecision
OpDecorate %132 RelaxedPrecision
OpDecorate %135 RelaxedPrecision
OpDecorate %136 RelaxedPrecision
OpDecorate %137 RelaxedPrecision
OpDecorate %138 RelaxedPrecision
OpDecorate %149 RelaxedPrecision
OpDecorate %150 RelaxedPrecision
OpDecorate %151 RelaxedPrecision
OpDecorate %152 RelaxedPrecision
OpDecorate %153 RelaxedPrecision
OpDecorate %154 RelaxedPrecision
OpDecorate %155 RelaxedPrecision
OpDecorate %156 RelaxedPrecision
OpDecorate %157 RelaxedPrecision
OpDecorate %158 RelaxedPrecision
OpDecorate %161 RelaxedPrecision
OpDecorate %164 RelaxedPrecision
OpDecorate %165 RelaxedPrecision
OpDecorate %166 RelaxedPrecision
OpDecorate %m7 RelaxedPrecision
OpDecorate %179 RelaxedPrecision
OpDecorate %180 RelaxedPrecision
OpDecorate %181 RelaxedPrecision
OpDecorate %182 RelaxedPrecision
OpDecorate %185 RelaxedPrecision
OpDecorate %186 RelaxedPrecision
OpDecorate %187 RelaxedPrecision
OpDecorate %188 RelaxedPrecision
OpDecorate %m9 RelaxedPrecision
OpDecorate %204 RelaxedPrecision
OpDecorate %205 RelaxedPrecision
OpDecorate %206 RelaxedPrecision
OpDecorate %207 RelaxedPrecision
OpDecorate %208 RelaxedPrecision
OpDecorate %211 RelaxedPrecision
OpDecorate %212 RelaxedPrecision
OpDecorate %213 RelaxedPrecision
OpDecorate %214 RelaxedPrecision
OpDecorate %215 RelaxedPrecision
OpDecorate %m10 RelaxedPrecision
OpDecorate %236 RelaxedPrecision
OpDecorate %237 RelaxedPrecision
OpDecorate %238 RelaxedPrecision
OpDecorate %239 RelaxedPrecision
OpDecorate %240 RelaxedPrecision
OpDecorate %241 RelaxedPrecision
OpDecorate %244 RelaxedPrecision
OpDecorate %245 RelaxedPrecision
OpDecorate %246 RelaxedPrecision
OpDecorate %247 RelaxedPrecision
OpDecorate %248 RelaxedPrecision
OpDecorate %249 RelaxedPrecision
OpDecorate %m11 RelaxedPrecision
OpDecorate %273 RelaxedPrecision
OpDecorate %274 RelaxedPrecision
OpDecorate %275 RelaxedPrecision
OpDecorate %276 RelaxedPrecision
OpDecorate %277 RelaxedPrecision
OpDecorate %278 RelaxedPrecision
OpDecorate %279 RelaxedPrecision
OpDecorate %280 RelaxedPrecision
OpDecorate %281 RelaxedPrecision
OpDecorate %282 RelaxedPrecision
OpDecorate %283 RelaxedPrecision
OpDecorate %284 RelaxedPrecision
OpDecorate %285 RelaxedPrecision
OpDecorate %286 RelaxedPrecision
OpDecorate %287 RelaxedPrecision
OpDecorate %288 RelaxedPrecision
OpDecorate %289 RelaxedPrecision
OpDecorate %290 RelaxedPrecision
OpDecorate %291 RelaxedPrecision
OpDecorate %292 RelaxedPrecision
OpDecorate %293 RelaxedPrecision
OpDecorate %296 RelaxedPrecision
OpDecorate %297 RelaxedPrecision
OpDecorate %298 RelaxedPrecision
OpDecorate %299 RelaxedPrecision
OpDecorate %300 RelaxedPrecision
OpDecorate %301 RelaxedPrecision
OpDecorate %322 RelaxedPrecision
OpDecorate %353 RelaxedPrecision
OpDecorate %372 RelaxedPrecision
OpDecorate %393 RelaxedPrecision
OpDecorate %413 RelaxedPrecision
OpDecorate %437 RelaxedPrecision
OpDecorate %463 RelaxedPrecision
OpDecorate %484 RelaxedPrecision
OpDecorate %506 RelaxedPrecision
OpDecorate %535 RelaxedPrecision
OpDecorate %585 RelaxedPrecision
OpDecorate %614 RelaxedPrecision
OpDecorate %631 RelaxedPrecision
OpDecorate %633 RelaxedPrecision
OpDecorate %634 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
%12 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
%void = OpTypeVoid
%17 = OpTypeFunction %void
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%21 = OpConstantComposite %v2float %float_0 %float_0
%_ptr_Function_v2float = OpTypePointer Function %v2float
%25 = OpTypeFunction %bool
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
%mat2v2float = OpTypeMatrix %v2float 2
%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
%float_1 = OpConstant %float 1
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%false = OpConstantFalse %bool
%v2bool = OpTypeVector %bool 2
%float_6 = OpConstant %float 6
%float_12 = OpConstant %float 12
%float_18 = OpConstant %float 18
%float_24 = OpConstant %float 24
%int = OpTypeInt 32 1
%int_1 = OpConstant %int 1
%float_5 = OpConstant %float 5
%float_8 = OpConstant %float 8
%float_7 = OpConstant %float 7
%v3float = OpTypeVector %float 3
%mat3v3float = OpTypeMatrix %v3float 3
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
%float_9 = OpConstant %float 9
%v3bool = OpTypeVector %bool 3
%mat4v4float = OpTypeMatrix %v4float 4
%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
%float_11 = OpConstant %float 11
%v4bool = OpTypeVector %bool 4
%float_20 = OpConstant %float 20
%float_0_5 = OpConstant %float 0.5
%345 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int_0 = OpConstant %int 0
%_entrypoint_v = OpFunction %void None %17
%18 = OpLabel
%22 = OpVariable %_ptr_Function_v2float Function
OpStore %22 %21
%24 = OpFunctionCall %v4float %main %22
OpStore %sk_FragColor %24
OpReturn
OpFunctionEnd
%test_half_b = OpFunction %bool None %25
%26 = OpLabel
%ok = OpVariable %_ptr_Function_bool Function
%m1 = OpVariable %_ptr_Function_mat2v2float Function
%m3 = OpVariable %_ptr_Function_mat2v2float Function
%m4 = OpVariable %_ptr_Function_mat2v2float Function
%m5 = OpVariable %_ptr_Function_mat2v2float Function
%m7 = OpVariable %_ptr_Function_mat2v2float Function
%m9 = OpVariable %_ptr_Function_mat3v3float Function
%m10 = OpVariable %_ptr_Function_mat4v4float Function
%m11 = OpVariable %_ptr_Function_mat4v4float Function
OpStore %ok %true
%38 = OpCompositeConstruct %v2float %float_1 %float_2
%39 = OpCompositeConstruct %v2float %float_3 %float_4
%37 = OpCompositeConstruct %mat2v2float %38 %39
OpStore %m1 %37
%41 = OpLoad %bool %ok
OpSelectionMerge %43 None
OpBranchConditional %41 %42 %43
%42 = OpLabel
%44 = OpLoad %mat2v2float %m1
%46 = OpCompositeConstruct %v2float %float_1 %float_2
%47 = OpCompositeConstruct %v2float %float_3 %float_4
%45 = OpCompositeConstruct %mat2v2float %46 %47
%49 = OpCompositeExtract %v2float %44 0
%50 = OpCompositeExtract %v2float %45 0
%51 = OpFOrdEqual %v2bool %49 %50
%52 = OpAll %bool %51
%53 = OpCompositeExtract %v2float %44 1
%54 = OpCompositeExtract %v2float %45 1
%55 = OpFOrdEqual %v2bool %53 %54
%56 = OpAll %bool %55
%57 = OpLogicalAnd %bool %52 %56
OpBranch %43
%43 = OpLabel
%58 = OpPhi %bool %false %26 %57 %42
OpStore %ok %58
%60 = OpLoad %mat2v2float %m1
OpStore %m3 %60
%61 = OpLoad %bool %ok
OpSelectionMerge %63 None
OpBranchConditional %61 %62 %63
%62 = OpLabel
%64 = OpLoad %mat2v2float %m3
%66 = OpCompositeConstruct %v2float %float_1 %float_2
%67 = OpCompositeConstruct %v2float %float_3 %float_4
%65 = OpCompositeConstruct %mat2v2float %66 %67
%68 = OpCompositeExtract %v2float %64 0
%69 = OpCompositeExtract %v2float %65 0
%70 = OpFOrdEqual %v2bool %68 %69
%71 = OpAll %bool %70
%72 = OpCompositeExtract %v2float %64 1
%73 = OpCompositeExtract %v2float %65 1
%74 = OpFOrdEqual %v2bool %72 %73
%75 = OpAll %bool %74
%76 = OpLogicalAnd %bool %71 %75
OpBranch %63
%63 = OpLabel
%77 = OpPhi %bool %false %43 %76 %62
OpStore %ok %77
%81 = OpCompositeConstruct %v2float %float_6 %float_0
%82 = OpCompositeConstruct %v2float %float_0 %float_6
%80 = OpCompositeConstruct %mat2v2float %81 %82
OpStore %m4 %80
%83 = OpLoad %bool %ok
OpSelectionMerge %85 None
OpBranchConditional %83 %84 %85
%84 = OpLabel
%86 = OpLoad %mat2v2float %m4
%88 = OpCompositeConstruct %v2float %float_6 %float_0
%89 = OpCompositeConstruct %v2float %float_0 %float_6
%87 = OpCompositeConstruct %mat2v2float %88 %89
%90 = OpCompositeExtract %v2float %86 0
%91 = OpCompositeExtract %v2float %87 0
%92 = OpFOrdEqual %v2bool %90 %91
%93 = OpAll %bool %92
%94 = OpCompositeExtract %v2float %86 1
%95 = OpCompositeExtract %v2float %87 1
%96 = OpFOrdEqual %v2bool %94 %95
%97 = OpAll %bool %96
%98 = OpLogicalAnd %bool %93 %97
OpBranch %85
%85 = OpLabel
%99 = OpPhi %bool %false %63 %98 %84
OpStore %ok %99
%100 = OpLoad %mat2v2float %m3
%101 = OpLoad %mat2v2float %m4
%102 = OpMatrixTimesMatrix %mat2v2float %100 %101
OpStore %m3 %102
%103 = OpLoad %bool %ok
OpSelectionMerge %105 None
OpBranchConditional %103 %104 %105
%104 = OpLabel
%106 = OpLoad %mat2v2float %m3
%111 = OpCompositeConstruct %v2float %float_6 %float_12
%112 = OpCompositeConstruct %v2float %float_18 %float_24
%110 = OpCompositeConstruct %mat2v2float %111 %112
%113 = OpCompositeExtract %v2float %106 0
%114 = OpCompositeExtract %v2float %110 0
%115 = OpFOrdEqual %v2bool %113 %114
%116 = OpAll %bool %115
%117 = OpCompositeExtract %v2float %106 1
%118 = OpCompositeExtract %v2float %110 1
%119 = OpFOrdEqual %v2bool %117 %118
%120 = OpAll %bool %119
%121 = OpLogicalAnd %bool %116 %120
OpBranch %105
%105 = OpLabel
%122 = OpPhi %bool %false %85 %121 %104
OpStore %ok %122
%126 = OpAccessChain %_ptr_Function_v2float %m1 %int_1
%127 = OpLoad %v2float %126
%128 = OpCompositeExtract %float %127 1
%130 = OpCompositeConstruct %v2float %128 %float_0
%131 = OpCompositeConstruct %v2float %float_0 %128
%129 = OpCompositeConstruct %mat2v2float %130 %131
OpStore %m5 %129
%132 = OpLoad %bool %ok
OpSelectionMerge %134 None
OpBranchConditional %132 %133 %134
%133 = OpLabel
%135 = OpLoad %mat2v2float %m5
%137 = OpCompositeConstruct %v2float %float_4 %float_0
%138 = OpCompositeConstruct %v2float %float_0 %float_4
%136 = OpCompositeConstruct %mat2v2float %137 %138
%139 = OpCompositeExtract %v2float %135 0
%140 = OpCompositeExtract %v2float %136 0
%141 = OpFOrdEqual %v2bool %139 %140
%142 = OpAll %bool %141
%143 = OpCompositeExtract %v2float %135 1
%144 = OpCompositeExtract %v2float %136 1
%145 = OpFOrdEqual %v2bool %143 %144
%146 = OpAll %bool %145
%147 = OpLogicalAnd %bool %142 %146
OpBranch %134
%134 = OpLabel
%148 = OpPhi %bool %false %105 %147 %133
OpStore %ok %148
%149 = OpLoad %mat2v2float %m1
%150 = OpLoad %mat2v2float %m5
%151 = OpCompositeExtract %v2float %149 0
%152 = OpCompositeExtract %v2float %150 0
%153 = OpFAdd %v2float %151 %152
%154 = OpCompositeExtract %v2float %149 1
%155 = OpCompositeExtract %v2float %150 1
%156 = OpFAdd %v2float %154 %155
%157 = OpCompositeConstruct %mat2v2float %153 %156
OpStore %m1 %157
%158 = OpLoad %bool %ok
OpSelectionMerge %160 None
OpBranchConditional %158 %159 %160
%159 = OpLabel
%161 = OpLoad %mat2v2float %m1
%165 = OpCompositeConstruct %v2float %float_5 %float_2
%166 = OpCompositeConstruct %v2float %float_3 %float_8
%164 = OpCompositeConstruct %mat2v2float %165 %166
%167 = OpCompositeExtract %v2float %161 0
%168 = OpCompositeExtract %v2float %164 0
%169 = OpFOrdEqual %v2bool %167 %168
%170 = OpAll %bool %169
%171 = OpCompositeExtract %v2float %161 1
%172 = OpCompositeExtract %v2float %164 1
%173 = OpFOrdEqual %v2bool %171 %172
%174 = OpAll %bool %173
%175 = OpLogicalAnd %bool %170 %174
OpBranch %160
%160 = OpLabel
%176 = OpPhi %bool %false %134 %175 %159
OpStore %ok %176
%180 = OpCompositeConstruct %v2float %float_5 %float_6
%181 = OpCompositeConstruct %v2float %float_7 %float_8
%179 = OpCompositeConstruct %mat2v2float %180 %181
OpStore %m7 %179
%182 = OpLoad %bool %ok
OpSelectionMerge %184 None
OpBranchConditional %182 %183 %184
%183 = OpLabel
%185 = OpLoad %mat2v2float %m7
%187 = OpCompositeConstruct %v2float %float_5 %float_6
%188 = OpCompositeConstruct %v2float %float_7 %float_8
%186 = OpCompositeConstruct %mat2v2float %187 %188
%189 = OpCompositeExtract %v2float %185 0
%190 = OpCompositeExtract %v2float %186 0
%191 = OpFOrdEqual %v2bool %189 %190
%192 = OpAll %bool %191
%193 = OpCompositeExtract %v2float %185 1
%194 = OpCompositeExtract %v2float %186 1
%195 = OpFOrdEqual %v2bool %193 %194
%196 = OpAll %bool %195
%197 = OpLogicalAnd %bool %192 %196
OpBranch %184
%184 = OpLabel
%198 = OpPhi %bool %false %160 %197 %183
OpStore %ok %198
%205 = OpCompositeConstruct %v3float %float_9 %float_0 %float_0
%206 = OpCompositeConstruct %v3float %float_0 %float_9 %float_0
%207 = OpCompositeConstruct %v3float %float_0 %float_0 %float_9
%204 = OpCompositeConstruct %mat3v3float %205 %206 %207
OpStore %m9 %204
%208 = OpLoad %bool %ok
OpSelectionMerge %210 None
OpBranchConditional %208 %209 %210
%209 = OpLabel
%211 = OpLoad %mat3v3float %m9
%213 = OpCompositeConstruct %v3float %float_9 %float_0 %float_0
%214 = OpCompositeConstruct %v3float %float_0 %float_9 %float_0
%215 = OpCompositeConstruct %v3float %float_0 %float_0 %float_9
%212 = OpCompositeConstruct %mat3v3float %213 %214 %215
%217 = OpCompositeExtract %v3float %211 0
%218 = OpCompositeExtract %v3float %212 0
%219 = OpFOrdEqual %v3bool %217 %218
%220 = OpAll %bool %219
%221 = OpCompositeExtract %v3float %211 1
%222 = OpCompositeExtract %v3float %212 1
%223 = OpFOrdEqual %v3bool %221 %222
%224 = OpAll %bool %223
%225 = OpLogicalAnd %bool %220 %224
%226 = OpCompositeExtract %v3float %211 2
%227 = OpCompositeExtract %v3float %212 2
%228 = OpFOrdEqual %v3bool %226 %227
%229 = OpAll %bool %228
%230 = OpLogicalAnd %bool %225 %229
OpBranch %210
%210 = OpLabel
%231 = OpPhi %bool %false %184 %230 %209
OpStore %ok %231
%237 = OpCompositeConstruct %v4float %float_11 %float_0 %float_0 %float_0
%238 = OpCompositeConstruct %v4float %float_0 %float_11 %float_0 %float_0
%239 = OpCompositeConstruct %v4float %float_0 %float_0 %float_11 %float_0
%240 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_11
%236 = OpCompositeConstruct %mat4v4float %237 %238 %239 %240
OpStore %m10 %236
%241 = OpLoad %bool %ok
OpSelectionMerge %243 None
OpBranchConditional %241 %242 %243
%242 = OpLabel
%244 = OpLoad %mat4v4float %m10
%246 = OpCompositeConstruct %v4float %float_11 %float_0 %float_0 %float_0
%247 = OpCompositeConstruct %v4float %float_0 %float_11 %float_0 %float_0
%248 = OpCompositeConstruct %v4float %float_0 %float_0 %float_11 %float_0
%249 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_11
%245 = OpCompositeConstruct %mat4v4float %246 %247 %248 %249
%251 = OpCompositeExtract %v4float %244 0
%252 = OpCompositeExtract %v4float %245 0
%253 = OpFOrdEqual %v4bool %251 %252
%254 = OpAll %bool %253
%255 = OpCompositeExtract %v4float %244 1
%256 = OpCompositeExtract %v4float %245 1
%257 = OpFOrdEqual %v4bool %255 %256
%258 = OpAll %bool %257
%259 = OpLogicalAnd %bool %254 %258
%260 = OpCompositeExtract %v4float %244 2
%261 = OpCompositeExtract %v4float %245 2
%262 = OpFOrdEqual %v4bool %260 %261
%263 = OpAll %bool %262
%264 = OpLogicalAnd %bool %259 %263
%265 = OpCompositeExtract %v4float %244 3
%266 = OpCompositeExtract %v4float %245 3
%267 = OpFOrdEqual %v4bool %265 %266
%268 = OpAll %bool %267
%269 = OpLogicalAnd %bool %264 %268
OpBranch %243
%243 = OpLabel
%270 = OpPhi %bool %false %210 %269 %242
OpStore %ok %270
%274 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%275 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%276 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%277 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%273 = OpCompositeConstruct %mat4v4float %274 %275 %276 %277
OpStore %m11 %273
%278 = OpLoad %mat4v4float %m11
%279 = OpLoad %mat4v4float %m10
%280 = OpCompositeExtract %v4float %278 0
%281 = OpCompositeExtract %v4float %279 0
%282 = OpFSub %v4float %280 %281
%283 = OpCompositeExtract %v4float %278 1
%284 = OpCompositeExtract %v4float %279 1
%285 = OpFSub %v4float %283 %284
%286 = OpCompositeExtract %v4float %278 2
%287 = OpCompositeExtract %v4float %279 2
%288 = OpFSub %v4float %286 %287
%289 = OpCompositeExtract %v4float %278 3
%290 = OpCompositeExtract %v4float %279 3
%291 = OpFSub %v4float %289 %290
%292 = OpCompositeConstruct %mat4v4float %282 %285 %288 %291
OpStore %m11 %292
%293 = OpLoad %bool %ok
OpSelectionMerge %295 None
OpBranchConditional %293 %294 %295
%294 = OpLabel
%296 = OpLoad %mat4v4float %m11
%298 = OpCompositeConstruct %v4float %float_9 %float_20 %float_20 %float_20
%299 = OpCompositeConstruct %v4float %float_20 %float_9 %float_20 %float_20
%300 = OpCompositeConstruct %v4float %float_20 %float_20 %float_9 %float_20
%301 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_9
%297 = OpCompositeConstruct %mat4v4float %298 %299 %300 %301
%302 = OpCompositeExtract %v4float %296 0
%303 = OpCompositeExtract %v4float %297 0
%304 = OpFOrdEqual %v4bool %302 %303
%305 = OpAll %bool %304
%306 = OpCompositeExtract %v4float %296 1
%307 = OpCompositeExtract %v4float %297 1
%308 = OpFOrdEqual %v4bool %306 %307
%309 = OpAll %bool %308
%310 = OpLogicalAnd %bool %305 %309
%311 = OpCompositeExtract %v4float %296 2
%312 = OpCompositeExtract %v4float %297 2
%313 = OpFOrdEqual %v4bool %311 %312
%314 = OpAll %bool %313
%315 = OpLogicalAnd %bool %310 %314
%316 = OpCompositeExtract %v4float %296 3
%317 = OpCompositeExtract %v4float %297 3
%318 = OpFOrdEqual %v4bool %316 %317
%319 = OpAll %bool %318
%320 = OpLogicalAnd %bool %315 %319
OpBranch %295
%295 = OpLabel
%321 = OpPhi %bool %false %243 %320 %294
OpStore %ok %321
%322 = OpLoad %bool %ok
OpReturnValue %322
OpFunctionEnd
%test_comma_b = OpFunction %bool None %25
%323 = OpLabel
%x = OpVariable %_ptr_Function_mat2v2float Function
%y = OpVariable %_ptr_Function_mat2v2float Function
%327 = OpCompositeConstruct %v2float %float_1 %float_2
%328 = OpCompositeConstruct %v2float %float_3 %float_4
%326 = OpCompositeConstruct %mat2v2float %327 %328
OpStore %x %326
%331 = OpCompositeConstruct %v2float %float_2 %float_4
%332 = OpCompositeConstruct %v2float %float_6 %float_8
%330 = OpCompositeConstruct %mat2v2float %331 %332
%333 = OpMatrixTimesScalar %mat2v2float %330 %float_0_5
OpStore %y %333
%334 = OpLoad %mat2v2float %x
%335 = OpLoad %mat2v2float %y
%336 = OpCompositeExtract %v2float %334 0
%337 = OpCompositeExtract %v2float %335 0
%338 = OpFOrdEqual %v2bool %336 %337
%339 = OpAll %bool %338
%340 = OpCompositeExtract %v2float %334 1
%341 = OpCompositeExtract %v2float %335 1
%342 = OpFOrdEqual %v2bool %340 %341
%343 = OpAll %bool %342
%344 = OpLogicalAnd %bool %339 %343
OpReturnValue %344
OpFunctionEnd
%main = OpFunction %v4float None %345
%346 = OpFunctionParameter %_ptr_Function_v2float
%347 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function
%_1_m1 = OpVariable %_ptr_Function_mat2v2float Function
%_2_m3 = OpVariable %_ptr_Function_mat2v2float Function
%_3_m4 = OpVariable %_ptr_Function_mat2v2float Function
%_4_m5 = OpVariable %_ptr_Function_mat2v2float Function
%_5_m7 = OpVariable %_ptr_Function_mat2v2float Function
%_6_m9 = OpVariable %_ptr_Function_mat3v3float Function
%_7_m10 = OpVariable %_ptr_Function_mat4v4float Function
%_8_m11 = OpVariable %_ptr_Function_mat4v4float Function
%623 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true
%351 = OpCompositeConstruct %v2float %float_1 %float_2
%352 = OpCompositeConstruct %v2float %float_3 %float_4
%350 = OpCompositeConstruct %mat2v2float %351 %352
OpStore %_1_m1 %350
%353 = OpLoad %bool %_0_ok
OpSelectionMerge %355 None
OpBranchConditional %353 %354 %355
%354 = OpLabel
%356 = OpLoad %mat2v2float %_1_m1
%358 = OpCompositeConstruct %v2float %float_1 %float_2
%359 = OpCompositeConstruct %v2float %float_3 %float_4
%357 = OpCompositeConstruct %mat2v2float %358 %359
%360 = OpCompositeExtract %v2float %356 0
%361 = OpCompositeExtract %v2float %357 0
%362 = OpFOrdEqual %v2bool %360 %361
%363 = OpAll %bool %362
%364 = OpCompositeExtract %v2float %356 1
%365 = OpCompositeExtract %v2float %357 1
%366 = OpFOrdEqual %v2bool %364 %365
%367 = OpAll %bool %366
%368 = OpLogicalAnd %bool %363 %367
OpBranch %355
%355 = OpLabel
%369 = OpPhi %bool %false %347 %368 %354
OpStore %_0_ok %369
%371 = OpLoad %mat2v2float %_1_m1
OpStore %_2_m3 %371
%372 = OpLoad %bool %_0_ok
OpSelectionMerge %374 None
OpBranchConditional %372 %373 %374
%373 = OpLabel
%375 = OpLoad %mat2v2float %_2_m3
%377 = OpCompositeConstruct %v2float %float_1 %float_2
%378 = OpCompositeConstruct %v2float %float_3 %float_4
%376 = OpCompositeConstruct %mat2v2float %377 %378
%379 = OpCompositeExtract %v2float %375 0
%380 = OpCompositeExtract %v2float %376 0
%381 = OpFOrdEqual %v2bool %379 %380
%382 = OpAll %bool %381
%383 = OpCompositeExtract %v2float %375 1
%384 = OpCompositeExtract %v2float %376 1
%385 = OpFOrdEqual %v2bool %383 %384
%386 = OpAll %bool %385
%387 = OpLogicalAnd %bool %382 %386
OpBranch %374
%374 = OpLabel
%388 = OpPhi %bool %false %355 %387 %373
OpStore %_0_ok %388
%391 = OpCompositeConstruct %v2float %float_6 %float_0
%392 = OpCompositeConstruct %v2float %float_0 %float_6
%390 = OpCompositeConstruct %mat2v2float %391 %392
OpStore %_3_m4 %390
%393 = OpLoad %bool %_0_ok
OpSelectionMerge %395 None
OpBranchConditional %393 %394 %395
%394 = OpLabel
%396 = OpLoad %mat2v2float %_3_m4
%398 = OpCompositeConstruct %v2float %float_6 %float_0
%399 = OpCompositeConstruct %v2float %float_0 %float_6
%397 = OpCompositeConstruct %mat2v2float %398 %399
%400 = OpCompositeExtract %v2float %396 0
%401 = OpCompositeExtract %v2float %397 0
%402 = OpFOrdEqual %v2bool %400 %401
%403 = OpAll %bool %402
%404 = OpCompositeExtract %v2float %396 1
%405 = OpCompositeExtract %v2float %397 1
%406 = OpFOrdEqual %v2bool %404 %405
%407 = OpAll %bool %406
%408 = OpLogicalAnd %bool %403 %407
OpBranch %395
%395 = OpLabel
%409 = OpPhi %bool %false %374 %408 %394
OpStore %_0_ok %409
%410 = OpLoad %mat2v2float %_2_m3
%411 = OpLoad %mat2v2float %_3_m4
%412 = OpMatrixTimesMatrix %mat2v2float %410 %411
OpStore %_2_m3 %412
%413 = OpLoad %bool %_0_ok
OpSelectionMerge %415 None
OpBranchConditional %413 %414 %415
%414 = OpLabel
%416 = OpLoad %mat2v2float %_2_m3
%418 = OpCompositeConstruct %v2float %float_6 %float_12
%419 = OpCompositeConstruct %v2float %float_18 %float_24
%417 = OpCompositeConstruct %mat2v2float %418 %419
%420 = OpCompositeExtract %v2float %416 0
%421 = OpCompositeExtract %v2float %417 0
%422 = OpFOrdEqual %v2bool %420 %421
%423 = OpAll %bool %422
%424 = OpCompositeExtract %v2float %416 1
%425 = OpCompositeExtract %v2float %417 1
%426 = OpFOrdEqual %v2bool %424 %425
%427 = OpAll %bool %426
%428 = OpLogicalAnd %bool %423 %427
OpBranch %415
%415 = OpLabel
%429 = OpPhi %bool %false %395 %428 %414
OpStore %_0_ok %429
%431 = OpAccessChain %_ptr_Function_v2float %_1_m1 %int_1
%432 = OpLoad %v2float %431
%433 = OpCompositeExtract %float %432 1
%435 = OpCompositeConstruct %v2float %433 %float_0
%436 = OpCompositeConstruct %v2float %float_0 %433
%434 = OpCompositeConstruct %mat2v2float %435 %436
OpStore %_4_m5 %434
%437 = OpLoad %bool %_0_ok
OpSelectionMerge %439 None
OpBranchConditional %437 %438 %439
%438 = OpLabel
%440 = OpLoad %mat2v2float %_4_m5
%442 = OpCompositeConstruct %v2float %float_4 %float_0
%443 = OpCompositeConstruct %v2float %float_0 %float_4
%441 = OpCompositeConstruct %mat2v2float %442 %443
%444 = OpCompositeExtract %v2float %440 0
%445 = OpCompositeExtract %v2float %441 0
%446 = OpFOrdEqual %v2bool %444 %445
%447 = OpAll %bool %446
%448 = OpCompositeExtract %v2float %440 1
%449 = OpCompositeExtract %v2float %441 1
%450 = OpFOrdEqual %v2bool %448 %449
%451 = OpAll %bool %450
%452 = OpLogicalAnd %bool %447 %451
OpBranch %439
%439 = OpLabel
%453 = OpPhi %bool %false %415 %452 %438
OpStore %_0_ok %453
%454 = OpLoad %mat2v2float %_1_m1
%455 = OpLoad %mat2v2float %_4_m5
%456 = OpCompositeExtract %v2float %454 0
%457 = OpCompositeExtract %v2float %455 0
%458 = OpFAdd %v2float %456 %457
%459 = OpCompositeExtract %v2float %454 1
%460 = OpCompositeExtract %v2float %455 1
%461 = OpFAdd %v2float %459 %460
%462 = OpCompositeConstruct %mat2v2float %458 %461
OpStore %_1_m1 %462
%463 = OpLoad %bool %_0_ok
OpSelectionMerge %465 None
OpBranchConditional %463 %464 %465
%464 = OpLabel
%466 = OpLoad %mat2v2float %_1_m1
%468 = OpCompositeConstruct %v2float %float_5 %float_2
%469 = OpCompositeConstruct %v2float %float_3 %float_8
%467 = OpCompositeConstruct %mat2v2float %468 %469
%470 = OpCompositeExtract %v2float %466 0
%471 = OpCompositeExtract %v2float %467 0
%472 = OpFOrdEqual %v2bool %470 %471
%473 = OpAll %bool %472
%474 = OpCompositeExtract %v2float %466 1
%475 = OpCompositeExtract %v2float %467 1
%476 = OpFOrdEqual %v2bool %474 %475
%477 = OpAll %bool %476
%478 = OpLogicalAnd %bool %473 %477
OpBranch %465
%465 = OpLabel
%479 = OpPhi %bool %false %439 %478 %464
OpStore %_0_ok %479
%482 = OpCompositeConstruct %v2float %float_5 %float_6
%483 = OpCompositeConstruct %v2float %float_7 %float_8
%481 = OpCompositeConstruct %mat2v2float %482 %483
OpStore %_5_m7 %481
%484 = OpLoad %bool %_0_ok
OpSelectionMerge %486 None
OpBranchConditional %484 %485 %486
%485 = OpLabel
%487 = OpLoad %mat2v2float %_5_m7
%489 = OpCompositeConstruct %v2float %float_5 %float_6
%490 = OpCompositeConstruct %v2float %float_7 %float_8
%488 = OpCompositeConstruct %mat2v2float %489 %490
%491 = OpCompositeExtract %v2float %487 0
%492 = OpCompositeExtract %v2float %488 0
%493 = OpFOrdEqual %v2bool %491 %492
%494 = OpAll %bool %493
%495 = OpCompositeExtract %v2float %487 1
%496 = OpCompositeExtract %v2float %488 1
%497 = OpFOrdEqual %v2bool %495 %496
%498 = OpAll %bool %497
%499 = OpLogicalAnd %bool %494 %498
OpBranch %486
%486 = OpLabel
%500 = OpPhi %bool %false %465 %499 %485
OpStore %_0_ok %500
%503 = OpCompositeConstruct %v3float %float_9 %float_0 %float_0
%504 = OpCompositeConstruct %v3float %float_0 %float_9 %float_0
%505 = OpCompositeConstruct %v3float %float_0 %float_0 %float_9
%502 = OpCompositeConstruct %mat3v3float %503 %504 %505
OpStore %_6_m9 %502
%506 = OpLoad %bool %_0_ok
OpSelectionMerge %508 None
OpBranchConditional %506 %507 %508
%507 = OpLabel
%509 = OpLoad %mat3v3float %_6_m9
%511 = OpCompositeConstruct %v3float %float_9 %float_0 %float_0
%512 = OpCompositeConstruct %v3float %float_0 %float_9 %float_0
%513 = OpCompositeConstruct %v3float %float_0 %float_0 %float_9
%510 = OpCompositeConstruct %mat3v3float %511 %512 %513
%514 = OpCompositeExtract %v3float %509 0
%515 = OpCompositeExtract %v3float %510 0
%516 = OpFOrdEqual %v3bool %514 %515
%517 = OpAll %bool %516
%518 = OpCompositeExtract %v3float %509 1
%519 = OpCompositeExtract %v3float %510 1
%520 = OpFOrdEqual %v3bool %518 %519
%521 = OpAll %bool %520
%522 = OpLogicalAnd %bool %517 %521
%523 = OpCompositeExtract %v3float %509 2
%524 = OpCompositeExtract %v3float %510 2
%525 = OpFOrdEqual %v3bool %523 %524
%526 = OpAll %bool %525
%527 = OpLogicalAnd %bool %522 %526
OpBranch %508
%508 = OpLabel
%528 = OpPhi %bool %false %486 %527 %507
OpStore %_0_ok %528
%531 = OpCompositeConstruct %v4float %float_11 %float_0 %float_0 %float_0
%532 = OpCompositeConstruct %v4float %float_0 %float_11 %float_0 %float_0
%533 = OpCompositeConstruct %v4float %float_0 %float_0 %float_11 %float_0
%534 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_11
%530 = OpCompositeConstruct %mat4v4float %531 %532 %533 %534
OpStore %_7_m10 %530
%535 = OpLoad %bool %_0_ok
OpSelectionMerge %537 None
OpBranchConditional %535 %536 %537
%536 = OpLabel
%538 = OpLoad %mat4v4float %_7_m10
%540 = OpCompositeConstruct %v4float %float_11 %float_0 %float_0 %float_0
%541 = OpCompositeConstruct %v4float %float_0 %float_11 %float_0 %float_0
%542 = OpCompositeConstruct %v4float %float_0 %float_0 %float_11 %float_0
%543 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_11
%539 = OpCompositeConstruct %mat4v4float %540 %541 %542 %543
%544 = OpCompositeExtract %v4float %538 0
%545 = OpCompositeExtract %v4float %539 0
%546 = OpFOrdEqual %v4bool %544 %545
%547 = OpAll %bool %546
%548 = OpCompositeExtract %v4float %538 1
%549 = OpCompositeExtract %v4float %539 1
%550 = OpFOrdEqual %v4bool %548 %549
%551 = OpAll %bool %550
%552 = OpLogicalAnd %bool %547 %551
%553 = OpCompositeExtract %v4float %538 2
%554 = OpCompositeExtract %v4float %539 2
%555 = OpFOrdEqual %v4bool %553 %554
%556 = OpAll %bool %555
%557 = OpLogicalAnd %bool %552 %556
%558 = OpCompositeExtract %v4float %538 3
%559 = OpCompositeExtract %v4float %539 3
%560 = OpFOrdEqual %v4bool %558 %559
%561 = OpAll %bool %560
%562 = OpLogicalAnd %bool %557 %561
OpBranch %537
%537 = OpLabel
%563 = OpPhi %bool %false %508 %562 %536
OpStore %_0_ok %563
%566 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%567 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%568 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%569 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_20
%565 = OpCompositeConstruct %mat4v4float %566 %567 %568 %569
OpStore %_8_m11 %565
%570 = OpLoad %mat4v4float %_8_m11
%571 = OpLoad %mat4v4float %_7_m10
%572 = OpCompositeExtract %v4float %570 0
%573 = OpCompositeExtract %v4float %571 0
%574 = OpFSub %v4float %572 %573
%575 = OpCompositeExtract %v4float %570 1
%576 = OpCompositeExtract %v4float %571 1
%577 = OpFSub %v4float %575 %576
%578 = OpCompositeExtract %v4float %570 2
%579 = OpCompositeExtract %v4float %571 2
%580 = OpFSub %v4float %578 %579
%581 = OpCompositeExtract %v4float %570 3
%582 = OpCompositeExtract %v4float %571 3
%583 = OpFSub %v4float %581 %582
%584 = OpCompositeConstruct %mat4v4float %574 %577 %580 %583
OpStore %_8_m11 %584
%585 = OpLoad %bool %_0_ok
OpSelectionMerge %587 None
OpBranchConditional %585 %586 %587
%586 = OpLabel
%588 = OpLoad %mat4v4float %_8_m11
%590 = OpCompositeConstruct %v4float %float_9 %float_20 %float_20 %float_20
%591 = OpCompositeConstruct %v4float %float_20 %float_9 %float_20 %float_20
%592 = OpCompositeConstruct %v4float %float_20 %float_20 %float_9 %float_20
%593 = OpCompositeConstruct %v4float %float_20 %float_20 %float_20 %float_9
%589 = OpCompositeConstruct %mat4v4float %590 %591 %592 %593
%594 = OpCompositeExtract %v4float %588 0
%595 = OpCompositeExtract %v4float %589 0
%596 = OpFOrdEqual %v4bool %594 %595
%597 = OpAll %bool %596
%598 = OpCompositeExtract %v4float %588 1
%599 = OpCompositeExtract %v4float %589 1
%600 = OpFOrdEqual %v4bool %598 %599
%601 = OpAll %bool %600
%602 = OpLogicalAnd %bool %597 %601
%603 = OpCompositeExtract %v4float %588 2
%604 = OpCompositeExtract %v4float %589 2
%605 = OpFOrdEqual %v4bool %603 %604
%606 = OpAll %bool %605
%607 = OpLogicalAnd %bool %602 %606
%608 = OpCompositeExtract %v4float %588 3
%609 = OpCompositeExtract %v4float %589 3
%610 = OpFOrdEqual %v4bool %608 %609
%611 = OpAll %bool %610
%612 = OpLogicalAnd %bool %607 %611
OpBranch %587
%587 = OpLabel
%613 = OpPhi %bool %false %537 %612 %586
OpStore %_0_ok %613
%614 = OpLoad %bool %_0_ok
OpSelectionMerge %616 None
OpBranchConditional %614 %615 %616
%615 = OpLabel
%617 = OpFunctionCall %bool %test_half_b
OpBranch %616
%616 = OpLabel
%618 = OpPhi %bool %false %587 %617 %615
OpSelectionMerge %620 None
OpBranchConditional %618 %619 %620
%619 = OpLabel
%621 = OpFunctionCall %bool %test_comma_b
OpBranch %620
%620 = OpLabel
%622 = OpPhi %bool %false %616 %621 %619
OpSelectionMerge %627 None
OpBranchConditional %622 %625 %626
%625 = OpLabel
%628 = OpAccessChain %_ptr_Uniform_v4float %12 %int_0
%631 = OpLoad %v4float %628
OpStore %623 %631
OpBranch %627
%626 = OpLabel
%632 = OpAccessChain %_ptr_Uniform_v4float %12 %int_1
%633 = OpLoad %v4float %632
OpStore %623 %633
OpBranch %627
%627 = OpLabel
%634 = OpLoad %v4float %623
OpReturnValue %634
OpFunctionEnd