aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/freedreno
diff options
context:
space:
mode:
authorJonathan Marek <[email protected]>2019-09-05 11:23:53 -0400
committerJonathan Marek <[email protected]>2019-09-06 02:24:29 +0000
commit588cfe4a2bc905875ac5d579c385af7a9693edf0 (patch)
tree02f430646230ab8758b994902f1b99c73c025ab4 /src/gallium/drivers/freedreno
parenta6ebd4ab08a7a39e0b8f0d58ca8a35e081f0fe5e (diff)
freedreno/a2xx: ir2: fix incorrect instruction reordering
Signed-off-by: Jonathan Marek <[email protected]> Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r--src/gallium/drivers/freedreno/a2xx/ir2.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/gallium/drivers/freedreno/a2xx/ir2.c b/src/gallium/drivers/freedreno/a2xx/ir2.c
index 8995d7e8aaf..89ac21a81e1 100644
--- a/src/gallium/drivers/freedreno/a2xx/ir2.c
+++ b/src/gallium/drivers/freedreno/a2xx/ir2.c
@@ -258,6 +258,22 @@ static int sched_next(struct ir2_context *ctx, struct ir2_sched_instr *sched)
is_ok &= !ctx->instr[src->num].need_emit;
}
}
+ /* don't reorder non-ssa write before read */
+ if (!instr->is_ssa) {
+ ir2_foreach_instr(p, ctx) {
+ if (!p->need_emit || p->idx >= instr->idx)
+ continue;
+
+ ir2_foreach_src(src, p) {
+ if (get_reg_src(ctx, src) == instr->reg)
+ is_ok = false;
+ }
+ }
+ }
+ /* don't reorder across predicates */
+ if (avail_count && instr->pred != avail[0]->pred)
+ is_ok = false;
+
if (!is_ok)
continue;