mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 15:40:11 +01:00
i965/fs: Optimize a * 1.0 -> a.
This appears in our instruction stream as a result of the brw_vs_constval.c handling.
This commit is contained in:
parent
6d8d6b41b8
commit
a8b86459a1
2 changed files with 44 additions and 0 deletions
|
|
@ -1067,6 +1067,7 @@ fs_visitor::propagate_constants()
|
||||||
if (inst->src[0].imm.f != 0.0f) {
|
if (inst->src[0].imm.f != 0.0f) {
|
||||||
scan_inst->opcode = BRW_OPCODE_MOV;
|
scan_inst->opcode = BRW_OPCODE_MOV;
|
||||||
scan_inst->src[0] = inst->src[0];
|
scan_inst->src[0] = inst->src[0];
|
||||||
|
scan_inst->src[0].imm.f = 1.0f / scan_inst->src[0].imm.f;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -1087,6 +1088,47 @@ fs_visitor::propagate_constants()
|
||||||
|
|
||||||
return progress;
|
return progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to move immediate constants into the immediate
|
||||||
|
* constant slot of following instructions.
|
||||||
|
*
|
||||||
|
* Immediate constants are a bit tricky -- they have to be in the last
|
||||||
|
* operand slot, you can't do abs/negate on them,
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool
|
||||||
|
fs_visitor::opt_algebraic()
|
||||||
|
{
|
||||||
|
bool progress = false;
|
||||||
|
|
||||||
|
calculate_live_intervals();
|
||||||
|
|
||||||
|
foreach_list(node, &this->instructions) {
|
||||||
|
fs_inst *inst = (fs_inst *)node;
|
||||||
|
|
||||||
|
switch (inst->opcode) {
|
||||||
|
case BRW_OPCODE_MUL:
|
||||||
|
if (inst->src[1].file != IMM)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* a * 1.0 = a */
|
||||||
|
if (inst->src[1].type == BRW_REGISTER_TYPE_F &&
|
||||||
|
inst->src[1].imm.f == 1.0) {
|
||||||
|
inst->opcode = BRW_OPCODE_MOV;
|
||||||
|
inst->src[1] = reg_undef;
|
||||||
|
progress = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return progress;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must be called after calculate_live_intervales() to remove unused
|
* Must be called after calculate_live_intervales() to remove unused
|
||||||
* writes to registers -- register allocation will fail otherwise
|
* writes to registers -- register allocation will fail otherwise
|
||||||
|
|
@ -1572,6 +1614,7 @@ fs_visitor::run()
|
||||||
progress = remove_duplicate_mrf_writes() || progress;
|
progress = remove_duplicate_mrf_writes() || progress;
|
||||||
|
|
||||||
progress = propagate_constants() || progress;
|
progress = propagate_constants() || progress;
|
||||||
|
progress = opt_algebraic() || progress;
|
||||||
progress = register_coalesce() || progress;
|
progress = register_coalesce() || progress;
|
||||||
progress = compute_to_mrf() || progress;
|
progress = compute_to_mrf() || progress;
|
||||||
progress = dead_code_eliminate() || progress;
|
progress = dead_code_eliminate() || progress;
|
||||||
|
|
|
||||||
|
|
@ -485,6 +485,7 @@ public:
|
||||||
void setup_pull_constants();
|
void setup_pull_constants();
|
||||||
void calculate_live_intervals();
|
void calculate_live_intervals();
|
||||||
bool propagate_constants();
|
bool propagate_constants();
|
||||||
|
bool opt_algebraic();
|
||||||
bool register_coalesce();
|
bool register_coalesce();
|
||||||
bool compute_to_mrf();
|
bool compute_to_mrf();
|
||||||
bool dead_code_eliminate();
|
bool dead_code_eliminate();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue