mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 02:10:11 +01:00
aco/optimizer: don't reallocate instruction when converting to VOP3
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21762>
This commit is contained in:
parent
7413ce7e0d
commit
a4873071e6
1 changed files with 7 additions and 32 deletions
|
|
@ -632,31 +632,6 @@ can_apply_sgprs(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
instr->opcode != aco_opcode::v_interp_p2_rtz_f16_f32_inreg;
|
||||
}
|
||||
|
||||
void
|
||||
to_VOP3(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
||||
{
|
||||
if (instr->isVOP3())
|
||||
return;
|
||||
|
||||
aco_ptr<Instruction> tmp = std::move(instr);
|
||||
Format format = asVOP3(tmp->format);
|
||||
instr.reset(create_instruction<VALU_instruction>(tmp->opcode, format, tmp->operands.size(),
|
||||
tmp->definitions.size()));
|
||||
std::copy(tmp->operands.cbegin(), tmp->operands.cend(), instr->operands.begin());
|
||||
for (unsigned i = 0; i < instr->definitions.size(); i++) {
|
||||
instr->definitions[i] = tmp->definitions[i];
|
||||
if (instr->definitions[i].isTemp()) {
|
||||
ssa_info& info = ctx.info[instr->definitions[i].tempId()];
|
||||
if (info.label & instr_usedef_labels && info.instr == tmp.get())
|
||||
info.instr = instr.get();
|
||||
}
|
||||
}
|
||||
/* we don't need to update any instr_mod_labels because they either haven't
|
||||
* been applied yet or this instruction isn't dead and so they've been ignored */
|
||||
|
||||
instr->pass_flags = tmp->pass_flags;
|
||||
}
|
||||
|
||||
bool
|
||||
is_operand_vgpr(Operand op)
|
||||
{
|
||||
|
|
@ -1421,7 +1396,7 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
} else if (info.is_neg() && can_use_mod && mod_bitsize_compat &&
|
||||
can_eliminate_fcanonicalize(ctx, instr, info.temp)) {
|
||||
if (!instr->isDPP() && !instr->isSDWA())
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
instr->operands[i].setTemp(info.temp);
|
||||
if (!instr->valu().abs[i])
|
||||
instr->valu().neg[i] = true;
|
||||
|
|
@ -1429,7 +1404,7 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
if (info.is_abs() && can_use_mod && mod_bitsize_compat &&
|
||||
can_eliminate_fcanonicalize(ctx, instr, info.temp)) {
|
||||
if (!instr->isDPP() && !instr->isSDWA())
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
instr->operands[i] = Operand(info.temp);
|
||||
instr->valu().abs[i] = true;
|
||||
continue;
|
||||
|
|
@ -1455,7 +1430,7 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
instr->operands[0] = op;
|
||||
continue;
|
||||
} else if (can_use_VOP3(ctx, instr)) {
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
instr->operands[i] = op;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2828,7 +2803,7 @@ combine_xor_not(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
if (instr->operands[0].isOfType(RegType::vgpr))
|
||||
std::swap(instr->operands[0], instr->operands[1]);
|
||||
if (!instr->operands[1].isOfType(RegType::vgpr))
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -3484,7 +3459,7 @@ apply_sgprs(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
uint32_t swapped = (0x3120 >> (operand_mask & 0x3)) & 0xf;
|
||||
operand_mask = (operand_mask & ~0x3) | swapped;
|
||||
} else if (can_use_VOP3(ctx, instr) && !info.is_extract()) {
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
instr->operands[sgpr_idx] = Operand(sgpr);
|
||||
} else {
|
||||
continue;
|
||||
|
|
@ -3542,7 +3517,7 @@ apply_omod_clamp(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
assert(!ctx.info[instr->definitions[0].tempId()].is_mad());
|
||||
|
||||
if (!instr->isSDWA() && !instr->isVOP3P())
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
|
||||
if (!def_info.is_clamp() && (instr->valu().clamp || instr->valu().omod))
|
||||
return false;
|
||||
|
|
@ -5208,7 +5183,7 @@ apply_literals(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
Operand literal = Operand::literal32(ctx.info[op.tempId()].val);
|
||||
instr->format = withoutDPP(instr->format);
|
||||
if (instr->isVALU() && i > 0 && instr->format != Format::VOP3P)
|
||||
to_VOP3(ctx, instr);
|
||||
instr->format = asVOP3(instr->format);
|
||||
instr->operands[i] = literal;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue