mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
i965/vec4: Fix handling of multiple register reads and writes in dead_code_eliminate().
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
2babde35b9
commit
3d1bba7c9b
1 changed files with 15 additions and 7 deletions
|
|
@ -80,8 +80,10 @@ vec4_visitor::dead_code_eliminate()
|
|||
if (inst->dst.file == GRF && !inst->has_side_effects()) {
|
||||
bool result_live[4] = { false };
|
||||
|
||||
for (int c = 0; c < 4; c++) {
|
||||
result_live[c] = BITSET_TEST(live, var_from_reg(alloc, inst->dst, c));
|
||||
for (unsigned i = 0; i < inst->regs_written; i++) {
|
||||
for (int c = 0; c < 4; c++)
|
||||
result_live[c] |= BITSET_TEST(
|
||||
live, var_from_reg(alloc, offset(inst->dst, i), c));
|
||||
}
|
||||
|
||||
/* If the instruction can't do writemasking, then it's all or
|
||||
|
|
@ -122,9 +124,12 @@ vec4_visitor::dead_code_eliminate()
|
|||
}
|
||||
|
||||
if (inst->dst.file == GRF && !inst->predicate) {
|
||||
for (int c = 0; c < 4; c++) {
|
||||
if (inst->dst.writemask & (1 << c)) {
|
||||
BITSET_CLEAR(live, var_from_reg(alloc, inst->dst, c));
|
||||
for (unsigned i = 0; i < inst->regs_written; i++) {
|
||||
for (int c = 0; c < 4; c++) {
|
||||
if (inst->dst.writemask & (1 << c)) {
|
||||
BITSET_CLEAR(live, var_from_reg(alloc,
|
||||
offset(inst->dst, i), c));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -135,8 +140,11 @@ vec4_visitor::dead_code_eliminate()
|
|||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (inst->src[i].file == GRF) {
|
||||
for (int c = 0; c < 4; c++) {
|
||||
BITSET_SET(live, var_from_reg(alloc, inst->src[i], c));
|
||||
for (unsigned j = 0; j < inst->regs_read(i); j++) {
|
||||
for (int c = 0; c < 4; c++) {
|
||||
BITSET_SET(live, var_from_reg(alloc,
|
||||
offset(inst->src[i], j), c));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue