/* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD */ #include #include #include "common/assert.h" #include "common/common_types.h" #include "frontend/ir/basic_block.h" #include "frontend/ir/microinstruction.h" #include "frontend/ir/opcodes.h" #include "frontend/ir/type.h" #include "ir_opt/passes.h" namespace Dynarmic::Optimization { void VerificationPass(const IR::Block& block) { for (const auto& inst : block) { for (size_t i = 0; i < inst.NumArgs(); i++) { const IR::Type t1 = inst.GetArg(i).GetType(); const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); if (!IR::AreTypesCompatible(t1, t2)) { std::puts(IR::DumpBlock(block).c_str()); ASSERT_FALSE("above block failed validation"); } } } std::map actual_uses; for (const auto& inst : block) { for (size_t i = 0; i < inst.NumArgs(); i++) { const auto arg = inst.GetArg(i); if (!arg.IsImmediate()) { actual_uses[arg.GetInst()]++; } } } for (const auto& pair : actual_uses) { ASSERT(pair.first->UseCount() == pair.second); } } } // namespace Dynarmic::Optimization