From fb194241d529b5c888780966fbe573e4d2c22aa1 Mon Sep 17 00:00:00 2001 From: oltolm Date: Sun, 5 Apr 2026 16:55:30 +0200 Subject: [PATCH] fix LLVM assert in use_begin --- rpcs3/Emu/CPU/CPUTranslator.cpp | 71 ++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index 6bd7924ea5..66b5c69af0 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -244,36 +244,48 @@ llvm::Value* cpu_translator::bitcast(llvm::Value* val, llvm::Type* type, std::so } } - for (auto it = source_val->use_begin(); it != source_val->use_end(); ++it) + // Skip use iteration for values that don't have use lists +#if LLVM_VERSION_MAJOR >= 21 + if (source_val->hasUseList()) +#endif { - llvm::Value* it_val = *it; - - if (!it_val) + for (llvm::Value* it_val : source_val->uses()) { - continue; - } - - llvm::CastInst* bci = llvm::dyn_cast_or_null(it_val); - - // Walk through bitcasts - while (bci && bci->getOpcode() == llvm::Instruction::BitCast) - { - if (bci->getParent() != m_ir->GetInsertBlock()) + if (!it_val) { - break; + continue; } - if (bci->getType() == type) - { - return bci; - } + llvm::CastInst* bci = llvm::dyn_cast_or_null(it_val); - if (bci->use_begin() == bci->use_end()) + // Walk through bitcasts + while (bci && bci->getOpcode() == llvm::Instruction::BitCast) { - break; - } + if (bci->getParent() != m_ir->GetInsertBlock()) + { + break; + } - bci = llvm::dyn_cast_or_null(*bci->use_begin()); + if (bci->getType() == type) + { + return bci; + } + + // Check if bci has use list before accessing use_begin() +#if LLVM_VERSION_MAJOR >= 21 + if (!bci->hasUseList()) + { + break; + } +#endif + + if (bci->use_begin() == bci->use_end()) + { + break; + } + + bci = llvm::dyn_cast_or_null(*bci->use_begin()); + } } } @@ -553,14 +565,25 @@ void cpu_translator::erase_stores(llvm::ArrayRef args) { for (auto v : args) { - for (auto it = v->use_begin(); it != v->use_end(); ++it) + // Skip use iteration for values that don't have use lists +#if LLVM_VERSION_MAJOR >= 21 + if (!v->hasUseList()) + continue; +#endif + + for (llvm::Value* i : v->uses()) { - llvm::Value* i = *it; llvm::CastInst* bci = nullptr; // Walk through bitcasts while (i && (bci = llvm::dyn_cast(i)) && bci->getOpcode() == llvm::Instruction::BitCast) { + // Check if bci has use list before accessing use_begin() +#if LLVM_VERSION_MAJOR >= 21 + if (!bci->hasUseList()) + break; +#endif + i = *bci->use_begin(); }