Otherwise copy propagation fails when write sizes differ. Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/intel/compiler/brw_fs.cpp | 5 ++++- src/intel/compiler/brw_ir_fs.h | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 9c3410b698..8e77248470 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -3450,7 +3450,10 @@ fs_visitor::lower_load_payload() for (uint8_t i = inst->header_size; i < inst->sources; i++) { if (inst->src[i].file != BAD_FILE) - ibld.MOV(retype(dst, inst->src[i].type), inst->src[i]); + ibld.MOV(retype_pad_to_full_register( + dst, dispatch_width, inst->src[i].type), + inst->src[i]); + if (type_sz(inst->src[i].type) == 2) dst = byte_offset(dst, REG_SIZE); else diff --git a/src/intel/compiler/brw_ir_fs.h b/src/intel/compiler/brw_ir_fs.h index b4a1d7ef5a..fe7f7c4be7 100644 --- a/src/intel/compiler/brw_ir_fs.h +++ b/src/intel/compiler/brw_ir_fs.h @@ -72,6 +72,19 @@ retype(fs_reg reg, enum brw_reg_type type) } static inline fs_reg +retype_pad_to_full_register(fs_reg reg, unsigned dispatch_width, + enum brw_reg_type type) +{ + reg.type = type; + + assert(reg.pad_per_component == 0); + if (dispatch_width == 8 && type_sz(reg.type) == 2) + reg.pad_per_component = REG_SIZE / 2; + + return reg; +} + +static inline fs_reg byte_offset(fs_reg reg, unsigned delta) { switch (reg.file) { -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev