diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index aa9fad589b3..9d6219037de 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -2260,9 +2260,16 @@ bool combine_add_sub_b2i(opt_ctx& ctx, aco_ptr& instr, aco_opcode n } ctx.uses[instr->operands[i].tempId()]--; new_instr->definitions[0] = instr->definitions[0]; - new_instr->definitions[1] = - instr->definitions.size() == 2 ? instr->definitions[1] : - Definition(ctx.program->allocateTmp(ctx.program->lane_mask)); + if (instr->definitions.size() == 2) { + new_instr->definitions[1] = instr->definitions[1]; + } else { + new_instr->definitions[1] = + Definition(ctx.program->allocateTmp(ctx.program->lane_mask)); + /* Make sure the uses vector is large enough and the number of + * uses properly initialized to 0. + */ + ctx.uses.push_back(0); + } new_instr->definitions[1].setHint(vcc); new_instr->operands[0] = Operand(0u); new_instr->operands[1] = instr->operands[!i]; diff --git a/src/amd/compiler/tests/test_optimizer.cpp b/src/amd/compiler/tests/test_optimizer.cpp index 4bb5898e236..f43ae731072 100644 --- a/src/amd/compiler/tests/test_optimizer.cpp +++ b/src/amd/compiler/tests/test_optimizer.cpp @@ -119,6 +119,12 @@ BEGIN_TEST(optimize.cndmask) Temp xor_a = bld.vop2(aco_opcode::v_xor_b32, bld.def(v1), inputs[0], subbrev); writeout(3, bld.vop2(aco_opcode::v_and_b32, bld.def(v1), xor_a, subbrev)); + //! v1: %res4 = v_cndmask_b32 0, %a, %c + //! p_unit_test 4, %res4 + Temp cndmask = bld.vop2_e64(aco_opcode::v_cndmask_b32, bld.def(v1), Operand(0u), Operand(1u), Operand(inputs[2])); + Temp sub = bld.vsub32(bld.def(v1), Operand(0u), cndmask); + writeout(4, bld.vop2(aco_opcode::v_and_b32, bld.def(v1), Operand(inputs[0]), sub)); + finish_opt_test(); } END_TEST