From 7d535eaba63ba019d5f5bf1cea3906e308d9a91f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 11 Apr 2019 18:18:26 -0400 Subject: [PATCH 1/4] ir_opt/a32_constant_memory_reads_pass: Apply const where applicable to locals Makes immutable state just slightly more explicit. --- src/ir_opt/a32_constant_memory_reads_pass.cpp | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/ir_opt/a32_constant_memory_reads_pass.cpp b/src/ir_opt/a32_constant_memory_reads_pass.cpp index 66aaa320..92426a47 100644 --- a/src/ir_opt/a32_constant_memory_reads_pass.cpp +++ b/src/ir_opt/a32_constant_memory_reads_pass.cpp @@ -16,52 +16,56 @@ void A32ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { for (auto& inst : block) { switch (inst.GetOpcode()) { case IR::Opcode::A32SetCFlag: { - IR::Value arg = inst.GetArg(0); + const IR::Value arg = inst.GetArg(0); if (!arg.IsImmediate() && arg.GetInst()->GetOpcode() == IR::Opcode::A32GetCFlag) { inst.Invalidate(); } break; } case IR::Opcode::A32ReadMemory8: { - if (!inst.AreAllArgsImmediates()) + if (!inst.AreAllArgsImmediates()) { break; + } - u32 vaddr = inst.GetArg(0).GetU32(); + const u32 vaddr = inst.GetArg(0).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - u8 value_from_memory = cb->MemoryRead8(vaddr); + const u8 value_from_memory = cb->MemoryRead8(vaddr); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } break; } case IR::Opcode::A32ReadMemory16: { - if (!inst.AreAllArgsImmediates()) + if (!inst.AreAllArgsImmediates()) { break; + } - u32 vaddr = inst.GetArg(0).GetU32(); + const u32 vaddr = inst.GetArg(0).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - u16 value_from_memory = cb->MemoryRead16(vaddr); + const u16 value_from_memory = cb->MemoryRead16(vaddr); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } break; } case IR::Opcode::A32ReadMemory32: { - if (!inst.AreAllArgsImmediates()) + if (!inst.AreAllArgsImmediates()) { break; + } - u32 vaddr = inst.GetArg(0).GetU32(); + const u32 vaddr = inst.GetArg(0).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - u32 value_from_memory = cb->MemoryRead32(vaddr); + const u32 value_from_memory = cb->MemoryRead32(vaddr); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } break; } case IR::Opcode::A32ReadMemory64: { - if (!inst.AreAllArgsImmediates()) + if (!inst.AreAllArgsImmediates()) { break; + } - u32 vaddr = inst.GetArg(0).GetU32(); + const u32 vaddr = inst.GetArg(0).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - u64 value_from_memory = cb->MemoryRead64(vaddr); + const u64 value_from_memory = cb->MemoryRead64(vaddr); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } break; From dc97977576797b3453734a1c865da3824ed9c03a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 11 Apr 2019 18:26:10 -0400 Subject: [PATCH 2/4] ir_opt/a32_get_set_elimination_pass: Mark local variables as const where applicable Makes our intended immutable state slightly more explicit. --- src/ir_opt/a32_get_set_elimination_pass.cpp | 35 +++++++++++---------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/ir_opt/a32_get_set_elimination_pass.cpp b/src/ir_opt/a32_get_set_elimination_pass.cpp index 2ef8dc6c..8399d403 100644 --- a/src/ir_opt/a32_get_set_elimination_pass.cpp +++ b/src/ir_opt/a32_get_set_elimination_pass.cpp @@ -56,48 +56,49 @@ void A32GetSetElimination(IR::Block& block) { for (auto inst = block.begin(); inst != block.end(); ++inst) { switch (inst->GetOpcode()) { case IR::Opcode::A32SetRegister: { - A32::Reg reg = inst->GetArg(0).GetA32RegRef(); - if (reg == A32::Reg::PC) + const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); + if (reg == A32::Reg::PC) { break; - size_t reg_index = static_cast(reg); + } + const auto reg_index = static_cast(reg); do_set(reg_info[reg_index], inst->GetArg(1), inst); break; } case IR::Opcode::A32GetRegister: { - A32::Reg reg = inst->GetArg(0).GetA32RegRef(); + const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); ASSERT(reg != A32::Reg::PC); - size_t reg_index = static_cast(reg); + const size_t reg_index = static_cast(reg); do_get(reg_info[reg_index], inst); break; } case IR::Opcode::A32SetExtendedRegister32: { - A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - size_t reg_index = A32::RegNumber(reg); + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); do_set(ext_reg_singles_info[reg_index], inst->GetArg(1), inst); - size_t doubles_reg_index = reg_index / 2; + const size_t doubles_reg_index = reg_index / 2; if (doubles_reg_index < ext_reg_doubles_info.size()) { ext_reg_doubles_info[doubles_reg_index] = {}; } break; } case IR::Opcode::A32GetExtendedRegister32: { - A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - size_t reg_index = A32::RegNumber(reg); + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); do_get(ext_reg_singles_info[reg_index], inst); - size_t doubles_reg_index = reg_index / 2; + const size_t doubles_reg_index = reg_index / 2; if (doubles_reg_index < ext_reg_doubles_info.size()) { ext_reg_doubles_info[doubles_reg_index] = {}; } break; } case IR::Opcode::A32SetExtendedRegister64: { - A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - size_t reg_index = A32::RegNumber(reg); + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); do_set(ext_reg_doubles_info[reg_index], inst->GetArg(1), inst); - size_t singles_reg_index = reg_index * 2; + const size_t singles_reg_index = reg_index * 2; if (singles_reg_index < ext_reg_singles_info.size()) { ext_reg_singles_info[singles_reg_index] = {}; ext_reg_singles_info[singles_reg_index+1] = {}; @@ -105,11 +106,11 @@ void A32GetSetElimination(IR::Block& block) { break; } case IR::Opcode::A32GetExtendedRegister64: { - A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - size_t reg_index = A32::RegNumber(reg); + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); do_get(ext_reg_doubles_info[reg_index], inst); - size_t singles_reg_index = reg_index * 2; + const size_t singles_reg_index = reg_index * 2; if (singles_reg_index < ext_reg_singles_info.size()) { ext_reg_singles_info[singles_reg_index] = {}; ext_reg_singles_info[singles_reg_index+1] = {}; From 1a45f35b9cb7eb3c078683027c89ce7cfd8f15a9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 11 Apr 2019 18:28:06 -0400 Subject: [PATCH 3/4] ir_opt/a64_callback_config_pass: Mark locals as const where applicable Makes our immutable state a little more explicit. --- src/ir_opt/a64_callback_config_pass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ir_opt/a64_callback_config_pass.cpp b/src/ir_opt/a64_callback_config_pass.cpp index e3586cbe..fb09b921 100644 --- a/src/ir_opt/a64_callback_config_pass.cpp +++ b/src/ir_opt/a64_callback_config_pass.cpp @@ -25,7 +25,7 @@ void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf) { continue; } - auto op = static_cast(inst.GetArg(0).GetU64()); + const auto op = static_cast(inst.GetArg(0).GetU64()); if (op == A64::DataCacheOperation::ZeroByVA) { A64::IREmitter ir{block}; ir.SetInsertionPoint(&inst); From cfd7513a7d8e102eb2cbb0722f0a94ec6bae44ec Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 11 Apr 2019 18:30:28 -0400 Subject: [PATCH 4/4] ir_opt/verification_pass: Mark locals as const where applicable Makes our immutable state a little more explicit. --- src/ir_opt/verification_pass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ir_opt/verification_pass.cpp b/src/ir_opt/verification_pass.cpp index ef590b45..ed99e127 100644 --- a/src/ir_opt/verification_pass.cpp +++ b/src/ir_opt/verification_pass.cpp @@ -19,8 +19,8 @@ namespace Dynarmic::Optimization { void VerificationPass(const IR::Block& block) { for (const auto& inst : block) { for (size_t i = 0; i < inst.NumArgs(); i++) { - IR::Type t1 = inst.GetArg(i).GetType(); - IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); + const IR::Type t1 = inst.GetArg(i).GetType(); + const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); if (!IR::AreTypesCompatible(t1, t2)) { puts(IR::DumpBlock(block).c_str()); ASSERT(false);