From ca029e55234a7489496b841d2b3b5b37488a1898 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:16:45 +0300 Subject: [PATCH] SPU LLVM: Avoid raw pointers --- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 5 +++++ rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index b8b27e0b10..8cb252b506 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -9987,6 +9987,11 @@ std::array& block_reg_info::evaluate_start_state(const s void spu_recompiler_base::add_pattern(inst_attr attr, u32 start, u64 info, std::shared_ptr info_ptr) { + if (m_inst_attrs[start / 4] != inst_attr::none) + { + fmt::throw_exception("SPU Pattern is occupied! (start=0x%x)", start); + } + m_patterns[start] = pattern_info{info, info_ptr}; m_inst_attrs[start / 4] = attr; } diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 6b3841280e..b8e51d28dc 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -210,7 +210,7 @@ class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator function_info* m_finfo = nullptr; // Reduced Loop Pattern information (if available) - reduced_loop_t* m_reduced_loop_info = nullptr; + std::shared_ptr m_reduced_loop_info; // All blocks in the current function chunk std::unordered_map> m_blocks; @@ -2689,7 +2689,7 @@ public: } const bool is_reduced_loop = m_inst_attrs[(baddr - start) / 4] == inst_attr::reduced_loop; - m_reduced_loop_info = is_reduced_loop ? std::static_pointer_cast(ensure(m_patterns.at(baddr - start).info_ptr)).get() : nullptr; + m_reduced_loop_info = is_reduced_loop ? std::static_pointer_cast(ensure(m_patterns.at(baddr - start).info_ptr)) : nullptr; BasicBlock* block_optimization_phi_parent = nullptr; const auto block_optimization_inner = is_reduced_loop ? BasicBlock::Create(m_context, fmt::format("b-loop-it-0x%x", m_pos), m_function) : nullptr; @@ -7813,7 +7813,7 @@ public: value_t clamp_smax(value_t v, u32 gpr = s_reg_max) { - if (m_reduced_loop_info && gpr < s_reg_max && m_reduced_loop_info->is_gpr_not_NaN_hint(gpr)) + if (gpr < s_reg_max && m_reduced_loop_info && m_reduced_loop_info->is_gpr_not_NaN_hint(gpr)) { return v; }