uint16_t linear_phi_defs = 0;
};
+bool
+instr_needs_vcc(Instruction* instr)
+{
+ if (instr->isVOPC())
+ return true;
+ if (instr->isVOP2() && !instr->isVOP3()) {
+ if (instr->operands.size() == 3 && instr->operands[2].isTemp() &&
+ instr->operands[2].regClass().type() == RegType::sgpr)
+ return true;
+ if (instr->definitions.size() == 2)
+ return true;
+ }
+ return false;
+}
+
void
process_live_temps_per_block(Program* program, live& lives, Block* block, unsigned& worklist,
std::vector<PhiInfo>& phi_info)
if (is_phi(insn))
break;
+ program->needs_vcc |= instr_needs_vcc(insn);
register_demand[idx] = RegisterDemand(new_demand.vgpr, new_demand.sgpr);
/* KILL */
if (!definition.isTemp()) {
continue;
}
- if ((definition.isFixed() || definition.hasHint()) && definition.physReg() == vcc)
+ if (definition.isFixed() && definition.physReg() == vcc)
program->needs_vcc = true;
const Temp temp = definition.getTemp();
continue;
}
Definition& definition = insn->definitions[0];
- if ((definition.isFixed() || definition.hasHint()) && definition.physReg() == vcc)
+ if (definition.isFixed() && definition.physReg() == vcc)
program->needs_vcc = true;
const Temp temp = definition.getTemp();
const size_t n = live.erase(temp.id());