aboutsummaryrefslogtreecommitdiffstats
path: root/src/amd
diff options
context:
space:
mode:
Diffstat (limited to 'src/amd')
-rw-r--r--src/amd/compiler/aco_register_allocation.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp
index a0a4a4f444f..897a5bc50c7 100644
--- a/src/amd/compiler/aco_register_allocation.cpp
+++ b/src/amd/compiler/aco_register_allocation.cpp
@@ -1738,8 +1738,14 @@ void register_allocation(Program *program, std::vector<TempSet>& live_out_per_bl
instr->operands[1].isTemp() &&
instr->operands[1].getTemp().type() == RegType::vgpr &&
!instr->usesModifiers()) {
- instr->format = Format::VOP2;
- instr->opcode = aco_opcode::v_mac_f32;
+ unsigned def_id = instr->definitions[0].tempId();
+ auto it = ctx.affinities.find(def_id);
+ if (it == ctx.affinities.end() || !ctx.assignments[it->second].assigned ||
+ instr->operands[2].physReg() == ctx.assignments[it->second].reg ||
+ register_file.test(ctx.assignments[it->second].reg, instr->operands[2].bytes())) {
+ instr->format = Format::VOP2;
+ instr->opcode = aco_opcode::v_mac_f32;
+ }
}
/* handle definitions which must have the same register as an operand */