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; -- 2.1.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev