From 526227eebe1efff3fb14dbf494b9c5b44c2e9c1f Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 4 Jan 2026 13:57:44 +0100 Subject: [PATCH] backend: Do not use random generator for reg allocation (#7) --- CMakeLists.txt | 2 +- externals/mcl | 2 +- src/dynarmic/backend/arm64/reg_alloc.cpp | 7 ++++--- src/dynarmic/backend/arm64/reg_alloc.h | 4 ++-- src/dynarmic/backend/riscv64/reg_alloc.cpp | 7 ++++--- src/dynarmic/backend/riscv64/reg_alloc.h | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a6ca83d0..41e3d82b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,7 +145,7 @@ set(TSL_ROBIN_MAP_ENABLE_INSTALL ON) find_package(Boost 1.57 REQUIRED) find_package(fmt 9 CONFIG) -find_package(mcl 0.1.12 EXACT CONFIG) +find_package(mcl 0.1.14 EXACT CONFIG) find_package(tsl-robin-map CONFIG) if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) diff --git a/externals/mcl b/externals/mcl index 7b08d834..5fc4beaf 160000 --- a/externals/mcl +++ b/externals/mcl @@ -1 +1 @@ -Subproject commit 7b08d83418f628b800dfac1c9a16c3f59036fbad +Subproject commit 5fc4beaf331037649b10625736b41365defb4f50 diff --git a/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/backend/arm64/reg_alloc.cpp index fedee02f..90befadf 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -436,9 +436,10 @@ int RegAlloc::AllocateRegister(const std::array& regs, const st std::vector candidates; std::copy_if(order.begin(), order.end(), std::back_inserter(candidates), [&](int i) { return regs[i].MaybeAllocatable(); }); - // TODO: LRU - std::uniform_int_distribution dis{0, candidates.size() - 1}; - return candidates[dis(rand_gen)]; + // TODO: The candidate was chosen randomly before, and a LRU was + // suggested as an improvement. However, using an incrementing index + // seems to be close enough. Determine if an LRU is still needed. + return candidates[alloc_candidate_index++ % candidates.size()]; } void RegAlloc::SpillGpr(int index) { diff --git a/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/backend/arm64/reg_alloc.h index 3a2d5388..96801d45 100644 --- a/src/dynarmic/backend/arm64/reg_alloc.h +++ b/src/dynarmic/backend/arm64/reg_alloc.h @@ -158,7 +158,7 @@ public: using ArgumentInfo = std::array; explicit RegAlloc(oaknut::CodeGenerator& code, FpsrManager& fpsr_manager, std::vector gpr_order, std::vector fpr_order) - : code{code}, fpsr_manager{fpsr_manager}, gpr_order{gpr_order}, fpr_order{fpr_order}, rand_gen{std::random_device{}()} {} + : code{code}, fpsr_manager{fpsr_manager}, gpr_order{gpr_order}, fpr_order{fpr_order} {} ArgumentInfo GetArgumentInfo(IR::Inst* inst); bool WasValueDefined(IR::Inst* inst) const; @@ -333,7 +333,7 @@ private: HostLocInfo flags; std::array spills; - mutable std::mt19937 rand_gen; + mutable size_t alloc_candidate_index{}; tsl::robin_set defined_insts; }; diff --git a/src/dynarmic/backend/riscv64/reg_alloc.cpp b/src/dynarmic/backend/riscv64/reg_alloc.cpp index 6c89d7b0..467a0c85 100644 --- a/src/dynarmic/backend/riscv64/reg_alloc.cpp +++ b/src/dynarmic/backend/riscv64/reg_alloc.cpp @@ -269,9 +269,10 @@ u32 RegAlloc::AllocateRegister(const std::array& regs, const st std::vector candidates; std::copy_if(order.begin(), order.end(), std::back_inserter(candidates), [&](u32 i) { return !regs[i].locked; }); - // TODO: LRU - std::uniform_int_distribution dis{0, candidates.size() - 1}; - return candidates[dis(rand_gen)]; + // TODO: The candidate was chosen randomly before, and a LRU was + // suggested as an improvement. However, using an incrementing index + // seems to be close enough. Determine if an LRU is still needed. + return candidates[alloc_candidate_index++ % candidates.size()]; } void RegAlloc::SpillGpr(u32 index) { diff --git a/src/dynarmic/backend/riscv64/reg_alloc.h b/src/dynarmic/backend/riscv64/reg_alloc.h index d80f588b..2e0756c8 100644 --- a/src/dynarmic/backend/riscv64/reg_alloc.h +++ b/src/dynarmic/backend/riscv64/reg_alloc.h @@ -159,7 +159,7 @@ private: std::array fprs; std::array spills; - mutable std::mt19937 rand_gen; + mutable size_t alloc_candidate_index{}; }; template