[Mesa-dev] [PATCH 03/11] i965: Fix negate with unsigned integers

Anuj Phogat anuj.phogat at gmail.com
Tue Jan 20 19:06:27 PST 2015


On Mon, Jan 19, 2015 at 3:32 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
>
> For code such as:
>
> uint tmp1 = uint(in0);
> uint tmp2 = -tmp1;
> float out0 = float(tmp2);
>
> We produce code like:
> mov(8)    g5<1>.xF    -g9<4,4,1>.xUD
>
> which does not produce correct results. This code produces the
> results we would expect if tmp1 and tmp2 were signed integers
> instead.
>
> It seems that a similar problem was detected and addressed when
> using negations with unsigned integers as part of condionals, but
> it looks like the problem has a wider impact than that.
>
> This patch fixes the problem by preventing copy-propagation of
> negated UD registers in all scenarios, not only in conditionals.
>
> Fixes the following 8 dEQP tests:
>
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uint_vertex
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uint_fragment
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec2_vertex
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec2_fragment
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec3_vertex
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec3_fragment
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec4_vertex
> dEQP-GLES3.functional.shaders.operator.unary_operator.minus.highp_uvec4_fragment
>
> Note:
> For some reason the mediump and lowp versions of these tests still fail but
> I am not sure about the reason for that since the code we generate now seems
> correct (in fact, is the same as for the highp versions). These tests would
> need further investigation.
> ---
>  src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp   | 9 ++++++---
>  src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 9 ++++-----
>  2 files changed, 10 insertions(+), 8 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 70f417f..5dd7255 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> @@ -302,9 +302,12 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
>         (entry->dst.reg_offset + entry->regs_written) * 32)
>        return false;
>
> -   /* See resolve_ud_negate() and comment in brw_fs_emit.cpp. */
> -   if (inst->conditional_mod &&
> -       inst->src[arg].type == BRW_REGISTER_TYPE_UD &&
> +   /* we can't generally copy-propagate UD negations because we
> +    * can end up accessing the resulting values as signed integers
> +    * instead. See also resolve_ud_negate() and comment in
> +    * fs_generator::generate_code.
> +    */
> +   if (inst->src[arg].type == BRW_REGISTER_TYPE_UD &&
>         entry->src.negate)
>        return false;
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> index 9e47dd9..562ecb7 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -318,12 +318,11 @@ try_copy_propagate(struct brw_context *brw, vec4_instruction *inst,
>     if (inst->is_send_from_grf())
>        return false;
>
> -   /* We can't copy-propagate a UD negation into a condmod
> -    * instruction, because the condmod ends up looking at the 33-bit
> -    * signed accumulator value instead of the 32-bit value we wanted
> +   /* we can't generally copy-propagate UD negations becuse we
> +    * end up accessing the resulting values as signed integers
> +    * instead. See also resolve_ud_negate().
>      */
> -   if (inst->conditional_mod &&
> -       value.negate &&
> +   if (value.negate &&
>         value.type == BRW_REGISTER_TYPE_UD)
>        return false;
>
> --
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Changes look good to me. Verified that patch now generates correct
code for the example in the comment.

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list