aco: remove definition from Pseudo branch instructions
They are not needed anymore. Totals from 7019 (8.84% of 79395) affected shaders: (Navi31) Instrs: 14805400 -> 14824196 (+0.13%); split: -0.00%, +0.13% CodeSize: 78079972 -> 78132932 (+0.07%); split: -0.01%, +0.08% SpillSGPRs: 4485 -> 4515 (+0.67%); split: -0.76%, +1.43% Latency: 165862000 -> 165836134 (-0.02%); split: -0.02%, +0.00% InvThroughput: 30061764 -> 30057781 (-0.01%); split: -0.01%, +0.00% SClause: 392323 -> 392286 (-0.01%); split: -0.01%, +0.00% Copies: 1012262 -> 1012234 (-0.00%); split: -0.04%, +0.04% Branches: 365910 -> 365909 (-0.00%); split: -0.00%, +0.00% PreSGPRs: 360167 -> 355363 (-1.33%) VALU: 8837197 -> 8837276 (+0.00%); split: -0.00%, +0.00% SALU: 1402593 -> 1402621 (+0.00%); split: -0.03%, +0.03% Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32037>
This commit is contained in:
committed by
Marge Bot
parent
7e4687fd04
commit
b64fff7731
@@ -3063,38 +3063,12 @@ register_allocation(Program* program, ra_test_policy policy)
|
||||
get_regs_for_phis(ctx, block, register_file, instructions,
|
||||
program->live.live_in[block.index]);
|
||||
|
||||
/* If this is a merge block, the state of the register file at the branch instruction of the
|
||||
* predecessors corresponds to the state after phis at the merge block. So, we allocate a
|
||||
* register for the predecessor's branch definitions as if there was a phi.
|
||||
*/
|
||||
if (!block.linear_preds.empty() &&
|
||||
(block.linear_preds.size() != 1 ||
|
||||
program->blocks[block.linear_preds[0]].linear_succs.size() == 1)) {
|
||||
PhysReg br_reg = get_reg_phi(ctx, program->live.live_in[block.index], register_file,
|
||||
instructions, block, ctx.phi_dummy, Temp(0, s2));
|
||||
for (unsigned pred : block.linear_preds) {
|
||||
aco_ptr<Instruction>& br = program->blocks[pred].instructions.back();
|
||||
|
||||
assert(br->definitions.size() == 1 && br->definitions[0].regClass() == s2 &&
|
||||
br->definitions[0].isKill());
|
||||
|
||||
br->definitions[0].setFixed(br_reg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle all other instructions of the block */
|
||||
auto NonPhi = [](aco_ptr<Instruction>& instr) -> bool { return instr && !is_phi(instr); };
|
||||
auto instr_it = std::find_if(block.instructions.begin(), block.instructions.end(), NonPhi);
|
||||
for (; instr_it != block.instructions.end(); ++instr_it) {
|
||||
aco_ptr<Instruction>& instr = *instr_it;
|
||||
std::vector<std::pair<Operand, Definition>> parallelcopy;
|
||||
|
||||
if (instr->opcode == aco_opcode::p_branch) {
|
||||
/* unconditional branches are handled after phis of the target */
|
||||
instructions.emplace_back(std::move(instr));
|
||||
break;
|
||||
}
|
||||
|
||||
assert(!is_phi(instr));
|
||||
|
||||
/* handle operands */
|
||||
|
||||
Reference in New Issue
Block a user