diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index f6893358ff..f8aa5d080f 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -71,7 +71,7 @@ cpu_translator::cpu_translator(llvm::Module* _module, bool is_be) result = m_ir->CreateInsertElement(v, m_ir->CreateExtractElement(data0, m_ir->CreateExtractElement(mask, i)), i); v->addIncoming(result, loop); m_ir->CreateCondBr(m_ir->CreateICmpULT(i, m_ir->getInt32(16)), loop, next); - m_ir->SetInsertPoint(next->getFirstNonPHI()); + m_ir->SetInsertPoint(next->getFirstNonPHIIt()); result = m_ir->CreateSelect(m_ir->CreateICmpSLT(index, zeros), zeros, result); return result; diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 088bd0801b..d60ff50741 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -434,7 +434,7 @@ struct llvm_value_t : llvm_value_t static llvm::Type* get_type(llvm::LLVMContext& context) { - return llvm_value_t::get_type(context)->getPointerTo(); + return llvm::PointerType::get(context, 0); } }; @@ -1149,7 +1149,7 @@ struct llvm_fshl static llvm::Function* get_fshl(llvm::IRBuilder<>* ir) { const auto _module = ir->GetInsertBlock()->getParent()->getParent(); - return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t::get_type(ir->getContext())}); + return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t::get_type(ir->getContext())}); } static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3) @@ -1221,7 +1221,7 @@ struct llvm_fshr static llvm::Function* get_fshr(llvm::IRBuilder<>* ir) { const auto _module = ir->GetInsertBlock()->getParent()->getParent(); - return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t::get_type(ir->getContext())}); + return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t::get_type(ir->getContext())}); } static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3) @@ -2220,7 +2220,7 @@ struct llvm_add_sat static llvm::Function* get_add_sat(llvm::IRBuilder<>* ir) { const auto _module = ir->GetInsertBlock()->getParent()->getParent(); - return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t::get_type(ir->getContext())}); + return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t::get_type(ir->getContext())}); } llvm::Value* eval(llvm::IRBuilder<>* ir) const @@ -2303,7 +2303,7 @@ struct llvm_sub_sat static llvm::Function* get_sub_sat(llvm::IRBuilder<>* ir) { const auto _module = ir->GetInsertBlock()->getParent()->getParent(); - return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t::get_type(ir->getContext())}); + return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t::get_type(ir->getContext())}); } llvm::Value* eval(llvm::IRBuilder<>* ir) const @@ -3592,7 +3592,7 @@ public: llvm::Function* get_intrinsic(llvm::Intrinsic::ID id) { const auto _module = m_ir->GetInsertBlock()->getParent()->getParent(); - return llvm::Intrinsic::getDeclaration(_module, id, {get_type()...}); + return llvm::Intrinsic::getOrInsertDeclaration(_module, id, {get_type()...}); } template diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 90241016e6..e1372196fa 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -5725,14 +5725,15 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module& module // Define some types const auto _func = FunctionType::get(translator.get_type(), { - translator.get_type(), // Exec base - translator.GetContextType()->getPointerTo(), // PPU context - translator.get_type(), // Segment address (for PRX) - translator.get_type(), // Memory base - translator.get_type(), // r0 - translator.get_type(), // r1 - translator.get_type(), // r2 - }, false); + translator.get_type(), // Exec base + PointerType::get(jit.get_context(), 0), // PPU context + translator.get_type(), // Segment address (for PRX) + translator.get_type(), // Memory base + translator.get_type(), // r0 + translator.get_type(), // r1 + translator.get_type(), // r2 + }, + false); // Difference between function name and current location const u32 reloc = module_part.is_relocatable ? ::at32(module_part.segs, 0).addr : 0; diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 8962cc284d..0fb331bb34 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -339,14 +339,15 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module& info) m_seg0 = m_function->getArg(1); const auto ftype = FunctionType::get(get_type(), { - get_type(), // Exec base - GetContextType()->getPointerTo(), // PPU context - get_type(), // Segment address (for PRX) - get_type(), // Memory base - get_type(), // r0 - get_type(), // r1 - get_type(), // r2 - }, false); + get_type(), // Exec base + m_ir->getPtrTy(), // PPU context + get_type(), // Segment address (for PRX) + get_type(), // Memory base + get_type(), // r0 + get_type(), // r1 + get_type(), // r2 + }, + false); // Store function addresses in PPU jumptable using internal resolving instead of patching it externally. // Because, LLVM processed it extremely slow. (regression) @@ -380,7 +381,7 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module& info) const auto addr_array = new GlobalVariable(*m_module, addr_array_type, false, GlobalValue::PrivateLinkage, ConstantDataArray::get(m_context, vec_addrs)); // Create an array of function pointers - const auto func_table_type = ArrayType::get(ftype->getPointerTo(), functions.size()); + const auto func_table_type = ArrayType::get(m_ir->getPtrTy(), functions.size()); const auto init_func_table = ConstantArray::get(func_table_type, functions); const auto func_table = new GlobalVariable(*m_module, func_table_type, false, GlobalVariable::PrivateLinkage, init_func_table); @@ -407,7 +408,7 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module& info) const auto func_pc = ZExt(m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst), get_type()); ptr_inst = dyn_cast(m_ir->CreateGEP(func_table->getValueType(), func_table, {m_ir->getInt64(0), index_value})); - assert(ptr_inst->getResultElementType() == ftype->getPointerTo()); + assert(ptr_inst->getResultElementType() == m_ir->getPtrTy()); const auto faddr = m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst); const auto faddr_int = m_ir->CreatePtrToInt(faddr, get_type()); @@ -605,7 +606,7 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect) const auto pos = m_ir->CreateShl(indirect, 1); const auto ptr = dyn_cast(m_ir->CreateGEP(get_type(), m_exec, pos)); const auto val = m_ir->CreateLoad(get_type(), ptr); - callee = FunctionCallee(type, m_ir->CreateIntToPtr(m_ir->CreateAnd(val, 0xffff'ffff'ffff), type->getPointerTo())); + callee = FunctionCallee(type, m_ir->CreateIntToPtr(m_ir->CreateAnd(val, 0xffff'ffff'ffff), m_ir->getPtrTy())); // Load new segment address seg0 = m_ir->CreateShl(m_ir->CreateLShr(val, 48), 13); @@ -2782,8 +2783,8 @@ void PPUTranslator::MFOCRF(ppu_opcode_t op) else if (std::none_of(m_cr + 0, m_cr + 32, [](auto* p) { return p; })) { // MFCR (optimized) - Value* ln0 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 99), GetType()), GetType()->getPointerTo()); - Value* ln1 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 115), GetType()), GetType()->getPointerTo()); + Value* ln0 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 99), GetType()), m_ir->getPtrTy()); + Value* ln1 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 115), GetType()), m_ir->getPtrTy()); ln0 = m_ir->CreateLoad(GetType(), ln0); ln1 = m_ir->CreateLoad(GetType(), ln1); @@ -5371,22 +5372,23 @@ MDNode* PPUTranslator::CheckBranchProbability(u32 bo) void PPUTranslator::build_interpreter() { -#define BUILD_VEC_INST(i) { \ - m_function = llvm::cast(m_module->getOrInsertFunction("op_" #i, get_type(), m_thread_type->getPointerTo()).getCallee()); \ - std::fill(std::begin(m_globals), std::end(m_globals), nullptr); \ - std::fill(std::begin(m_locals), std::end(m_locals), nullptr); \ - IRBuilder<> irb(BasicBlock::Create(m_context, "__entry", m_function)); \ - m_ir = &irb; \ - m_thread = m_function->getArg(0); \ - ppu_opcode_t op{}; \ - op.vd = 0; \ - op.va = 1; \ - op.vb = 2; \ - op.vc = 3; \ - this->i(op); \ - FlushRegisters(); \ - m_ir->CreateRetVoid(); \ - run_transforms(*m_function); \ +#define BUILD_VEC_INST(i) \ + { \ + m_function = llvm::cast(m_module->getOrInsertFunction("op_" #i, get_type(), m_ir->getPtrTy()).getCallee()); \ + std::fill(std::begin(m_globals), std::end(m_globals), nullptr); \ + std::fill(std::begin(m_locals), std::end(m_locals), nullptr); \ + IRBuilder<> irb(BasicBlock::Create(m_context, "__entry", m_function)); \ + m_ir = &irb; \ + m_thread = m_function->getArg(0); \ + ppu_opcode_t op{}; \ + op.vd = 0; \ + op.va = 1; \ + op.vb = 2; \ + op.vc = 3; \ + this->i(op); \ + FlushRegisters(); \ + m_ir->CreateRetVoid(); \ + run_transforms(*m_function); \ } BUILD_VEC_INST(VADDCUW); diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index f1bb474e6f..361e6d45ba 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -2538,13 +2538,13 @@ public: { if (b2 != bqbi) { - auto ins = b2->block->getFirstNonPHI(); + auto ins = b2->block->getFirstNonPHIIt(); if (b2->bb->preds.size() == 1) { if (!dt.dominates(bs->getOperand(0), ins)) continue; - if (!pdt.dominates(ins, bs)) + if (!pdt.dominates(&*ins, bs)) continue; m_ir->SetInsertPoint(ins); @@ -2607,10 +2607,10 @@ public: spu_log.trace("Postponed r%u store from block 0x%x (multiple)", i, block_q[bi].first); } - ins = edge->getTerminator(); + ins = edge->getTerminator()->getIterator(); if (!dt.dominates(bs->getOperand(0), ins)) continue; - if (!pdt.dominates(ins, bs)) + if (!pdt.dominates(&*ins, bs)) continue; m_ir->SetInsertPoint(ins); @@ -2861,7 +2861,7 @@ public: // Create interpreter table const auto if_type = get_ftype(); - m_function_table = new GlobalVariable(*m_module, ArrayType::get(if_type->getPointerTo(), 1ull << m_interp_magn), true, GlobalValue::InternalLinkage, nullptr); + m_function_table = new GlobalVariable(*m_module, ArrayType::get(m_ir->getPtrTy(), 1ull << m_interp_magn), true, GlobalValue::InternalLinkage, nullptr); init_luts(); @@ -2905,7 +2905,7 @@ public: m_ir->CreateStore(m_ir->CreateCall(get_intrinsic(Intrinsic::read_register), {rsp_name}), native_sp); // Decode (shift) and load function pointer - const auto first = m_ir->CreateLoad(if_type->getPointerTo(), m_ir->CreateGEP(if_type->getPointerTo(), m_interp_table, m_ir->CreateLShr(m_interp_op, 32u - m_interp_magn))); + const auto first = m_ir->CreateLoad(m_ir->getPtrTy(), m_ir->CreateGEP(m_ir->getPtrTy(), m_interp_table, m_ir->CreateLShr(m_interp_op, 32u - m_interp_magn))); const auto call0 = m_ir->CreateCall(if_type, first, {m_lsptr, m_thread, m_interp_pc, m_interp_op, m_interp_table, m_interp_7f0, m_interp_regs}); call0->setCallingConv(CallingConv::GHC); m_ir->CreateRetVoid(); @@ -3049,7 +3049,7 @@ public: const auto next_pc = itype & spu_itype::branch ? m_interp_pc : m_interp_pc_next; const auto be32_op = m_ir->CreateLoad(get_type(), m_ir->CreateGEP(get_type(), m_lsptr, m_ir->CreateZExt(next_pc, get_type()))); const auto next_op = m_ir->CreateCall(get_intrinsic(Intrinsic::bswap), {be32_op}); - const auto next_if = m_ir->CreateLoad(if_type->getPointerTo(), m_ir->CreateGEP(if_type->getPointerTo(), m_interp_table, m_ir->CreateLShr(next_op, 32u - m_interp_magn))); + const auto next_if = m_ir->CreateLoad(m_ir->getPtrTy(), m_ir->CreateGEP(m_ir->getPtrTy(), m_interp_table, m_ir->CreateLShr(next_op, 32u - m_interp_magn))); llvm::cast(next_if)->setVolatile(true); if (!(itype & spu_itype::branch)) @@ -3174,7 +3174,7 @@ public: } } - m_function_table->setInitializer(ConstantArray::get(ArrayType::get(if_type->getPointerTo(), 1ull << m_interp_magn), iptrs)); + m_function_table->setInitializer(ConstantArray::get(ArrayType::get(m_ir->getPtrTy(), 1ull << m_interp_magn), iptrs)); m_function_table = nullptr; for (auto& f : *_module) @@ -7784,7 +7784,7 @@ public: m_ir->CreateStore(splat(-1).eval(m_ir), m_ir->CreateGEP(get_type(), m_thread, stack0.value)); const auto targ = m_ir->CreateAdd(m_ir->CreateLShr(_ret, 32), get_segment_base()); const auto type = m_finfo->chunk->getFunctionType(); - const auto fval = m_ir->CreateIntToPtr(targ, type->getPointerTo()); + const auto fval = m_ir->CreateIntToPtr(targ, m_ir->getPtrTy()); tail_chunk({type, fval}, m_ir->CreateTrunc(m_ir->CreateLShr(link, 32), get_type())); m_ir->SetInsertPoint(fail); }