mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 16:30:10 +01:00
i965/vs: Teach copy propagation about sends from GRFs.
This incidentally also teaches it a bit about gen6 math -- we now allow unswizzled, unmodified GRF temps as the sources for math. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
c3a22d42a8
commit
130138030a
3 changed files with 29 additions and 7 deletions
|
|
@ -225,6 +225,18 @@ vec4_instruction::is_send_from_grf()
|
|||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
vec4_visitor::can_do_source_mods(vec4_instruction *inst)
|
||||
{
|
||||
if (intel->gen == 6 && inst->is_math())
|
||||
return false;
|
||||
|
||||
if (inst->is_send_from_grf())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns how many MRFs an opcode will write over.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -338,6 +338,8 @@ public:
|
|||
bool opt_algebraic();
|
||||
bool opt_register_coalesce();
|
||||
|
||||
bool can_do_source_mods(vec4_instruction *inst);
|
||||
|
||||
vec4_instruction *emit(vec4_instruction *inst);
|
||||
|
||||
vec4_instruction *emit(enum opcode opcode);
|
||||
|
|
@ -390,6 +392,10 @@ public:
|
|||
vec4_instruction *pre_rhs_inst,
|
||||
vec4_instruction *last_rhs_inst);
|
||||
|
||||
bool try_copy_propagation(struct intel_context *intel,
|
||||
vec4_instruction *inst, int arg,
|
||||
src_reg *values[4]);
|
||||
|
||||
/** Walks an exec_list of ir_instruction and sends it through this visitor. */
|
||||
void visit_instructions(const exec_list *list);
|
||||
|
||||
|
|
|
|||
|
|
@ -159,9 +159,10 @@ try_constant_propagation(vec4_instruction *inst, int arg, src_reg *values[4])
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
try_copy_propagation(struct intel_context *intel,
|
||||
vec4_instruction *inst, int arg, src_reg *values[4])
|
||||
bool
|
||||
vec4_visitor::try_copy_propagation(struct intel_context *intel,
|
||||
vec4_instruction *inst, int arg,
|
||||
src_reg *values[4])
|
||||
{
|
||||
/* For constant propagation, we only handle the same constant
|
||||
* across all 4 channels. Some day, we should handle the 8-bit
|
||||
|
|
@ -204,11 +205,14 @@ try_copy_propagation(struct intel_context *intel,
|
|||
if (inst->src[arg].negate)
|
||||
value.negate = !value.negate;
|
||||
|
||||
/* FINISHME: We can't copy-propagate things that aren't normal
|
||||
* vec8s into gen6 math instructions, because of the weird src
|
||||
* handling for those instructions. Just ignore them for now.
|
||||
bool has_source_modifiers = (value.negate || value.abs ||
|
||||
value.swizzle != BRW_SWIZZLE_XYZW ||
|
||||
value.file == UNIFORM);
|
||||
|
||||
/* gen6 math and gen7+ SENDs from GRFs ignore source modifiers on
|
||||
* instructions.
|
||||
*/
|
||||
if (intel->gen >= 6 && inst->is_math())
|
||||
if (has_source_modifiers && !can_do_source_mods(inst))
|
||||
return false;
|
||||
|
||||
/* We can't copy-propagate a UD negation into a condmod
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue