i965/fs: Fix copy propagation of load payload for double operands
authorIago Toral Quiroga <itoral@igalia.com>
Mon, 18 Jan 2016 09:44:20 +0000 (10:44 +0100)
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Mon, 16 May 2016 07:55:32 +0000 (09:55 +0200)
Specifically, consider the size of the data type of the operand to compute
the number of registers written.

v2 (Sam):
- Fix line width (Jordan).
- Add an assert (Jordan).
- Use REG_SIZE in the calculation of regs_written (Curro)

v3 (Sam):
- Fix assert and calculation of regs_written (Curro).

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 83791bfcfff62b190ea3b65894a044df83596c73..875928b0d308fe486e744a8e17d26be60682b85a 100644 (file)
@@ -775,7 +775,9 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
          int offset = 0;
          for (int i = 0; i < inst->sources; i++) {
             int effective_width = i < inst->header_size ? 8 : inst->exec_size;
-            int regs_written = effective_width / 8;
+            assert(effective_width * type_sz(inst->src[i].type) % REG_SIZE == 0);
+            int regs_written = effective_width *
+               type_sz(inst->src[i].type) / REG_SIZE;
             if (inst->src[i].file == VGRF) {
                acp_entry *entry = ralloc(copy_prop_ctx, acp_entry);
                entry->dst = inst->dst;