i965/vec4: Fix constant propagation across different types.
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. Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -122,6 +122,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->gen >= 8 && is_logic_op(inst->opcode)) ||
|
||||
!brw_abs_immediate(value.type, &value.fixed_hw_reg)) {
|
||||
|
||||
Reference in New Issue
Block a user