freedreno: Fix invalid read when a block has no instructions.
authorEric Anholt <eric@anholt.net>
Tue, 3 Sep 2019 21:19:36 +0000 (14:19 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 16 Sep 2019 22:02:43 +0000 (22:02 +0000)
We can't deref list_(first/last)_entries unless we know we have at least
one.  Instead, just use our IP we've been tracking as we go to set up the
start ip, and fill in the end IP as we walk instructions.

Fixes a complaint in valgrind on
dEQP-GLES3.functional.transform_feedback.* which sometimes has an
empty main (non-END) block when the VS inputs are just directly mapped
to outputs without any ALU ops.

Reviewed-by: Rob Clark <robdclark@chromium.org>
src/freedreno/ir3/ir3.c

index feec723abd0af65d61095ca05e2dc4ce14504d6b..68e83f7495e46b32c87738ba980970fc698ad822 100644 (file)
@@ -1071,11 +1071,12 @@ ir3_count_instructions(struct ir3 *ir)
 {
        unsigned cnt = 0;
        list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
+               block->start_ip = cnt;
+               block->end_ip = cnt;
                list_for_each_entry (struct ir3_instruction, instr, &block->instr_list, node) {
                        instr->ip = cnt++;
+                       block->end_ip = instr->ip;
                }
-               block->start_ip = list_first_entry(&block->instr_list, struct ir3_instruction, node)->ip;
-               block->end_ip = list_last_entry(&block->instr_list, struct ir3_instruction, node)->ip;
        }
        return cnt;
 }