[Mesa-dev] [PATCH 06/10] i965: Don't dead-code eliminate instructions that write to the accumulator.

Kenneth Graunke kenneth at whitecape.org
Sat Oct 5 11:46:05 PDT 2013


On 09/27/2013 06:17 PM, Matt Turner wrote:
> v2: Set destination register using brw_null_reg().
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp   | 15 ++++++++++++++-
>  src/mesa/drivers/dri/i965/brw_vec4.cpp | 15 ++++++++++++++-
>  2 files changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index c1ab561..6c8294c 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1845,7 +1845,20 @@ fs_visitor::dead_code_eliminate()
>        if (inst->dst.file == GRF) {
>           assert(this->virtual_grf_end[inst->dst.reg] >= pc);
>           if (this->virtual_grf_end[inst->dst.reg] == pc) {
> -            inst->remove();
> +            /* 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 = fs_reg(retype(brw_null_reg(), inst->dst.type));
> +               break;
> +            default:
> +               inst->remove();
> +               break;
> +            }
>              progress = true;
>           }
>        }
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index 2c1f541..812a005 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -313,7 +313,20 @@ vec4_visitor::dead_code_eliminate()
>        if (inst->dst.file == GRF) {
>           assert(this->virtual_grf_end[inst->dst.reg] >= pc);
>           if (this->virtual_grf_end[inst->dst.reg] == pc) {
> -            inst->remove();
> +            /* 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:
> +               inst->remove();
> +               break;
> +            }
>              progress = true;
>           }
>        }

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>


More information about the mesa-dev mailing list