diff options
| author | 2021-04-01 07:42:58 +0200 | |
|---|---|---|
| committer | 2021-07-22 21:51:25 -0400 | |
| commit | bee81887998070d213c984d4ae4e5ae35de6fd96 (patch) | |
| tree | 2e14d65c6aeb811be1421297639a4eebda75ab59 /src | |
| parent | shader: Fold comparisons and Pack/Unpack16 (diff) | |
| download | yuzu-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.cpp | 62 |
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 | ||
| 371 | std::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 | |||
| 398 | void 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 | |||
| 371 | void ConstantPropagation(IR::Block& block, IR::Inst& inst) { | 415 | void 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 | } |