[Mesa-dev] [PATCH v2 3/6] i965/fs: copy propagate 'NOT' instruction when used with logical operation
Matt Turner
mattst88 at gmail.com
Mon Jun 9 10:13:43 PDT 2014
On Thu, Jun 5, 2014 at 11:05 AM, Abdiel Janulgue
<abdiel.janulgue at linux.intel.com> wrote:
> On Broadwell, this reduces the instruction to a single operation when NOT is used with
> a logical instruction.
>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> index aa506f5..54d2cb4 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> @@ -341,7 +341,11 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
> return false;
>
> if (brw->gen >= 8) {
> - if (entry->src.negate) {
> + if (entry->opcode == BRW_OPCODE_NOT) {
> + if (!is_logic_op(inst->opcode)) {
> + return false;
> + }
> + } else if (entry->src.negate) {
> if (is_logic_op(inst->opcode)) {
> return false;
> }
> @@ -359,6 +363,10 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
> inst->src[arg].negate ^= entry->src.negate;
> }
>
> + if (brw->gen >=8 && entry->opcode == BRW_OPCODE_NOT) {
Space between >= and 8.
Also, there's a bit of code immediately before this:
if (!inst->src[arg].abs) {
inst->src[arg].abs = entry->src.abs;
inst->src[arg].negate ^= entry->src.negate;
}
I wonder how this might interfere? The Bspec explicitly describes how
abs and negate work before Broadwell, and how negate works after
Broadwell, but no mention of abs on Broadwell. I guess we'll need to
check.
> + inst->src[arg].negate ^= !entry->src.negate;
> + }
> +
> return true;
> }
>
> @@ -498,9 +506,10 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
> }
>
> static bool
> -can_propagate_from(fs_inst *inst)
> +can_propagate_from(struct brw_context *brw, fs_inst *inst)
> {
> - return (inst->opcode == BRW_OPCODE_MOV &&
> + return ((inst->opcode == BRW_OPCODE_MOV ||
> + (inst->opcode == BRW_OPCODE_NOT && brw->gen >=8)) &&
Space between >= and 8.
> inst->dst.file == GRF &&
> ((inst->src[0].file == GRF &&
> (inst->src[0].reg != inst->dst.reg ||
> @@ -566,7 +575,7 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
> /* If this instruction's source could potentially be folded into the
> * operand of another instruction, add it to the ACP.
> */
> - if (can_propagate_from(inst)) {
> + if (can_propagate_from(brw, inst)) {
> acp_entry *entry = ralloc(copy_prop_ctx, acp_entry);
> entry->dst = inst->dst;
> entry->src = inst->src[0];
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list