[Mesa-dev] [PATCH] i965/fs: Ignore type in cmod prop if scan_inst is CMP.

Jason Ekstrand jason at jlekstrand.net
Wed Mar 18 15:24:40 PDT 2015


Yeah, that looks better.  V2 R-B me.
--Jason

On Wed, Mar 18, 2015 at 2:56 PM, Matt Turner <mattst88 at gmail.com> wrote:
> total instructions in shared programs: 6263270 -> 6203091 (-0.96%)
> instructions in affected programs:     2606529 -> 2546350 (-2.31%)
> helped:                                14301
> GAINED:                                5
> LOST:                                  3
>
> Revewed-by: Jason Ekstrand <jason.ekstrand at intel.com> [v1]
> ---
>  .../drivers/dri/i965/brw_fs_cmod_propagation.cpp   | 25 +++++++++++-----------
>  1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_cmod_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_cmod_propagation.cpp
> index 1935f06..798fef3 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_cmod_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_cmod_propagation.cpp
> @@ -94,21 +94,22 @@ opt_cmod_propagation_local(bblock_t *block)
>                  scan_inst->dst.reg_offset != inst->src[0].reg_offset)
>                 break;
>
> -            /* This must be done before the dst.type check because the result
> -             * type of the AND will always be D, but the result of the CMP
> -             * could be anything.  The assumption is that the AND is just
> -             * figuring out what the result of the previous comparison was
> -             * instead of doing a new comparison with a different type.
> -             */
> -            if (inst->opcode == BRW_OPCODE_AND) {
> -               if (scan_inst->opcode == BRW_OPCODE_CMP) {
> -                  inst->remove(block);
> -                  progress = true;
> -               }
> -
> +            /* CMP's result is the same regardless of dest type. */
> +            if (inst->conditional_mod == BRW_CONDITIONAL_NZ &&
> +                scan_inst->opcode == BRW_OPCODE_CMP &&
> +                (inst->dst.type == BRW_REGISTER_TYPE_D ||
> +                 inst->dst.type == BRW_REGISTER_TYPE_UD)) {
> +               inst->remove(block);
> +               progress = true;
>                 break;
>              }
>
> +            /* If the AND wasn't handled by the previous case, it isn't safe
> +             * to remove it.
> +             */
> +            if (inst->opcode == BRW_OPCODE_AND)
> +               break;
> +
>              /* Comparisons operate differently for ints and floats */
>              if (scan_inst->dst.type != inst->dst.type)
>                 break;
> --
> 2.0.5
>
> _______________________________________________
> 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