[Mesa-dev] [PATCH 17/32] i965/vec4: Fix constant propagation across different types.

Matt Turner mattst88 at gmail.com
Fri Feb 6 13:05:01 PST 2015


On Fri, Feb 6, 2015 at 6:42 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> If the source type differs from the original type of the constant we
> need to bit-cast it before propagating, otherwise the original type
> information will be lost.  If the constant was a vector float there
> isn't much we can do, because the result of bit-casting the component
> values of a vector float cannot itself be represented as an immediate.
> ---
>  src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> 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 81567d2..0a961ce 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -113,6 +113,16 @@ try_constant_propagate(struct brw_context *brw, vec4_instruction *inst,
>     if (value.file != IMM)
>        return false;
>
> +   if (value.type == BRW_REGISTER_TYPE_VF) {
> +      /* The result of bit-casting the component values of a vector float
> +       * cannot in general be represented as an immediate.
> +       */
> +      if (inst->src[arg].type != BRW_REGISTER_TYPE_F)
> +         return false;
> +   } else {
> +      value.type = inst->src[arg].type;
> +   }
> +
>     if (inst->src[arg].abs) {
>        if (!brw_abs_immediate(value.type, &value.fixed_hw_reg)) {
>           return false;

Wow. Did you hit this in practice?

Actually, I suspect this might be the cause of
https://bugs.freedesktop.org/show_bug.cgi?id=86811 (only reacquired a
BDW recently, so never investigated)

Hm, but running the test with INTEL_DEVID_OVERRIDE and
INTEL_DEBUG=vec4vs doesn't show the VF immediate being propagated into
the shift, so perhaps it's not the problem.


More information about the mesa-dev mailing list