freedreno/ir3: fix error in bail logic
authorRob Clark <robclark@freedesktop.org>
Wed, 3 Sep 2014 23:45:19 +0000 (19:45 -0400)
committerRob Clark <robclark@freedesktop.org>
Fri, 5 Sep 2014 02:28:50 +0000 (22:28 -0400)
all_delayed will also be true if we didn't attempt to schedule anything
due to no more instructions using current addr/pred.  We rely on coming
in to block_sched_undelayed() to detect and clean up when there are no
more uses of the current addr/pred, which isn't necessarily an error.

This fixes a regression introduced in b823abed.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/ir3/ir3_sched.c

index 33d1caacca63c5c97646917bcf4de192768a90d3..cf09ceaf54be19f81932812ce555b9c94921c49c 100644 (file)
@@ -310,7 +310,7 @@ static int block_sched_undelayed(struct ir3_sched_ctx *ctx,
        bool addr_in_use = false;
        bool pred_in_use = false;
        bool all_delayed = true;
-       unsigned cnt = ~0;
+       unsigned cnt = ~0, attempted = 0;
 
        while (instr) {
                struct ir3_instruction *next = instr->next;
@@ -331,6 +331,8 @@ static int block_sched_undelayed(struct ir3_sched_ctx *ctx,
                                addr_in_use = true;
                        if (pred)
                                pred_in_use = true;
+
+                       attempted++;
                }
 
                instr = next;
@@ -345,7 +347,7 @@ static int block_sched_undelayed(struct ir3_sched_ctx *ctx,
        /* detect if we've gotten ourselves into an impossible situation
         * and bail if needed
         */
-       if (all_delayed)
+       if (all_delayed && (attempted > 0))
                ctx->error = true;
 
        return cnt;