Add support for componentwise matrix divide in SPIR-V.

All the pieces of the puzzle were already here to support componentwise
addition and subtraction of matrices. Division was just a forgotten gap
in the implementation and is now patched up to match + and -.

NOTE: if you read the SPIR-V output very closely, you may be surprised
that there are fewer FDiv operations than you'd expect from reading the
input SkSL. As it turns out, a preexisting optimization is rewriting
`mat / 4` into `mat * 0.25` (see line 2689), and this rewritten form can
use the dedicated MatrixTimesScalar op. So we only get componentwise
FDivs for the `4 / mat` lines in the source.

Change-Id: I011c859f5b3a031fbb95a2956f1194a5f3b3794b
Bug: skia:11985
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/408639
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
John Stiles 2021-05-17 09:34:23 -04:00 committed by Skia Commit-Bot
parent c1f6411045
commit bdf3bb7b5f
6 changed files with 766 additions and 649 deletions

View File

@ -41,6 +41,9 @@ bool test_float() {
ok = ok && (m32 == float3x2(2, -2,
-2, 2,
-2, -2));
m24 /= 4;
ok = ok && (m24 == float2x4(0.75, 0, 0, 0,
0, 0.75, 0, 0));
return ok;
}
@ -85,6 +88,9 @@ bool test_half() {
ok = ok && (m32 == half3x2(2, -2,
-2, 2,
-2, -2));
m24 /= 4;
ok = ok && (m24 == half2x4(0.75, 0, 0, 0,
0, 0.75, 0, 0));
return ok;
}

View File

@ -2528,6 +2528,10 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs,
return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFMul,
SpvOpIMul, SpvOpIMul, SpvOpUndef, out);
case Token::Kind::TK_SLASH:
if (leftType.isMatrix() && rightType.isMatrix()) {
SkASSERT(leftType == rightType);
return this->writeComponentwiseMatrixBinary(leftType, lhs, rhs, SpvOpFDiv, out);
}
return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFDiv,
SpvOpSDiv, SpvOpUDiv, SpvOpUndef, out);
case Token::Kind::TK_PERCENT:

View File

@ -145,19 +145,35 @@ OpDecorate %283 RelaxedPrecision
OpDecorate %284 RelaxedPrecision
OpDecorate %285 RelaxedPrecision
OpDecorate %301 RelaxedPrecision
OpDecorate %302 RelaxedPrecision
OpDecorate %303 RelaxedPrecision
OpDecorate %304 RelaxedPrecision
OpDecorate %305 RelaxedPrecision
OpDecorate %306 RelaxedPrecision
OpDecorate %307 RelaxedPrecision
OpDecorate %308 RelaxedPrecision
OpDecorate %309 RelaxedPrecision
OpDecorate %310 RelaxedPrecision
OpDecorate %331 RelaxedPrecision
OpDecorate %353 RelaxedPrecision
OpDecorate %311 RelaxedPrecision
OpDecorate %314 RelaxedPrecision
OpDecorate %316 RelaxedPrecision
OpDecorate %317 RelaxedPrecision
OpDecorate %318 RelaxedPrecision
OpDecorate %329 RelaxedPrecision
OpDecorate %338 RelaxedPrecision
OpDecorate %359 RelaxedPrecision
OpDecorate %381 RelaxedPrecision
OpDecorate %410 RelaxedPrecision
OpDecorate %443 RelaxedPrecision
OpDecorate %464 RelaxedPrecision
OpDecorate %497 RelaxedPrecision
OpDecorate %527 RelaxedPrecision
OpDecorate %550 RelaxedPrecision
OpDecorate %564 RelaxedPrecision
OpDecorate %567 RelaxedPrecision
OpDecorate %568 RelaxedPrecision
OpDecorate %409 RelaxedPrecision
OpDecorate %438 RelaxedPrecision
OpDecorate %471 RelaxedPrecision
OpDecorate %492 RelaxedPrecision
OpDecorate %525 RelaxedPrecision
OpDecorate %555 RelaxedPrecision
OpDecorate %588 RelaxedPrecision
OpDecorate %605 RelaxedPrecision
OpDecorate %619 RelaxedPrecision
OpDecorate %622 RelaxedPrecision
OpDecorate %623 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -205,7 +221,8 @@ OpDecorate %568 RelaxedPrecision
%float_35 = OpConstant %float 35
%float_1 = OpConstant %float 1
%float_n2 = OpConstant %float -2
%302 = OpTypeFunction %v4float %_ptr_Function_v2float
%float_0_75 = OpConstant %float 0.75
%330 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
@ -512,12 +529,44 @@ OpBranch %279
%279 = OpLabel
%300 = OpPhi %bool %false %249 %299 %278
OpStore %ok %300
%301 = OpLoad %bool %ok
OpReturnValue %301
%301 = OpLoad %mat2v4float %m24
%302 = OpCompositeConstruct %v4float %float_4 %float_4 %float_4 %float_4
%303 = OpCompositeConstruct %mat2v4float %302 %302
%304 = OpCompositeExtract %v4float %301 0
%305 = OpCompositeExtract %v4float %303 0
%306 = OpFDiv %v4float %304 %305
%307 = OpCompositeExtract %v4float %301 1
%308 = OpCompositeExtract %v4float %303 1
%309 = OpFDiv %v4float %307 %308
%310 = OpCompositeConstruct %mat2v4float %306 %309
OpStore %m24 %310
%311 = OpLoad %bool %ok
OpSelectionMerge %313 None
OpBranchConditional %311 %312 %313
%312 = OpLabel
%314 = OpLoad %mat2v4float %m24
%317 = OpCompositeConstruct %v4float %float_0_75 %float_0 %float_0 %float_0
%318 = OpCompositeConstruct %v4float %float_0 %float_0_75 %float_0 %float_0
%316 = OpCompositeConstruct %mat2v4float %317 %318
%319 = OpCompositeExtract %v4float %314 0
%320 = OpCompositeExtract %v4float %316 0
%321 = OpFOrdEqual %v4bool %319 %320
%322 = OpAll %bool %321
%323 = OpCompositeExtract %v4float %314 1
%324 = OpCompositeExtract %v4float %316 1
%325 = OpFOrdEqual %v4bool %323 %324
%326 = OpAll %bool %325
%327 = OpLogicalAnd %bool %322 %326
OpBranch %313
%313 = OpLabel
%328 = OpPhi %bool %false %279 %327 %312
OpStore %ok %328
%329 = OpLoad %bool %ok
OpReturnValue %329
OpFunctionEnd
%main = OpFunction %v4float None %302
%303 = OpFunctionParameter %_ptr_Function_v2float
%304 = OpLabel
%main = OpFunction %v4float None %330
%331 = OpFunctionParameter %_ptr_Function_v2float
%332 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function
%_1_m23 = OpVariable %_ptr_Function_mat2v3float Function
%_2_m24 = OpVariable %_ptr_Function_mat2v4float Function
@ -526,311 +575,343 @@ OpFunctionEnd
%_6_m43 = OpVariable %_ptr_Function_mat4v3float Function
%_7_m22 = OpVariable %_ptr_Function_mat2v2float Function
%_8_m33 = OpVariable %_ptr_Function_mat3v3float Function
%555 = OpVariable %_ptr_Function_v4float Function
%610 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true
%308 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%309 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%307 = OpCompositeConstruct %mat2v3float %308 %309
OpStore %_1_m23 %307
%310 = OpLoad %bool %_0_ok
OpSelectionMerge %312 None
OpBranchConditional %310 %311 %312
%311 = OpLabel
%313 = OpLoad %mat2v3float %_1_m23
%315 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%316 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%314 = OpCompositeConstruct %mat2v3float %315 %316
%317 = OpCompositeExtract %v3float %313 0
%318 = OpCompositeExtract %v3float %314 0
%319 = OpFOrdEqual %v3bool %317 %318
%320 = OpAll %bool %319
%321 = OpCompositeExtract %v3float %313 1
%322 = OpCompositeExtract %v3float %314 1
%323 = OpFOrdEqual %v3bool %321 %322
%324 = OpAll %bool %323
%325 = OpLogicalAnd %bool %320 %324
OpBranch %312
%312 = OpLabel
%326 = OpPhi %bool %false %304 %325 %311
OpStore %_0_ok %326
%329 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%330 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%328 = OpCompositeConstruct %mat2v4float %329 %330
OpStore %_2_m24 %328
%331 = OpLoad %bool %_0_ok
OpSelectionMerge %333 None
OpBranchConditional %331 %332 %333
%332 = OpLabel
%334 = OpLoad %mat2v4float %_2_m24
%336 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%337 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%335 = OpCompositeConstruct %mat2v4float %336 %337
%338 = OpCompositeExtract %v4float %334 0
%339 = OpCompositeExtract %v4float %335 0
%340 = OpFOrdEqual %v4bool %338 %339
%341 = OpAll %bool %340
%342 = OpCompositeExtract %v4float %334 1
%343 = OpCompositeExtract %v4float %335 1
%344 = OpFOrdEqual %v4bool %342 %343
%345 = OpAll %bool %344
%346 = OpLogicalAnd %bool %341 %345
OpBranch %333
%333 = OpLabel
%347 = OpPhi %bool %false %312 %346 %332
OpStore %_0_ok %347
%350 = OpCompositeConstruct %v2float %float_4 %float_0
%351 = OpCompositeConstruct %v2float %float_0 %float_4
%352 = OpCompositeConstruct %v2float %float_0 %float_0
%349 = OpCompositeConstruct %mat3v2float %350 %351 %352
OpStore %_3_m32 %349
%353 = OpLoad %bool %_0_ok
OpSelectionMerge %355 None
OpBranchConditional %353 %354 %355
%354 = OpLabel
%356 = OpLoad %mat3v2float %_3_m32
%358 = OpCompositeConstruct %v2float %float_4 %float_0
%359 = OpCompositeConstruct %v2float %float_0 %float_4
%360 = OpCompositeConstruct %v2float %float_0 %float_0
%357 = OpCompositeConstruct %mat3v2float %358 %359 %360
%361 = OpCompositeExtract %v2float %356 0
%362 = OpCompositeExtract %v2float %357 0
%363 = OpFOrdEqual %v2bool %361 %362
%364 = OpAll %bool %363
%365 = OpCompositeExtract %v2float %356 1
%366 = OpCompositeExtract %v2float %357 1
%367 = OpFOrdEqual %v2bool %365 %366
%368 = OpAll %bool %367
%369 = OpLogicalAnd %bool %364 %368
%370 = OpCompositeExtract %v2float %356 2
%371 = OpCompositeExtract %v2float %357 2
%372 = OpFOrdEqual %v2bool %370 %371
%336 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%337 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%335 = OpCompositeConstruct %mat2v3float %336 %337
OpStore %_1_m23 %335
%338 = OpLoad %bool %_0_ok
OpSelectionMerge %340 None
OpBranchConditional %338 %339 %340
%339 = OpLabel
%341 = OpLoad %mat2v3float %_1_m23
%343 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%344 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%342 = OpCompositeConstruct %mat2v3float %343 %344
%345 = OpCompositeExtract %v3float %341 0
%346 = OpCompositeExtract %v3float %342 0
%347 = OpFOrdEqual %v3bool %345 %346
%348 = OpAll %bool %347
%349 = OpCompositeExtract %v3float %341 1
%350 = OpCompositeExtract %v3float %342 1
%351 = OpFOrdEqual %v3bool %349 %350
%352 = OpAll %bool %351
%353 = OpLogicalAnd %bool %348 %352
OpBranch %340
%340 = OpLabel
%354 = OpPhi %bool %false %332 %353 %339
OpStore %_0_ok %354
%357 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%358 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%356 = OpCompositeConstruct %mat2v4float %357 %358
OpStore %_2_m24 %356
%359 = OpLoad %bool %_0_ok
OpSelectionMerge %361 None
OpBranchConditional %359 %360 %361
%360 = OpLabel
%362 = OpLoad %mat2v4float %_2_m24
%364 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%365 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%363 = OpCompositeConstruct %mat2v4float %364 %365
%366 = OpCompositeExtract %v4float %362 0
%367 = OpCompositeExtract %v4float %363 0
%368 = OpFOrdEqual %v4bool %366 %367
%369 = OpAll %bool %368
%370 = OpCompositeExtract %v4float %362 1
%371 = OpCompositeExtract %v4float %363 1
%372 = OpFOrdEqual %v4bool %370 %371
%373 = OpAll %bool %372
%374 = OpLogicalAnd %bool %369 %373
OpBranch %355
%355 = OpLabel
%375 = OpPhi %bool %false %333 %374 %354
OpBranch %361
%361 = OpLabel
%375 = OpPhi %bool %false %340 %374 %360
OpStore %_0_ok %375
%378 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%379 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%380 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%377 = OpCompositeConstruct %mat3v4float %378 %379 %380
OpStore %_4_m34 %377
%378 = OpCompositeConstruct %v2float %float_4 %float_0
%379 = OpCompositeConstruct %v2float %float_0 %float_4
%380 = OpCompositeConstruct %v2float %float_0 %float_0
%377 = OpCompositeConstruct %mat3v2float %378 %379 %380
OpStore %_3_m32 %377
%381 = OpLoad %bool %_0_ok
OpSelectionMerge %383 None
OpBranchConditional %381 %382 %383
%382 = OpLabel
%384 = OpLoad %mat3v4float %_4_m34
%386 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%387 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%388 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%385 = OpCompositeConstruct %mat3v4float %386 %387 %388
%389 = OpCompositeExtract %v4float %384 0
%390 = OpCompositeExtract %v4float %385 0
%391 = OpFOrdEqual %v4bool %389 %390
%384 = OpLoad %mat3v2float %_3_m32
%386 = OpCompositeConstruct %v2float %float_4 %float_0
%387 = OpCompositeConstruct %v2float %float_0 %float_4
%388 = OpCompositeConstruct %v2float %float_0 %float_0
%385 = OpCompositeConstruct %mat3v2float %386 %387 %388
%389 = OpCompositeExtract %v2float %384 0
%390 = OpCompositeExtract %v2float %385 0
%391 = OpFOrdEqual %v2bool %389 %390
%392 = OpAll %bool %391
%393 = OpCompositeExtract %v4float %384 1
%394 = OpCompositeExtract %v4float %385 1
%395 = OpFOrdEqual %v4bool %393 %394
%393 = OpCompositeExtract %v2float %384 1
%394 = OpCompositeExtract %v2float %385 1
%395 = OpFOrdEqual %v2bool %393 %394
%396 = OpAll %bool %395
%397 = OpLogicalAnd %bool %392 %396
%398 = OpCompositeExtract %v4float %384 2
%399 = OpCompositeExtract %v4float %385 2
%400 = OpFOrdEqual %v4bool %398 %399
%398 = OpCompositeExtract %v2float %384 2
%399 = OpCompositeExtract %v2float %385 2
%400 = OpFOrdEqual %v2bool %398 %399
%401 = OpAll %bool %400
%402 = OpLogicalAnd %bool %397 %401
OpBranch %383
%383 = OpLabel
%403 = OpPhi %bool %false %355 %402 %382
%403 = OpPhi %bool %false %361 %402 %382
OpStore %_0_ok %403
%406 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%407 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%408 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%409 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%405 = OpCompositeConstruct %mat4v3float %406 %407 %408 %409
OpStore %_6_m43 %405
%410 = OpLoad %bool %_0_ok
OpSelectionMerge %412 None
OpBranchConditional %410 %411 %412
%406 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%407 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%408 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%405 = OpCompositeConstruct %mat3v4float %406 %407 %408
OpStore %_4_m34 %405
%409 = OpLoad %bool %_0_ok
OpSelectionMerge %411 None
OpBranchConditional %409 %410 %411
%410 = OpLabel
%412 = OpLoad %mat3v4float %_4_m34
%414 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%415 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%416 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%413 = OpCompositeConstruct %mat3v4float %414 %415 %416
%417 = OpCompositeExtract %v4float %412 0
%418 = OpCompositeExtract %v4float %413 0
%419 = OpFOrdEqual %v4bool %417 %418
%420 = OpAll %bool %419
%421 = OpCompositeExtract %v4float %412 1
%422 = OpCompositeExtract %v4float %413 1
%423 = OpFOrdEqual %v4bool %421 %422
%424 = OpAll %bool %423
%425 = OpLogicalAnd %bool %420 %424
%426 = OpCompositeExtract %v4float %412 2
%427 = OpCompositeExtract %v4float %413 2
%428 = OpFOrdEqual %v4bool %426 %427
%429 = OpAll %bool %428
%430 = OpLogicalAnd %bool %425 %429
OpBranch %411
%411 = OpLabel
%413 = OpLoad %mat4v3float %_6_m43
%415 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%416 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%418 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%414 = OpCompositeConstruct %mat4v3float %415 %416 %417 %418
%419 = OpCompositeExtract %v3float %413 0
%420 = OpCompositeExtract %v3float %414 0
%421 = OpFOrdEqual %v3bool %419 %420
%422 = OpAll %bool %421
%423 = OpCompositeExtract %v3float %413 1
%424 = OpCompositeExtract %v3float %414 1
%425 = OpFOrdEqual %v3bool %423 %424
%426 = OpAll %bool %425
%427 = OpLogicalAnd %bool %422 %426
%428 = OpCompositeExtract %v3float %413 2
%429 = OpCompositeExtract %v3float %414 2
%430 = OpFOrdEqual %v3bool %428 %429
%431 = OpAll %bool %430
%432 = OpLogicalAnd %bool %427 %431
%433 = OpCompositeExtract %v3float %413 3
%434 = OpCompositeExtract %v3float %414 3
%435 = OpFOrdEqual %v3bool %433 %434
%436 = OpAll %bool %435
%437 = OpLogicalAnd %bool %432 %436
OpBranch %412
%412 = OpLabel
%438 = OpPhi %bool %false %383 %437 %411
OpStore %_0_ok %438
%440 = OpLoad %mat3v2float %_3_m32
%441 = OpLoad %mat2v3float %_1_m23
%442 = OpMatrixTimesMatrix %mat2v2float %440 %441
OpStore %_7_m22 %442
%443 = OpLoad %bool %_0_ok
OpSelectionMerge %445 None
OpBranchConditional %443 %444 %445
%444 = OpLabel
%446 = OpLoad %mat2v2float %_7_m22
%448 = OpCompositeConstruct %v2float %float_8 %float_0
%449 = OpCompositeConstruct %v2float %float_0 %float_8
%447 = OpCompositeConstruct %mat2v2float %448 %449
%450 = OpCompositeExtract %v2float %446 0
%451 = OpCompositeExtract %v2float %447 0
%452 = OpFOrdEqual %v2bool %450 %451
%453 = OpAll %bool %452
%454 = OpCompositeExtract %v2float %446 1
%455 = OpCompositeExtract %v2float %447 1
%456 = OpFOrdEqual %v2bool %454 %455
%457 = OpAll %bool %456
%458 = OpLogicalAnd %bool %453 %457
OpBranch %445
%445 = OpLabel
%459 = OpPhi %bool %false %412 %458 %444
OpStore %_0_ok %459
%461 = OpLoad %mat4v3float %_6_m43
%462 = OpLoad %mat3v4float %_4_m34
%463 = OpMatrixTimesMatrix %mat3v3float %461 %462
OpStore %_8_m33 %463
%464 = OpLoad %bool %_0_ok
OpSelectionMerge %466 None
OpBranchConditional %464 %465 %466
%465 = OpLabel
%467 = OpLoad %mat3v3float %_8_m33
%469 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0
%470 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0
%471 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35
%468 = OpCompositeConstruct %mat3v3float %469 %470 %471
%472 = OpCompositeExtract %v3float %467 0
%473 = OpCompositeExtract %v3float %468 0
%474 = OpFOrdEqual %v3bool %472 %473
%475 = OpAll %bool %474
%476 = OpCompositeExtract %v3float %467 1
%477 = OpCompositeExtract %v3float %468 1
%478 = OpFOrdEqual %v3bool %476 %477
%479 = OpAll %bool %478
%480 = OpLogicalAnd %bool %475 %479
%481 = OpCompositeExtract %v3float %467 2
%482 = OpCompositeExtract %v3float %468 2
%483 = OpFOrdEqual %v3bool %481 %482
%484 = OpAll %bool %483
%485 = OpLogicalAnd %bool %480 %484
OpBranch %466
%466 = OpLabel
%486 = OpPhi %bool %false %445 %485 %465
OpStore %_0_ok %486
%487 = OpLoad %mat2v3float %_1_m23
%488 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%489 = OpCompositeConstruct %mat2v3float %488 %488
%490 = OpCompositeExtract %v3float %487 0
%491 = OpCompositeExtract %v3float %489 0
%492 = OpFAdd %v3float %490 %491
%493 = OpCompositeExtract %v3float %487 1
%494 = OpCompositeExtract %v3float %489 1
%495 = OpFAdd %v3float %493 %494
%496 = OpCompositeConstruct %mat2v3float %492 %495
OpStore %_1_m23 %496
%497 = OpLoad %bool %_0_ok
OpSelectionMerge %499 None
OpBranchConditional %497 %498 %499
%498 = OpLabel
%500 = OpLoad %mat2v3float %_1_m23
%502 = OpCompositeConstruct %v3float %float_3 %float_1 %float_1
%503 = OpCompositeConstruct %v3float %float_1 %float_3 %float_1
%501 = OpCompositeConstruct %mat2v3float %502 %503
%504 = OpCompositeExtract %v3float %500 0
%505 = OpCompositeExtract %v3float %501 0
%431 = OpPhi %bool %false %383 %430 %410
OpStore %_0_ok %431
%434 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%435 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%436 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%437 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%433 = OpCompositeConstruct %mat4v3float %434 %435 %436 %437
OpStore %_6_m43 %433
%438 = OpLoad %bool %_0_ok
OpSelectionMerge %440 None
OpBranchConditional %438 %439 %440
%439 = OpLabel
%441 = OpLoad %mat4v3float %_6_m43
%443 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%444 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%445 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%446 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%442 = OpCompositeConstruct %mat4v3float %443 %444 %445 %446
%447 = OpCompositeExtract %v3float %441 0
%448 = OpCompositeExtract %v3float %442 0
%449 = OpFOrdEqual %v3bool %447 %448
%450 = OpAll %bool %449
%451 = OpCompositeExtract %v3float %441 1
%452 = OpCompositeExtract %v3float %442 1
%453 = OpFOrdEqual %v3bool %451 %452
%454 = OpAll %bool %453
%455 = OpLogicalAnd %bool %450 %454
%456 = OpCompositeExtract %v3float %441 2
%457 = OpCompositeExtract %v3float %442 2
%458 = OpFOrdEqual %v3bool %456 %457
%459 = OpAll %bool %458
%460 = OpLogicalAnd %bool %455 %459
%461 = OpCompositeExtract %v3float %441 3
%462 = OpCompositeExtract %v3float %442 3
%463 = OpFOrdEqual %v3bool %461 %462
%464 = OpAll %bool %463
%465 = OpLogicalAnd %bool %460 %464
OpBranch %440
%440 = OpLabel
%466 = OpPhi %bool %false %411 %465 %439
OpStore %_0_ok %466
%468 = OpLoad %mat3v2float %_3_m32
%469 = OpLoad %mat2v3float %_1_m23
%470 = OpMatrixTimesMatrix %mat2v2float %468 %469
OpStore %_7_m22 %470
%471 = OpLoad %bool %_0_ok
OpSelectionMerge %473 None
OpBranchConditional %471 %472 %473
%472 = OpLabel
%474 = OpLoad %mat2v2float %_7_m22
%476 = OpCompositeConstruct %v2float %float_8 %float_0
%477 = OpCompositeConstruct %v2float %float_0 %float_8
%475 = OpCompositeConstruct %mat2v2float %476 %477
%478 = OpCompositeExtract %v2float %474 0
%479 = OpCompositeExtract %v2float %475 0
%480 = OpFOrdEqual %v2bool %478 %479
%481 = OpAll %bool %480
%482 = OpCompositeExtract %v2float %474 1
%483 = OpCompositeExtract %v2float %475 1
%484 = OpFOrdEqual %v2bool %482 %483
%485 = OpAll %bool %484
%486 = OpLogicalAnd %bool %481 %485
OpBranch %473
%473 = OpLabel
%487 = OpPhi %bool %false %440 %486 %472
OpStore %_0_ok %487
%489 = OpLoad %mat4v3float %_6_m43
%490 = OpLoad %mat3v4float %_4_m34
%491 = OpMatrixTimesMatrix %mat3v3float %489 %490
OpStore %_8_m33 %491
%492 = OpLoad %bool %_0_ok
OpSelectionMerge %494 None
OpBranchConditional %492 %493 %494
%493 = OpLabel
%495 = OpLoad %mat3v3float %_8_m33
%497 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0
%498 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0
%499 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35
%496 = OpCompositeConstruct %mat3v3float %497 %498 %499
%500 = OpCompositeExtract %v3float %495 0
%501 = OpCompositeExtract %v3float %496 0
%502 = OpFOrdEqual %v3bool %500 %501
%503 = OpAll %bool %502
%504 = OpCompositeExtract %v3float %495 1
%505 = OpCompositeExtract %v3float %496 1
%506 = OpFOrdEqual %v3bool %504 %505
%507 = OpAll %bool %506
%508 = OpCompositeExtract %v3float %500 1
%509 = OpCompositeExtract %v3float %501 1
%510 = OpFOrdEqual %v3bool %508 %509
%511 = OpAll %bool %510
%512 = OpLogicalAnd %bool %507 %511
OpBranch %499
%499 = OpLabel
%513 = OpPhi %bool %false %466 %512 %498
OpStore %_0_ok %513
%514 = OpLoad %mat3v2float %_3_m32
%515 = OpCompositeConstruct %v2float %float_2 %float_2
%516 = OpCompositeConstruct %mat3v2float %515 %515 %515
%517 = OpCompositeExtract %v2float %514 0
%518 = OpCompositeExtract %v2float %516 0
%519 = OpFSub %v2float %517 %518
%520 = OpCompositeExtract %v2float %514 1
%521 = OpCompositeExtract %v2float %516 1
%522 = OpFSub %v2float %520 %521
%523 = OpCompositeExtract %v2float %514 2
%524 = OpCompositeExtract %v2float %516 2
%525 = OpFSub %v2float %523 %524
%526 = OpCompositeConstruct %mat3v2float %519 %522 %525
OpStore %_3_m32 %526
%527 = OpLoad %bool %_0_ok
OpSelectionMerge %529 None
OpBranchConditional %527 %528 %529
%528 = OpLabel
%530 = OpLoad %mat3v2float %_3_m32
%532 = OpCompositeConstruct %v2float %float_2 %float_n2
%533 = OpCompositeConstruct %v2float %float_n2 %float_2
%534 = OpCompositeConstruct %v2float %float_n2 %float_n2
%531 = OpCompositeConstruct %mat3v2float %532 %533 %534
%535 = OpCompositeExtract %v2float %530 0
%536 = OpCompositeExtract %v2float %531 0
%537 = OpFOrdEqual %v2bool %535 %536
%538 = OpAll %bool %537
%539 = OpCompositeExtract %v2float %530 1
%540 = OpCompositeExtract %v2float %531 1
%541 = OpFOrdEqual %v2bool %539 %540
%542 = OpAll %bool %541
%543 = OpLogicalAnd %bool %538 %542
%544 = OpCompositeExtract %v2float %530 2
%545 = OpCompositeExtract %v2float %531 2
%546 = OpFOrdEqual %v2bool %544 %545
%547 = OpAll %bool %546
%548 = OpLogicalAnd %bool %543 %547
OpBranch %529
%529 = OpLabel
%549 = OpPhi %bool %false %499 %548 %528
OpStore %_0_ok %549
%550 = OpLoad %bool %_0_ok
OpSelectionMerge %552 None
OpBranchConditional %550 %551 %552
%551 = OpLabel
%553 = OpFunctionCall %bool %test_half_b
OpBranch %552
%552 = OpLabel
%554 = OpPhi %bool %false %529 %553 %551
OpSelectionMerge %559 None
OpBranchConditional %554 %557 %558
%508 = OpLogicalAnd %bool %503 %507
%509 = OpCompositeExtract %v3float %495 2
%510 = OpCompositeExtract %v3float %496 2
%511 = OpFOrdEqual %v3bool %509 %510
%512 = OpAll %bool %511
%513 = OpLogicalAnd %bool %508 %512
OpBranch %494
%494 = OpLabel
%514 = OpPhi %bool %false %473 %513 %493
OpStore %_0_ok %514
%515 = OpLoad %mat2v3float %_1_m23
%516 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%517 = OpCompositeConstruct %mat2v3float %516 %516
%518 = OpCompositeExtract %v3float %515 0
%519 = OpCompositeExtract %v3float %517 0
%520 = OpFAdd %v3float %518 %519
%521 = OpCompositeExtract %v3float %515 1
%522 = OpCompositeExtract %v3float %517 1
%523 = OpFAdd %v3float %521 %522
%524 = OpCompositeConstruct %mat2v3float %520 %523
OpStore %_1_m23 %524
%525 = OpLoad %bool %_0_ok
OpSelectionMerge %527 None
OpBranchConditional %525 %526 %527
%526 = OpLabel
%528 = OpLoad %mat2v3float %_1_m23
%530 = OpCompositeConstruct %v3float %float_3 %float_1 %float_1
%531 = OpCompositeConstruct %v3float %float_1 %float_3 %float_1
%529 = OpCompositeConstruct %mat2v3float %530 %531
%532 = OpCompositeExtract %v3float %528 0
%533 = OpCompositeExtract %v3float %529 0
%534 = OpFOrdEqual %v3bool %532 %533
%535 = OpAll %bool %534
%536 = OpCompositeExtract %v3float %528 1
%537 = OpCompositeExtract %v3float %529 1
%538 = OpFOrdEqual %v3bool %536 %537
%539 = OpAll %bool %538
%540 = OpLogicalAnd %bool %535 %539
OpBranch %527
%527 = OpLabel
%541 = OpPhi %bool %false %494 %540 %526
OpStore %_0_ok %541
%542 = OpLoad %mat3v2float %_3_m32
%543 = OpCompositeConstruct %v2float %float_2 %float_2
%544 = OpCompositeConstruct %mat3v2float %543 %543 %543
%545 = OpCompositeExtract %v2float %542 0
%546 = OpCompositeExtract %v2float %544 0
%547 = OpFSub %v2float %545 %546
%548 = OpCompositeExtract %v2float %542 1
%549 = OpCompositeExtract %v2float %544 1
%550 = OpFSub %v2float %548 %549
%551 = OpCompositeExtract %v2float %542 2
%552 = OpCompositeExtract %v2float %544 2
%553 = OpFSub %v2float %551 %552
%554 = OpCompositeConstruct %mat3v2float %547 %550 %553
OpStore %_3_m32 %554
%555 = OpLoad %bool %_0_ok
OpSelectionMerge %557 None
OpBranchConditional %555 %556 %557
%556 = OpLabel
%558 = OpLoad %mat3v2float %_3_m32
%560 = OpCompositeConstruct %v2float %float_2 %float_n2
%561 = OpCompositeConstruct %v2float %float_n2 %float_2
%562 = OpCompositeConstruct %v2float %float_n2 %float_n2
%559 = OpCompositeConstruct %mat3v2float %560 %561 %562
%563 = OpCompositeExtract %v2float %558 0
%564 = OpCompositeExtract %v2float %559 0
%565 = OpFOrdEqual %v2bool %563 %564
%566 = OpAll %bool %565
%567 = OpCompositeExtract %v2float %558 1
%568 = OpCompositeExtract %v2float %559 1
%569 = OpFOrdEqual %v2bool %567 %568
%570 = OpAll %bool %569
%571 = OpLogicalAnd %bool %566 %570
%572 = OpCompositeExtract %v2float %558 2
%573 = OpCompositeExtract %v2float %559 2
%574 = OpFOrdEqual %v2bool %572 %573
%575 = OpAll %bool %574
%576 = OpLogicalAnd %bool %571 %575
OpBranch %557
%557 = OpLabel
%560 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%564 = OpLoad %v4float %560
OpStore %555 %564
OpBranch %559
%558 = OpLabel
%565 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%567 = OpLoad %v4float %565
OpStore %555 %567
OpBranch %559
%559 = OpLabel
%568 = OpLoad %v4float %555
OpReturnValue %568
%577 = OpPhi %bool %false %527 %576 %556
OpStore %_0_ok %577
%578 = OpLoad %mat2v4float %_2_m24
%579 = OpCompositeConstruct %v4float %float_4 %float_4 %float_4 %float_4
%580 = OpCompositeConstruct %mat2v4float %579 %579
%581 = OpCompositeExtract %v4float %578 0
%582 = OpCompositeExtract %v4float %580 0
%583 = OpFDiv %v4float %581 %582
%584 = OpCompositeExtract %v4float %578 1
%585 = OpCompositeExtract %v4float %580 1
%586 = OpFDiv %v4float %584 %585
%587 = OpCompositeConstruct %mat2v4float %583 %586
OpStore %_2_m24 %587
%588 = OpLoad %bool %_0_ok
OpSelectionMerge %590 None
OpBranchConditional %588 %589 %590
%589 = OpLabel
%591 = OpLoad %mat2v4float %_2_m24
%593 = OpCompositeConstruct %v4float %float_0_75 %float_0 %float_0 %float_0
%594 = OpCompositeConstruct %v4float %float_0 %float_0_75 %float_0 %float_0
%592 = OpCompositeConstruct %mat2v4float %593 %594
%595 = OpCompositeExtract %v4float %591 0
%596 = OpCompositeExtract %v4float %592 0
%597 = OpFOrdEqual %v4bool %595 %596
%598 = OpAll %bool %597
%599 = OpCompositeExtract %v4float %591 1
%600 = OpCompositeExtract %v4float %592 1
%601 = OpFOrdEqual %v4bool %599 %600
%602 = OpAll %bool %601
%603 = OpLogicalAnd %bool %598 %602
OpBranch %590
%590 = OpLabel
%604 = OpPhi %bool %false %557 %603 %589
OpStore %_0_ok %604
%605 = OpLoad %bool %_0_ok
OpSelectionMerge %607 None
OpBranchConditional %605 %606 %607
%606 = OpLabel
%608 = OpFunctionCall %bool %test_half_b
OpBranch %607
%607 = OpLabel
%609 = OpPhi %bool %false %590 %608 %606
OpSelectionMerge %614 None
OpBranchConditional %609 %612 %613
%612 = OpLabel
%615 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%619 = OpLoad %v4float %615
OpStore %610 %619
OpBranch %614
%613 = OpLabel
%620 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%622 = OpLoad %v4float %620
OpStore %610 %622
OpBranch %614
%614 = OpLabel
%623 = OpLoad %v4float %610
OpReturnValue %623
OpFunctionEnd

View File

@ -22,6 +22,8 @@ bool test_half_b() {
ok = ok && m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0);
m32 -= 2.0;
ok = ok && m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0);
m24 /= 4.0;
ok = ok && m24 == mat2x4(0.75, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0);
return ok;
}
vec4 main() {
@ -44,5 +46,7 @@ vec4 main() {
_0_ok = _0_ok && _1_m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0);
_3_m32 -= 2.0;
_0_ok = _0_ok && _3_m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0);
_2_m24 /= 4.0;
_0_ok = _0_ok && _2_m24 == mat2x4(0.75, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0);
return _0_ok && test_half_b() ? colorGreen : colorRed;
}

View File

@ -64,6 +64,13 @@ thread bool operator==(const float3x3 left, const float3x3 right) {
thread bool operator!=(const float3x3 left, const float3x3 right) {
return !(left == right);
}
thread float2x4 operator/(const float2x4 left, const float2x4 right) {
return float2x4(left[0] / right[0], left[1] / right[1]);
}
thread float2x4& operator/=(thread float2x4& left, thread const float2x4& right) {
left = left / right;
return left;
}
bool test_half_b() {
bool ok = true;
float2x3 m23 = float2x3(2.0);
@ -84,6 +91,8 @@ bool test_half_b() {
ok = ok && m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0));
m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0);
ok = ok && m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0));
m24 /= (float2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0);
ok = ok && m24 == float2x4(float4(0.75, 0.0, 0.0, 0.0), float4(0.0, 0.75, 0.0, 0.0));
return ok;
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
@ -108,6 +117,8 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
_0_ok = _0_ok && _1_m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0));
_3_m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0);
_0_ok = _0_ok && _3_m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0));
_2_m24 /= (float2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0);
_0_ok = _0_ok && _2_m24 == float2x4(float4(0.75, 0.0, 0.0, 0.0), float4(0.0, 0.75, 0.0, 0.0));
_out.sk_FragColor = _0_ok && test_half_b() ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -1,8 +1,3 @@
### Compilation failed:
error: SPIR-V validation error: Expected floating scalar or vector type as Result Type: FDiv
%283 = OpFDiv %mat2v2float %282 %277
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
@ -153,19 +148,25 @@ OpDecorate %283 RelaxedPrecision
OpDecorate %284 RelaxedPrecision
OpDecorate %285 RelaxedPrecision
OpDecorate %286 RelaxedPrecision
OpDecorate %298 RelaxedPrecision
OpDecorate %303 RelaxedPrecision
OpDecorate %341 RelaxedPrecision
OpDecorate %379 RelaxedPrecision
OpDecorate %406 RelaxedPrecision
OpDecorate %433 RelaxedPrecision
OpDecorate %471 RelaxedPrecision
OpDecorate %509 RelaxedPrecision
OpDecorate %536 RelaxedPrecision
OpDecorate %558 RelaxedPrecision
OpDecorate %572 RelaxedPrecision
OpDecorate %575 RelaxedPrecision
OpDecorate %576 RelaxedPrecision
OpDecorate %287 RelaxedPrecision
OpDecorate %288 RelaxedPrecision
OpDecorate %289 RelaxedPrecision
OpDecorate %290 RelaxedPrecision
OpDecorate %291 RelaxedPrecision
OpDecorate %292 RelaxedPrecision
OpDecorate %304 RelaxedPrecision
OpDecorate %309 RelaxedPrecision
OpDecorate %347 RelaxedPrecision
OpDecorate %385 RelaxedPrecision
OpDecorate %412 RelaxedPrecision
OpDecorate %439 RelaxedPrecision
OpDecorate %477 RelaxedPrecision
OpDecorate %515 RelaxedPrecision
OpDecorate %542 RelaxedPrecision
OpDecorate %570 RelaxedPrecision
OpDecorate %584 RelaxedPrecision
OpDecorate %587 RelaxedPrecision
OpDecorate %588 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -199,7 +200,7 @@ OpDecorate %576 RelaxedPrecision
%float_0_5 = OpConstant %float 0.5
%mat2v2float = OpTypeMatrix %v2float 2
%v2bool = OpTypeVector %bool 2
%299 = OpTypeFunction %v4float %_ptr_Function_v2float
%305 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
@ -487,342 +488,352 @@ OpBranchConditional %274 %275 %276
%277 = OpCompositeConstruct %mat2v2float %278 %279
%281 = OpCompositeConstruct %v2float %float_4 %float_4
%282 = OpCompositeConstruct %mat2v2float %281 %281
%283 = OpFDiv %mat2v2float %282 %277
%285 = OpCompositeConstruct %v2float %float_2 %float_2
%286 = OpCompositeConstruct %v2float %float_2 %float_2
%284 = OpCompositeConstruct %mat2v2float %285 %286
%288 = OpCompositeExtract %v2float %283 0
%289 = OpCompositeExtract %v2float %284 0
%290 = OpFOrdEqual %v2bool %288 %289
%291 = OpAll %bool %290
%292 = OpCompositeExtract %v2float %283 1
%293 = OpCompositeExtract %v2float %284 1
%294 = OpFOrdEqual %v2bool %292 %293
%295 = OpAll %bool %294
%296 = OpLogicalAnd %bool %291 %295
%283 = OpCompositeExtract %v2float %282 0
%284 = OpCompositeExtract %v2float %277 0
%285 = OpFDiv %v2float %283 %284
%286 = OpCompositeExtract %v2float %282 1
%287 = OpCompositeExtract %v2float %277 1
%288 = OpFDiv %v2float %286 %287
%289 = OpCompositeConstruct %mat2v2float %285 %288
%291 = OpCompositeConstruct %v2float %float_2 %float_2
%292 = OpCompositeConstruct %v2float %float_2 %float_2
%290 = OpCompositeConstruct %mat2v2float %291 %292
%294 = OpCompositeExtract %v2float %289 0
%295 = OpCompositeExtract %v2float %290 0
%296 = OpFOrdEqual %v2bool %294 %295
%297 = OpAll %bool %296
%298 = OpCompositeExtract %v2float %289 1
%299 = OpCompositeExtract %v2float %290 1
%300 = OpFOrdEqual %v2bool %298 %299
%301 = OpAll %bool %300
%302 = OpLogicalAnd %bool %297 %301
OpBranch %276
%276 = OpLabel
%297 = OpPhi %bool %false %249 %296 %275
OpStore %ok %297
%298 = OpLoad %bool %ok
OpReturnValue %298
%303 = OpPhi %bool %false %249 %302 %275
OpStore %ok %303
%304 = OpLoad %bool %ok
OpReturnValue %304
OpFunctionEnd
%main = OpFunction %v4float None %299
%300 = OpFunctionParameter %_ptr_Function_v2float
%301 = OpLabel
%main = OpFunction %v4float None %305
%306 = OpFunctionParameter %_ptr_Function_v2float
%307 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function
%563 = OpVariable %_ptr_Function_v4float Function
%575 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true
%303 = OpLoad %bool %_0_ok
OpSelectionMerge %305 None
OpBranchConditional %303 %304 %305
%304 = OpLabel
%307 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%308 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%309 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%306 = OpCompositeConstruct %mat3v3float %307 %308 %309
%310 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%311 = OpCompositeConstruct %mat3v3float %310 %310 %310
%312 = OpCompositeExtract %v3float %306 0
%313 = OpCompositeExtract %v3float %311 0
%314 = OpFAdd %v3float %312 %313
%315 = OpCompositeExtract %v3float %306 1
%316 = OpCompositeExtract %v3float %311 1
%317 = OpFAdd %v3float %315 %316
%318 = OpCompositeExtract %v3float %306 2
%319 = OpCompositeExtract %v3float %311 2
%309 = OpLoad %bool %_0_ok
OpSelectionMerge %311 None
OpBranchConditional %309 %310 %311
%310 = OpLabel
%313 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%314 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%315 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%312 = OpCompositeConstruct %mat3v3float %313 %314 %315
%316 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%317 = OpCompositeConstruct %mat3v3float %316 %316 %316
%318 = OpCompositeExtract %v3float %312 0
%319 = OpCompositeExtract %v3float %317 0
%320 = OpFAdd %v3float %318 %319
%321 = OpCompositeConstruct %mat3v3float %314 %317 %320
%323 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%324 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%325 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%322 = OpCompositeConstruct %mat3v3float %323 %324 %325
%326 = OpCompositeExtract %v3float %321 0
%327 = OpCompositeExtract %v3float %322 0
%328 = OpFOrdEqual %v3bool %326 %327
%329 = OpAll %bool %328
%330 = OpCompositeExtract %v3float %321 1
%331 = OpCompositeExtract %v3float %322 1
%332 = OpFOrdEqual %v3bool %330 %331
%333 = OpAll %bool %332
%334 = OpLogicalAnd %bool %329 %333
%335 = OpCompositeExtract %v3float %321 2
%336 = OpCompositeExtract %v3float %322 2
%337 = OpFOrdEqual %v3bool %335 %336
%338 = OpAll %bool %337
%339 = OpLogicalAnd %bool %334 %338
OpBranch %305
%305 = OpLabel
%340 = OpPhi %bool %false %301 %339 %304
OpStore %_0_ok %340
%341 = OpLoad %bool %_0_ok
OpSelectionMerge %343 None
OpBranchConditional %341 %342 %343
%342 = OpLabel
%345 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%346 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%347 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%344 = OpCompositeConstruct %mat3v3float %345 %346 %347
%348 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%349 = OpCompositeConstruct %mat3v3float %348 %348 %348
%350 = OpCompositeExtract %v3float %344 0
%351 = OpCompositeExtract %v3float %349 0
%352 = OpFSub %v3float %350 %351
%353 = OpCompositeExtract %v3float %344 1
%354 = OpCompositeExtract %v3float %349 1
%355 = OpFSub %v3float %353 %354
%356 = OpCompositeExtract %v3float %344 2
%357 = OpCompositeExtract %v3float %349 2
%321 = OpCompositeExtract %v3float %312 1
%322 = OpCompositeExtract %v3float %317 1
%323 = OpFAdd %v3float %321 %322
%324 = OpCompositeExtract %v3float %312 2
%325 = OpCompositeExtract %v3float %317 2
%326 = OpFAdd %v3float %324 %325
%327 = OpCompositeConstruct %mat3v3float %320 %323 %326
%329 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%330 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%331 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%328 = OpCompositeConstruct %mat3v3float %329 %330 %331
%332 = OpCompositeExtract %v3float %327 0
%333 = OpCompositeExtract %v3float %328 0
%334 = OpFOrdEqual %v3bool %332 %333
%335 = OpAll %bool %334
%336 = OpCompositeExtract %v3float %327 1
%337 = OpCompositeExtract %v3float %328 1
%338 = OpFOrdEqual %v3bool %336 %337
%339 = OpAll %bool %338
%340 = OpLogicalAnd %bool %335 %339
%341 = OpCompositeExtract %v3float %327 2
%342 = OpCompositeExtract %v3float %328 2
%343 = OpFOrdEqual %v3bool %341 %342
%344 = OpAll %bool %343
%345 = OpLogicalAnd %bool %340 %344
OpBranch %311
%311 = OpLabel
%346 = OpPhi %bool %false %307 %345 %310
OpStore %_0_ok %346
%347 = OpLoad %bool %_0_ok
OpSelectionMerge %349 None
OpBranchConditional %347 %348 %349
%348 = OpLabel
%351 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%352 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%353 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%350 = OpCompositeConstruct %mat3v3float %351 %352 %353
%354 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%355 = OpCompositeConstruct %mat3v3float %354 %354 %354
%356 = OpCompositeExtract %v3float %350 0
%357 = OpCompositeExtract %v3float %355 0
%358 = OpFSub %v3float %356 %357
%359 = OpCompositeConstruct %mat3v3float %352 %355 %358
%361 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4
%362 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4
%363 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2
%360 = OpCompositeConstruct %mat3v3float %361 %362 %363
%364 = OpCompositeExtract %v3float %359 0
%365 = OpCompositeExtract %v3float %360 0
%366 = OpFOrdEqual %v3bool %364 %365
%367 = OpAll %bool %366
%368 = OpCompositeExtract %v3float %359 1
%369 = OpCompositeExtract %v3float %360 1
%370 = OpFOrdEqual %v3bool %368 %369
%371 = OpAll %bool %370
%372 = OpLogicalAnd %bool %367 %371
%373 = OpCompositeExtract %v3float %359 2
%374 = OpCompositeExtract %v3float %360 2
%375 = OpFOrdEqual %v3bool %373 %374
%376 = OpAll %bool %375
%377 = OpLogicalAnd %bool %372 %376
OpBranch %343
%343 = OpLabel
%378 = OpPhi %bool %false %305 %377 %342
OpStore %_0_ok %378
%379 = OpLoad %bool %_0_ok
OpSelectionMerge %381 None
OpBranchConditional %379 %380 %381
%380 = OpLabel
%383 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%384 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%385 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%382 = OpCompositeConstruct %mat3v3float %383 %384 %385
%386 = OpMatrixTimesScalar %mat3v3float %382 %float_4
%388 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%389 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%390 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%387 = OpCompositeConstruct %mat3v3float %388 %389 %390
%391 = OpCompositeExtract %v3float %386 0
%392 = OpCompositeExtract %v3float %387 0
%393 = OpFOrdEqual %v3bool %391 %392
%394 = OpAll %bool %393
%395 = OpCompositeExtract %v3float %386 1
%396 = OpCompositeExtract %v3float %387 1
%397 = OpFOrdEqual %v3bool %395 %396
%398 = OpAll %bool %397
%399 = OpLogicalAnd %bool %394 %398
%400 = OpCompositeExtract %v3float %386 2
%401 = OpCompositeExtract %v3float %387 2
%402 = OpFOrdEqual %v3bool %400 %401
%403 = OpAll %bool %402
%404 = OpLogicalAnd %bool %399 %403
OpBranch %381
%381 = OpLabel
%405 = OpPhi %bool %false %343 %404 %380
OpStore %_0_ok %405
%406 = OpLoad %bool %_0_ok
OpSelectionMerge %408 None
OpBranchConditional %406 %407 %408
%407 = OpLabel
%410 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%411 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%412 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%409 = OpCompositeConstruct %mat3v3float %410 %411 %412
%413 = OpMatrixTimesScalar %mat3v3float %409 %float_0_25
%415 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0
%416 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0
%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5
%414 = OpCompositeConstruct %mat3v3float %415 %416 %417
%418 = OpCompositeExtract %v3float %413 0
%419 = OpCompositeExtract %v3float %414 0
%420 = OpFOrdEqual %v3bool %418 %419
%421 = OpAll %bool %420
%422 = OpCompositeExtract %v3float %413 1
%423 = OpCompositeExtract %v3float %414 1
%424 = OpFOrdEqual %v3bool %422 %423
%425 = OpAll %bool %424
%426 = OpLogicalAnd %bool %421 %425
%427 = OpCompositeExtract %v3float %413 2
%428 = OpCompositeExtract %v3float %414 2
%429 = OpFOrdEqual %v3bool %427 %428
%430 = OpAll %bool %429
%431 = OpLogicalAnd %bool %426 %430
OpBranch %408
%408 = OpLabel
%432 = OpPhi %bool %false %381 %431 %407
OpStore %_0_ok %432
%433 = OpLoad %bool %_0_ok
OpSelectionMerge %435 None
OpBranchConditional %433 %434 %435
%434 = OpLabel
%437 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%438 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%439 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%436 = OpCompositeConstruct %mat3v3float %437 %438 %439
%440 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%441 = OpCompositeConstruct %mat3v3float %440 %440 %440
%442 = OpCompositeExtract %v3float %441 0
%443 = OpCompositeExtract %v3float %436 0
%444 = OpFAdd %v3float %442 %443
%445 = OpCompositeExtract %v3float %441 1
%446 = OpCompositeExtract %v3float %436 1
%447 = OpFAdd %v3float %445 %446
%448 = OpCompositeExtract %v3float %441 2
%449 = OpCompositeExtract %v3float %436 2
%359 = OpCompositeExtract %v3float %350 1
%360 = OpCompositeExtract %v3float %355 1
%361 = OpFSub %v3float %359 %360
%362 = OpCompositeExtract %v3float %350 2
%363 = OpCompositeExtract %v3float %355 2
%364 = OpFSub %v3float %362 %363
%365 = OpCompositeConstruct %mat3v3float %358 %361 %364
%367 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4
%368 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4
%369 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2
%366 = OpCompositeConstruct %mat3v3float %367 %368 %369
%370 = OpCompositeExtract %v3float %365 0
%371 = OpCompositeExtract %v3float %366 0
%372 = OpFOrdEqual %v3bool %370 %371
%373 = OpAll %bool %372
%374 = OpCompositeExtract %v3float %365 1
%375 = OpCompositeExtract %v3float %366 1
%376 = OpFOrdEqual %v3bool %374 %375
%377 = OpAll %bool %376
%378 = OpLogicalAnd %bool %373 %377
%379 = OpCompositeExtract %v3float %365 2
%380 = OpCompositeExtract %v3float %366 2
%381 = OpFOrdEqual %v3bool %379 %380
%382 = OpAll %bool %381
%383 = OpLogicalAnd %bool %378 %382
OpBranch %349
%349 = OpLabel
%384 = OpPhi %bool %false %311 %383 %348
OpStore %_0_ok %384
%385 = OpLoad %bool %_0_ok
OpSelectionMerge %387 None
OpBranchConditional %385 %386 %387
%386 = OpLabel
%389 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%390 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%391 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%388 = OpCompositeConstruct %mat3v3float %389 %390 %391
%392 = OpMatrixTimesScalar %mat3v3float %388 %float_4
%394 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%395 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%396 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%393 = OpCompositeConstruct %mat3v3float %394 %395 %396
%397 = OpCompositeExtract %v3float %392 0
%398 = OpCompositeExtract %v3float %393 0
%399 = OpFOrdEqual %v3bool %397 %398
%400 = OpAll %bool %399
%401 = OpCompositeExtract %v3float %392 1
%402 = OpCompositeExtract %v3float %393 1
%403 = OpFOrdEqual %v3bool %401 %402
%404 = OpAll %bool %403
%405 = OpLogicalAnd %bool %400 %404
%406 = OpCompositeExtract %v3float %392 2
%407 = OpCompositeExtract %v3float %393 2
%408 = OpFOrdEqual %v3bool %406 %407
%409 = OpAll %bool %408
%410 = OpLogicalAnd %bool %405 %409
OpBranch %387
%387 = OpLabel
%411 = OpPhi %bool %false %349 %410 %386
OpStore %_0_ok %411
%412 = OpLoad %bool %_0_ok
OpSelectionMerge %414 None
OpBranchConditional %412 %413 %414
%413 = OpLabel
%416 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%417 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%418 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%415 = OpCompositeConstruct %mat3v3float %416 %417 %418
%419 = OpMatrixTimesScalar %mat3v3float %415 %float_0_25
%421 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0
%422 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0
%423 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5
%420 = OpCompositeConstruct %mat3v3float %421 %422 %423
%424 = OpCompositeExtract %v3float %419 0
%425 = OpCompositeExtract %v3float %420 0
%426 = OpFOrdEqual %v3bool %424 %425
%427 = OpAll %bool %426
%428 = OpCompositeExtract %v3float %419 1
%429 = OpCompositeExtract %v3float %420 1
%430 = OpFOrdEqual %v3bool %428 %429
%431 = OpAll %bool %430
%432 = OpLogicalAnd %bool %427 %431
%433 = OpCompositeExtract %v3float %419 2
%434 = OpCompositeExtract %v3float %420 2
%435 = OpFOrdEqual %v3bool %433 %434
%436 = OpAll %bool %435
%437 = OpLogicalAnd %bool %432 %436
OpBranch %414
%414 = OpLabel
%438 = OpPhi %bool %false %387 %437 %413
OpStore %_0_ok %438
%439 = OpLoad %bool %_0_ok
OpSelectionMerge %441 None
OpBranchConditional %439 %440 %441
%440 = OpLabel
%443 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%444 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%445 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%442 = OpCompositeConstruct %mat3v3float %443 %444 %445
%446 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%447 = OpCompositeConstruct %mat3v3float %446 %446 %446
%448 = OpCompositeExtract %v3float %447 0
%449 = OpCompositeExtract %v3float %442 0
%450 = OpFAdd %v3float %448 %449
%451 = OpCompositeConstruct %mat3v3float %444 %447 %450
%453 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%454 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%455 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%452 = OpCompositeConstruct %mat3v3float %453 %454 %455
%456 = OpCompositeExtract %v3float %451 0
%457 = OpCompositeExtract %v3float %452 0
%458 = OpFOrdEqual %v3bool %456 %457
%459 = OpAll %bool %458
%460 = OpCompositeExtract %v3float %451 1
%461 = OpCompositeExtract %v3float %452 1
%462 = OpFOrdEqual %v3bool %460 %461
%463 = OpAll %bool %462
%464 = OpLogicalAnd %bool %459 %463
%465 = OpCompositeExtract %v3float %451 2
%466 = OpCompositeExtract %v3float %452 2
%467 = OpFOrdEqual %v3bool %465 %466
%468 = OpAll %bool %467
%469 = OpLogicalAnd %bool %464 %468
OpBranch %435
%435 = OpLabel
%470 = OpPhi %bool %false %408 %469 %434
OpStore %_0_ok %470
%471 = OpLoad %bool %_0_ok
OpSelectionMerge %473 None
OpBranchConditional %471 %472 %473
%472 = OpLabel
%475 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%476 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%477 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%474 = OpCompositeConstruct %mat3v3float %475 %476 %477
%478 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%479 = OpCompositeConstruct %mat3v3float %478 %478 %478
%480 = OpCompositeExtract %v3float %479 0
%481 = OpCompositeExtract %v3float %474 0
%482 = OpFSub %v3float %480 %481
%483 = OpCompositeExtract %v3float %479 1
%484 = OpCompositeExtract %v3float %474 1
%485 = OpFSub %v3float %483 %484
%486 = OpCompositeExtract %v3float %479 2
%487 = OpCompositeExtract %v3float %474 2
%451 = OpCompositeExtract %v3float %447 1
%452 = OpCompositeExtract %v3float %442 1
%453 = OpFAdd %v3float %451 %452
%454 = OpCompositeExtract %v3float %447 2
%455 = OpCompositeExtract %v3float %442 2
%456 = OpFAdd %v3float %454 %455
%457 = OpCompositeConstruct %mat3v3float %450 %453 %456
%459 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%460 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%461 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%458 = OpCompositeConstruct %mat3v3float %459 %460 %461
%462 = OpCompositeExtract %v3float %457 0
%463 = OpCompositeExtract %v3float %458 0
%464 = OpFOrdEqual %v3bool %462 %463
%465 = OpAll %bool %464
%466 = OpCompositeExtract %v3float %457 1
%467 = OpCompositeExtract %v3float %458 1
%468 = OpFOrdEqual %v3bool %466 %467
%469 = OpAll %bool %468
%470 = OpLogicalAnd %bool %465 %469
%471 = OpCompositeExtract %v3float %457 2
%472 = OpCompositeExtract %v3float %458 2
%473 = OpFOrdEqual %v3bool %471 %472
%474 = OpAll %bool %473
%475 = OpLogicalAnd %bool %470 %474
OpBranch %441
%441 = OpLabel
%476 = OpPhi %bool %false %414 %475 %440
OpStore %_0_ok %476
%477 = OpLoad %bool %_0_ok
OpSelectionMerge %479 None
OpBranchConditional %477 %478 %479
%478 = OpLabel
%481 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%482 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%483 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%480 = OpCompositeConstruct %mat3v3float %481 %482 %483
%484 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%485 = OpCompositeConstruct %mat3v3float %484 %484 %484
%486 = OpCompositeExtract %v3float %485 0
%487 = OpCompositeExtract %v3float %480 0
%488 = OpFSub %v3float %486 %487
%489 = OpCompositeConstruct %mat3v3float %482 %485 %488
%491 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4
%492 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4
%493 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2
%490 = OpCompositeConstruct %mat3v3float %491 %492 %493
%494 = OpCompositeExtract %v3float %489 0
%495 = OpCompositeExtract %v3float %490 0
%496 = OpFOrdEqual %v3bool %494 %495
%497 = OpAll %bool %496
%498 = OpCompositeExtract %v3float %489 1
%499 = OpCompositeExtract %v3float %490 1
%500 = OpFOrdEqual %v3bool %498 %499
%501 = OpAll %bool %500
%502 = OpLogicalAnd %bool %497 %501
%503 = OpCompositeExtract %v3float %489 2
%504 = OpCompositeExtract %v3float %490 2
%505 = OpFOrdEqual %v3bool %503 %504
%506 = OpAll %bool %505
%507 = OpLogicalAnd %bool %502 %506
OpBranch %473
%473 = OpLabel
%508 = OpPhi %bool %false %435 %507 %472
OpStore %_0_ok %508
%509 = OpLoad %bool %_0_ok
OpSelectionMerge %511 None
OpBranchConditional %509 %510 %511
%510 = OpLabel
%513 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%514 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%515 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%512 = OpCompositeConstruct %mat3v3float %513 %514 %515
%516 = OpMatrixTimesScalar %mat3v3float %512 %float_4
%518 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%519 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%520 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%517 = OpCompositeConstruct %mat3v3float %518 %519 %520
%521 = OpCompositeExtract %v3float %516 0
%522 = OpCompositeExtract %v3float %517 0
%523 = OpFOrdEqual %v3bool %521 %522
%524 = OpAll %bool %523
%525 = OpCompositeExtract %v3float %516 1
%526 = OpCompositeExtract %v3float %517 1
%527 = OpFOrdEqual %v3bool %525 %526
%528 = OpAll %bool %527
%529 = OpLogicalAnd %bool %524 %528
%530 = OpCompositeExtract %v3float %516 2
%531 = OpCompositeExtract %v3float %517 2
%532 = OpFOrdEqual %v3bool %530 %531
%533 = OpAll %bool %532
%534 = OpLogicalAnd %bool %529 %533
OpBranch %511
%511 = OpLabel
%535 = OpPhi %bool %false %473 %534 %510
OpStore %_0_ok %535
%536 = OpLoad %bool %_0_ok
OpSelectionMerge %538 None
OpBranchConditional %536 %537 %538
%537 = OpLabel
%540 = OpCompositeConstruct %v2float %float_2 %float_2
%541 = OpCompositeConstruct %v2float %float_2 %float_2
%539 = OpCompositeConstruct %mat2v2float %540 %541
%542 = OpCompositeConstruct %v2float %float_4 %float_4
%543 = OpCompositeConstruct %mat2v2float %542 %542
%544 = OpFDiv %mat2v2float %543 %539
%489 = OpCompositeExtract %v3float %485 1
%490 = OpCompositeExtract %v3float %480 1
%491 = OpFSub %v3float %489 %490
%492 = OpCompositeExtract %v3float %485 2
%493 = OpCompositeExtract %v3float %480 2
%494 = OpFSub %v3float %492 %493
%495 = OpCompositeConstruct %mat3v3float %488 %491 %494
%497 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4
%498 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4
%499 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2
%496 = OpCompositeConstruct %mat3v3float %497 %498 %499
%500 = OpCompositeExtract %v3float %495 0
%501 = OpCompositeExtract %v3float %496 0
%502 = OpFOrdEqual %v3bool %500 %501
%503 = OpAll %bool %502
%504 = OpCompositeExtract %v3float %495 1
%505 = OpCompositeExtract %v3float %496 1
%506 = OpFOrdEqual %v3bool %504 %505
%507 = OpAll %bool %506
%508 = OpLogicalAnd %bool %503 %507
%509 = OpCompositeExtract %v3float %495 2
%510 = OpCompositeExtract %v3float %496 2
%511 = OpFOrdEqual %v3bool %509 %510
%512 = OpAll %bool %511
%513 = OpLogicalAnd %bool %508 %512
OpBranch %479
%479 = OpLabel
%514 = OpPhi %bool %false %441 %513 %478
OpStore %_0_ok %514
%515 = OpLoad %bool %_0_ok
OpSelectionMerge %517 None
OpBranchConditional %515 %516 %517
%516 = OpLabel
%519 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%520 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%521 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%518 = OpCompositeConstruct %mat3v3float %519 %520 %521
%522 = OpMatrixTimesScalar %mat3v3float %518 %float_4
%524 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%525 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%526 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%523 = OpCompositeConstruct %mat3v3float %524 %525 %526
%527 = OpCompositeExtract %v3float %522 0
%528 = OpCompositeExtract %v3float %523 0
%529 = OpFOrdEqual %v3bool %527 %528
%530 = OpAll %bool %529
%531 = OpCompositeExtract %v3float %522 1
%532 = OpCompositeExtract %v3float %523 1
%533 = OpFOrdEqual %v3bool %531 %532
%534 = OpAll %bool %533
%535 = OpLogicalAnd %bool %530 %534
%536 = OpCompositeExtract %v3float %522 2
%537 = OpCompositeExtract %v3float %523 2
%538 = OpFOrdEqual %v3bool %536 %537
%539 = OpAll %bool %538
%540 = OpLogicalAnd %bool %535 %539
OpBranch %517
%517 = OpLabel
%541 = OpPhi %bool %false %479 %540 %516
OpStore %_0_ok %541
%542 = OpLoad %bool %_0_ok
OpSelectionMerge %544 None
OpBranchConditional %542 %543 %544
%543 = OpLabel
%546 = OpCompositeConstruct %v2float %float_2 %float_2
%547 = OpCompositeConstruct %v2float %float_2 %float_2
%545 = OpCompositeConstruct %mat2v2float %546 %547
%548 = OpCompositeExtract %v2float %544 0
%549 = OpCompositeExtract %v2float %545 0
%550 = OpFOrdEqual %v2bool %548 %549
%551 = OpAll %bool %550
%552 = OpCompositeExtract %v2float %544 1
%553 = OpCompositeExtract %v2float %545 1
%554 = OpFOrdEqual %v2bool %552 %553
%555 = OpAll %bool %554
%556 = OpLogicalAnd %bool %551 %555
OpBranch %538
%538 = OpLabel
%557 = OpPhi %bool %false %511 %556 %537
OpStore %_0_ok %557
%558 = OpLoad %bool %_0_ok
OpSelectionMerge %560 None
OpBranchConditional %558 %559 %560
%559 = OpLabel
%561 = OpFunctionCall %bool %test_half_b
OpBranch %560
%560 = OpLabel
%562 = OpPhi %bool %false %538 %561 %559
OpSelectionMerge %567 None
OpBranchConditional %562 %565 %566
%565 = OpLabel
%568 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%572 = OpLoad %v4float %568
OpStore %563 %572
OpBranch %567
%566 = OpLabel
%573 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%575 = OpLoad %v4float %573
OpStore %563 %575
OpBranch %567
%567 = OpLabel
%576 = OpLoad %v4float %563
OpReturnValue %576
%548 = OpCompositeConstruct %v2float %float_4 %float_4
%549 = OpCompositeConstruct %mat2v2float %548 %548
%550 = OpCompositeExtract %v2float %549 0
%551 = OpCompositeExtract %v2float %545 0
%552 = OpFDiv %v2float %550 %551
%553 = OpCompositeExtract %v2float %549 1
%554 = OpCompositeExtract %v2float %545 1
%555 = OpFDiv %v2float %553 %554
%556 = OpCompositeConstruct %mat2v2float %552 %555
%558 = OpCompositeConstruct %v2float %float_2 %float_2
%559 = OpCompositeConstruct %v2float %float_2 %float_2
%557 = OpCompositeConstruct %mat2v2float %558 %559
%560 = OpCompositeExtract %v2float %556 0
%561 = OpCompositeExtract %v2float %557 0
%562 = OpFOrdEqual %v2bool %560 %561
%563 = OpAll %bool %562
%564 = OpCompositeExtract %v2float %556 1
%565 = OpCompositeExtract %v2float %557 1
%566 = OpFOrdEqual %v2bool %564 %565
%567 = OpAll %bool %566
%568 = OpLogicalAnd %bool %563 %567
OpBranch %544
%544 = OpLabel
%569 = OpPhi %bool %false %517 %568 %543
OpStore %_0_ok %569
%570 = OpLoad %bool %_0_ok
OpSelectionMerge %572 None
OpBranchConditional %570 %571 %572
%571 = OpLabel
%573 = OpFunctionCall %bool %test_half_b
OpBranch %572
%572 = OpLabel
%574 = OpPhi %bool %false %544 %573 %571
OpSelectionMerge %579 None
OpBranchConditional %574 %577 %578
%577 = OpLabel
%580 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%584 = OpLoad %v4float %580
OpStore %575 %584
OpBranch %579
%578 = OpLabel
%585 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%587 = OpLoad %v4float %585
OpStore %575 %587
OpBranch %579
%579 = OpLabel
%588 = OpLoad %v4float %575
OpReturnValue %588
OpFunctionEnd
1 error