mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 20:08:06 +02:00
r300/compiler: handle indexable temporaries correctly in deadcode elimination
This commit is contained in:
parent
3aee8c3b1d
commit
6c88f84bdd
1 changed files with 30 additions and 1 deletions
|
|
@ -157,8 +157,12 @@ static void update_instruction(struct deadcode_state * s, struct rc_instruction
|
|||
unsigned char * pused = get_used_ptr(s, inst->U.I.DstReg.File, inst->U.I.DstReg.Index);
|
||||
if (pused) {
|
||||
usedmask = *pused & inst->U.I.DstReg.WriteMask;
|
||||
*pused &= ~usedmask;
|
||||
if (!inst->U.I.DstReg.RelAddr)
|
||||
*pused &= ~usedmask;
|
||||
}
|
||||
|
||||
if (inst->U.I.DstReg.RelAddr)
|
||||
mark_used(s, RC_FILE_ADDRESS, 0, RC_MASK_X);
|
||||
}
|
||||
|
||||
insts->WriteMask |= usedmask;
|
||||
|
|
@ -213,6 +217,7 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, rc_dataflow_mark_outputs_f
|
|||
{
|
||||
struct deadcode_state s;
|
||||
unsigned int nr_instructions;
|
||||
unsigned has_temp_reladdr_src = 0;
|
||||
|
||||
memset(&s, 0, sizeof(s));
|
||||
s.C = c;
|
||||
|
|
@ -300,6 +305,30 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, rc_dataflow_mark_outputs_f
|
|||
rc_error(c, "%s: Unhandled control flow instruction %s\n", __FUNCTION__, opcode->Name);
|
||||
}
|
||||
}
|
||||
|
||||
if (!has_temp_reladdr_src) {
|
||||
for (unsigned i = 0; i < opcode->NumSrcRegs; i++) {
|
||||
if (inst->U.I.SrcReg[i].File == RC_FILE_TEMPORARY &&
|
||||
inst->U.I.SrcReg[i].RelAddr) {
|
||||
/* If there is a register read from a temporary file with relative addressing,
|
||||
* mark all preceding written registers as used. */
|
||||
for (struct rc_instruction *ptr = inst->Prev;
|
||||
ptr != &c->Program.Instructions;
|
||||
ptr = ptr->Prev) {
|
||||
if (opcode->HasDstReg &&
|
||||
ptr->U.I.DstReg.File == RC_FILE_TEMPORARY &&
|
||||
ptr->U.I.DstReg.WriteMask) {
|
||||
mark_used(&s,
|
||||
ptr->U.I.DstReg.File,
|
||||
ptr->U.I.DstReg.Index,
|
||||
ptr->U.I.DstReg.WriteMask);
|
||||
}
|
||||
}
|
||||
|
||||
has_temp_reladdr_src = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update_instruction(&s, inst);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue