i965/fs: Less broken handling of force_writemask_all in lower_load_payload().
It's perfectly fine to read the second half of a register written with force_writemask_all from a first half MOV instruction or vice versa, and lower_load_payload shouldn't mark the whole MOV as belonging to the second half in that case. Replicate the same metadata to both halves of the destination when writemasking is disabled. Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
@@ -3135,9 +3135,11 @@ fs_visitor::lower_load_payload()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (inst->dst.file == MRF || inst->dst.file == GRF) {
|
if (inst->dst.file == MRF || inst->dst.file == GRF) {
|
||||||
bool force_sechalf = inst->force_sechalf;
|
bool force_sechalf = inst->force_sechalf &&
|
||||||
|
!inst->force_writemask_all;
|
||||||
bool toggle_sechalf = inst->dst.width == 16 &&
|
bool toggle_sechalf = inst->dst.width == 16 &&
|
||||||
type_sz(inst->dst.type) == 4;
|
type_sz(inst->dst.type) == 4 &&
|
||||||
|
!inst->force_writemask_all;
|
||||||
for (int i = 0; i < inst->regs_written; ++i) {
|
for (int i = 0; i < inst->regs_written; ++i) {
|
||||||
metadata[dst_reg + i].written = true;
|
metadata[dst_reg + i].written = true;
|
||||||
metadata[dst_reg + i].force_sechalf = force_sechalf;
|
metadata[dst_reg + i].force_sechalf = force_sechalf;
|
||||||
@@ -3180,11 +3182,15 @@ fs_visitor::lower_load_payload()
|
|||||||
mov->force_writemask_all = metadata[src_reg].force_writemask_all;
|
mov->force_writemask_all = metadata[src_reg].force_writemask_all;
|
||||||
metadata[dst_reg] = metadata[src_reg];
|
metadata[dst_reg] = metadata[src_reg];
|
||||||
if (dst.width * type_sz(dst.type) > 32) {
|
if (dst.width * type_sz(dst.type) > 32) {
|
||||||
assert((!metadata[src_reg].written ||
|
if (metadata[src_reg].force_writemask_all) {
|
||||||
!metadata[src_reg].force_sechalf) &&
|
metadata[dst_reg + 1] = metadata[src_reg];
|
||||||
(!metadata[src_reg + 1].written ||
|
} else {
|
||||||
metadata[src_reg + 1].force_sechalf));
|
assert((!metadata[src_reg].written ||
|
||||||
metadata[dst_reg + 1] = metadata[src_reg + 1];
|
!metadata[src_reg].force_sechalf) &&
|
||||||
|
(!metadata[src_reg + 1].written ||
|
||||||
|
metadata[src_reg + 1].force_sechalf));
|
||||||
|
metadata[dst_reg + 1] = metadata[src_reg + 1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
metadata[dst_reg].force_writemask_all = false;
|
metadata[dst_reg].force_writemask_all = false;
|
||||||
|
Reference in New Issue
Block a user