From 2ab0e64be4fe81991a64e5b0f466f1372a94231c Mon Sep 17 00:00:00 2001 From: Merry Date: Tue, 2 Aug 2022 01:02:43 +0100 Subject: [PATCH] backend/arm64/reg_alloc: Update uses on all locations Trying to optimize just for args is incorrect when inst has zero uses --- src/dynarmic/backend/arm64/emit_arm64.cpp | 1 + src/dynarmic/backend/arm64/reg_alloc.cpp | 21 +++++++++++++-------- src/dynarmic/backend/arm64/reg_alloc.h | 3 +-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/dynarmic/backend/arm64/emit_arm64.cpp b/src/dynarmic/backend/arm64/emit_arm64.cpp index d44b92d7..2a92e6ff 100644 --- a/src/dynarmic/backend/arm64/emit_arm64.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64.cpp @@ -192,6 +192,7 @@ EmittedBlockInfo EmitArm64(oaknut::CodeGenerator& code, IR::Block block, const E break; } + reg_alloc.UpdateAllUses(); reg_alloc.AssertAllUnlocked(); } diff --git a/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/backend/arm64/reg_alloc.cpp index 9ea0aff1..f60da3e1 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -31,14 +31,6 @@ static bool IsValuelessType(IR::Type type) { } } -Argument::~Argument() { - if (!IsImmediate()) { - if (auto host_loc = reg_alloc.ValueLocation(value.GetInst())) { - reg_alloc.ValueInfo(*host_loc).UpdateUses(); - } - } -} - IR::Type Argument::GetType() const { return value.GetType(); } @@ -197,6 +189,19 @@ void RegAlloc::DefineAsRegister(IR::Inst* inst, oaknut::Reg reg) { info.expected_uses += inst->UseCount(); } +void RegAlloc::UpdateAllUses() { + for (auto& gpr : gprs) { + gpr.UpdateUses(); + } + for (auto& fpr : fprs) { + fpr.UpdateUses(); + } + flags.UpdateUses(); + for (auto& spill : spills) { + spill.UpdateUses(); + } +} + void RegAlloc::AssertAllUnlocked() const { const auto is_unlocked = [](const auto& i) { return !i.locked && !i.realized; }; ASSERT(std::all_of(gprs.begin(), gprs.end(), is_unlocked)); diff --git a/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/backend/arm64/reg_alloc.h index 1111dfb0..b7100e7c 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.h +++ b/src/dynarmic/backend/arm64/reg_alloc.h @@ -46,8 +46,6 @@ struct Argument final { public: using copyable_reference = std::reference_wrapper; - ~Argument(); - IR::Type GetType() const; bool IsImmediate() const; @@ -284,6 +282,7 @@ public: (rs.Realize(), ...); } + void UpdateAllUses(); void AssertAllUnlocked() const; void AssertNoMoreUses() const;