mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 17:20:21 +01:00
freedreno/ir3: don't be confused by eliminated indirects
If an instruction using address register value gets eliminated, we need to remove it from the indirects list, otherwise it causes mayhem in sched for scheduling address register usage. Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
parent
2215ff2a5d
commit
a84505c719
2 changed files with 14 additions and 0 deletions
|
|
@ -167,6 +167,15 @@ ir3_depth(struct ir3 *ir)
|
|||
remove_unused_by_block(block);
|
||||
}
|
||||
|
||||
/* note that we can end up with unused indirects, but we should
|
||||
* not end up with unused predicates.
|
||||
*/
|
||||
for (i = 0; i < ir->indirects_count; i++) {
|
||||
struct ir3_instruction *instr = ir->indirects[i];
|
||||
if (instr->depth == DEPTH_UNUSED)
|
||||
ir->indirects[i] = NULL;
|
||||
}
|
||||
|
||||
/* cleanup unused inputs: */
|
||||
for (i = 0; i < ir->ninputs; i++) {
|
||||
struct ir3_instruction *in = ir->inputs[i];
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ add_eligible_instrs(struct ir3_sched_ctx *ctx, struct ir3_sched_notes *notes,
|
|||
bool ready = false;
|
||||
for (unsigned i = 0; (i < ir->indirects_count) && !ready; i++) {
|
||||
struct ir3_instruction *indirect = ir->indirects[i];
|
||||
if (!indirect)
|
||||
continue;
|
||||
if (indirect->address != instr)
|
||||
continue;
|
||||
ready = could_sched(indirect, instr);
|
||||
|
|
@ -338,6 +340,9 @@ split_addr(struct ir3_sched_ctx *ctx)
|
|||
for (i = 0; i < ir->indirects_count; i++) {
|
||||
struct ir3_instruction *indirect = ir->indirects[i];
|
||||
|
||||
if (!indirect)
|
||||
continue;
|
||||
|
||||
/* skip instructions already scheduled: */
|
||||
if (is_scheduled(indirect))
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue