From: Daniel Schürmann Date: Wed, 6 Nov 2019 16:47:06 +0000 (+0100) Subject: aco: rematerialize s_movk instructions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=746b9380bd292ad7a44e80012e0497c2fa479441;p=mesa.git aco: rematerialize s_movk instructions Reviewed-by: Rhys Perry --- diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 952094f40d0..0de20a50a2f 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -231,11 +231,13 @@ void compute_global_next_uses(spill_ctx& ctx, std::vector>& live_ bool should_rematerialize(aco_ptr& instr) { /* TODO: rematerialization is only supported for VOP1, SOP1 and PSEUDO */ - if (instr->format != Format::VOP1 && instr->format != Format::SOP1 && instr->format != Format::PSEUDO) + if (instr->format != Format::VOP1 && instr->format != Format::SOP1 && instr->format != Format::PSEUDO && instr->format != Format::SOPK) return false; /* TODO: pseudo-instruction rematerialization is only supported for p_create_vector */ if (instr->format == Format::PSEUDO && instr->opcode != aco_opcode::p_create_vector) return false; + if (instr->format == Format::SOPK && instr->opcode != aco_opcode::s_movk_i32) + return false; for (const Operand& op : instr->operands) { /* TODO: rematerialization using temporaries isn't yet supported */ @@ -255,7 +257,7 @@ aco_ptr do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t std::map::iterator remat = ctx.remat.find(tmp); if (remat != ctx.remat.end()) { Instruction *instr = remat->second.instr; - assert((instr->format == Format::VOP1 || instr->format == Format::SOP1 || instr->format == Format::PSEUDO) && "unsupported"); + assert((instr->format == Format::VOP1 || instr->format == Format::SOP1 || instr->format == Format::PSEUDO || instr->format == Format::SOPK) && "unsupported"); assert((instr->format != Format::PSEUDO || instr->opcode == aco_opcode::p_create_vector) && "unsupported"); assert(instr->definitions.size() == 1 && "unsupported"); @@ -266,6 +268,9 @@ aco_ptr do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); } else if (instr->format == Format::PSEUDO) { res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); + } else if (instr->format == Format::SOPK) { + res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); + static_cast(res.get())->imm = static_cast(instr)->imm; } for (unsigned i = 0; i < instr->operands.size(); i++) { res->operands[i] = instr->operands[i];