- while (true) {
- auto pos = state->latest.find(block_idx);
- if (pos != state->latest.end())
- return Operand(Temp(pos->second, program->lane_mask));
-
- Block& block = program->blocks[block_idx];
- size_t pred = block.linear_preds.size();
- if (pred == 0) {
- return Operand(program->lane_mask);
- } else if (pred == 1) {
- block_idx = block.linear_preds[0];
- continue;
- } else {
- unsigned res = program->allocateId();
- state->latest[block_idx] = res;
-
- aco_ptr<Pseudo_instruction> phi{create_instruction<Pseudo_instruction>(aco_opcode::p_linear_phi, Format::PSEUDO, pred, 1)};
- for (unsigned i = 0; i < pred; i++) {
- phi->operands[i] = get_ssa(program, block.linear_preds[i], state);
- if (phi->operands[i].isTemp()) {
- assert(i < 64);
- state->phis[phi->operands[i].tempId()][(phi_use){&block, res}] |= (uint64_t)1 << i;
- }
- }
- phi->definitions[0] = Definition(Temp{res, program->lane_mask});
- block.instructions.emplace(block.instructions.begin(), std::move(phi));
-
- return Operand(Temp(res, program->lane_mask));
- }
+ if (!before_write) {
+ auto it = state->writes.find(block_idx);
+ if (it != state->writes.end())
+ return Operand(Temp(it->second, program->lane_mask));
+ if (state->latest[block_idx])
+ return Operand(Temp(state->latest[block_idx], program->lane_mask));