summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar FernandoS272021-04-01 07:42:58 +0200
committerGravatar ameerj2021-07-22 21:51:25 -0400
commitbee81887998070d213c984d4ae4e5ae35de6fd96 (patch)
tree2e14d65c6aeb811be1421297639a4eebda75ab59 /src
parentshader: Fold comparisons and Pack/Unpack16 (diff)
downloadyuzu-bee81887998070d213c984d4ae4e5ae35de6fd96.tar.gz
yuzu-bee81887998070d213c984d4ae4e5ae35de6fd96.tar.xz
yuzu-bee81887998070d213c984d4ae4e5ae35de6fd96.zip
shader: Fold composite extract
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/ir_opt/constant_propagation_pass.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
index 15e16956e..8999c3a3d 100644
--- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
+++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
@@ -368,6 +368,50 @@ void FoldBranchConditional(IR::Inst& inst) {
368 } 368 }
369} 369}
370 370
371std::optional<IR::Value> FoldCompositeExtractImpl(IR::Value inst_value, IR::Opcode insert,
372 IR::Opcode construct, u32 first_index) {
373 IR::Inst* const inst{inst_value.InstRecursive()};
374 if (inst->Opcode() == construct) {
375 return inst->Arg(first_index);
376 }
377
378 if (inst->Opcode() != insert) {
379 return std::nullopt;
380 }
381
382 IR::Value value_index{inst->Arg(2)};
383 if (!value_index.IsImmediate()) {
384 return std::nullopt;
385 }
386
387 const u32 second_index = value_index.U32();
388 if (first_index != second_index) {
389 IR::Value value_composite{inst->Arg(0)};
390 if (value_composite.IsImmediate()) {
391 return std::nullopt;
392 }
393 return FoldCompositeExtractImpl(value_composite, insert, construct, first_index);
394 }
395 return inst->Arg(1);
396}
397
398void FoldCompositeExtract(IR::Inst& inst, IR::Opcode construct, IR::Opcode insert) {
399 const IR::Value value_1{inst.Arg(0)};
400 const IR::Value value_2{inst.Arg(1)};
401 if (value_1.IsImmediate()) {
402 return;
403 }
404 if (!value_2.IsImmediate()) {
405 return;
406 }
407 const u32 first_index = value_2.U32();
408 auto result = FoldCompositeExtractImpl(value_1, insert, construct, first_index);
409 if (!result) {
410 return;
411 }
412 inst.ReplaceUsesWith(*result);
413}
414
371void ConstantPropagation(IR::Block& block, IR::Inst& inst) { 415void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
372 switch (inst.Opcode()) { 416 switch (inst.Opcode()) {
373 case IR::Opcode::GetRegister: 417 case IR::Opcode::GetRegister:
@@ -458,6 +502,24 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
458 return; 502 return;
459 case IR::Opcode::BranchConditional: 503 case IR::Opcode::BranchConditional:
460 return FoldBranchConditional(inst); 504 return FoldBranchConditional(inst);
505 case IR::Opcode::CompositeExtractF32x2:
506 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF32x2,
507 IR::Opcode::CompositeInsertF32x2);
508 case IR::Opcode::CompositeExtractF32x3:
509 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF32x3,
510 IR::Opcode::CompositeInsertF32x3);
511 case IR::Opcode::CompositeExtractF32x4:
512 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF32x4,
513 IR::Opcode::CompositeInsertF32x4);
514 case IR::Opcode::CompositeExtractF16x2:
515 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF16x2,
516 IR::Opcode::CompositeInsertF16x2);
517 case IR::Opcode::CompositeExtractF16x3:
518 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF16x3,
519 IR::Opcode::CompositeInsertF16x3);
520 case IR::Opcode::CompositeExtractF16x4:
521 return FoldCompositeExtract(inst, IR::Opcode::CompositeConstructF16x4,
522 IR::Opcode::CompositeInsertF16x4);
461 default: 523 default:
462 break; 524 break;
463 } 525 }