mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 20:10:17 +01:00
i965/vec4: Factor code out of DCE into a separate function.
Will be reused in the next commit. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
9630ba6c6e
commit
1b8f143a23
1 changed files with 39 additions and 34 deletions
|
|
@ -321,6 +321,44 @@ src_reg::equals(src_reg *r)
|
|||
imm.u == r->imm.u);
|
||||
}
|
||||
|
||||
static bool
|
||||
try_eliminate_instruction(vec4_instruction *inst, int new_writemask)
|
||||
{
|
||||
if (new_writemask == 0) {
|
||||
/* Don't dead code eliminate instructions that write to the
|
||||
* accumulator as a side-effect. Instead just set the destination
|
||||
* to the null register to free it.
|
||||
*/
|
||||
switch (inst->opcode) {
|
||||
case BRW_OPCODE_ADDC:
|
||||
case BRW_OPCODE_SUBB:
|
||||
case BRW_OPCODE_MACH:
|
||||
inst->dst = dst_reg(retype(brw_null_reg(), inst->dst.type));
|
||||
break;
|
||||
default:
|
||||
if (inst->writes_flag()) {
|
||||
inst->dst = dst_reg(retype(brw_null_reg(), inst->dst.type));
|
||||
} else {
|
||||
inst->remove();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else if (inst->dst.writemask != new_writemask) {
|
||||
switch (inst->opcode) {
|
||||
case SHADER_OPCODE_TXF_CMS:
|
||||
case SHADER_OPCODE_GEN4_SCRATCH_READ:
|
||||
case VS_OPCODE_PULL_CONSTANT_LOAD:
|
||||
case VS_OPCODE_PULL_CONSTANT_LOAD_GEN7:
|
||||
break;
|
||||
default:
|
||||
inst->dst.writemask = new_writemask;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Must be called after calculate_live_intervals() to remove unused
|
||||
* writes to registers -- register allocation will fail otherwise
|
||||
|
|
@ -354,40 +392,7 @@ vec4_visitor::dead_code_eliminate()
|
|||
}
|
||||
}
|
||||
|
||||
if (write_mask == 0) {
|
||||
progress = true;
|
||||
|
||||
/* Don't dead code eliminate instructions that write to the
|
||||
* accumulator as a side-effect. Instead just set the destination
|
||||
* to the null register to free it.
|
||||
*/
|
||||
switch (inst->opcode) {
|
||||
case BRW_OPCODE_ADDC:
|
||||
case BRW_OPCODE_SUBB:
|
||||
case BRW_OPCODE_MACH:
|
||||
inst->dst = dst_reg(retype(brw_null_reg(), inst->dst.type));
|
||||
break;
|
||||
default:
|
||||
if (inst->writes_flag()) {
|
||||
inst->dst = dst_reg(retype(brw_null_reg(), inst->dst.type));
|
||||
} else {
|
||||
inst->remove();
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (inst->dst.writemask != write_mask) {
|
||||
switch (inst->opcode) {
|
||||
case SHADER_OPCODE_TXF_CMS:
|
||||
case SHADER_OPCODE_GEN4_SCRATCH_READ:
|
||||
case VS_OPCODE_PULL_CONSTANT_LOAD:
|
||||
case VS_OPCODE_PULL_CONSTANT_LOAD_GEN7:
|
||||
break;
|
||||
default:
|
||||
progress = true;
|
||||
inst->dst.writemask = write_mask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
progress = try_eliminate_instruction(inst, write_mask) || progress;
|
||||
}
|
||||
|
||||
if (progress)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue