mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 19:40:10 +01:00
nir/peephole_ffma: Be less agressive about fusing multiply-adds
shader-db results for fragment shaders on Haswell: total instructions in shared programs: 4395688 -> 4389623 (-0.14%) instructions in affected programs: 355876 -> 349811 (-1.70%) helped: 1455 HURT: 14 GAINED: 5 LOST: 0 Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
a8c8b3b872
commit
7f344721b1
1 changed files with 41 additions and 0 deletions
|
|
@ -38,6 +38,41 @@ struct peephole_ffma_state {
|
|||
bool progress;
|
||||
};
|
||||
|
||||
static inline bool
|
||||
are_all_uses_fadd(nir_ssa_def *def)
|
||||
{
|
||||
if (def->if_uses->entries > 0)
|
||||
return false;
|
||||
|
||||
struct set_entry *use_iter;
|
||||
set_foreach(def->uses, use_iter) {
|
||||
nir_instr *use_instr = (nir_instr *)use_iter->key;
|
||||
|
||||
if (use_instr->type != nir_instr_type_alu)
|
||||
return false;
|
||||
|
||||
nir_alu_instr *use_alu = nir_instr_as_alu(use_instr);
|
||||
switch (use_alu->op) {
|
||||
case nir_op_fadd:
|
||||
break; /* This one's ok */
|
||||
|
||||
case nir_op_imov:
|
||||
case nir_op_fmov:
|
||||
case nir_op_fneg:
|
||||
case nir_op_fabs:
|
||||
assert(use_alu->dest.dest.is_ssa);
|
||||
if (!are_all_uses_fadd(&use_alu->dest.dest.ssa))
|
||||
return false;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static nir_alu_instr *
|
||||
get_mul_for_src(nir_alu_src *src, uint8_t swizzle[4], bool *negate, bool *abs)
|
||||
{
|
||||
|
|
@ -66,6 +101,12 @@ get_mul_for_src(nir_alu_src *src, uint8_t swizzle[4], bool *negate, bool *abs)
|
|||
break;
|
||||
|
||||
case nir_op_fmul:
|
||||
/* Only absorbe a fmul into a ffma if the fmul is is only used in fadd
|
||||
* operations. This prevents us from being too agressive with our
|
||||
* fusing which can actually lead to more instructions.
|
||||
*/
|
||||
if (!are_all_uses_fadd(&alu->dest.dest.ssa))
|
||||
return NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue