diff options
author | Matt Turner <[email protected]> | 2015-02-17 18:01:41 -0800 |
---|---|---|
committer | Matt Turner <[email protected]> | 2015-02-17 20:44:09 -0800 |
commit | 1af5c4a526ab27ee2e4c5be96148af231f217c25 (patch) | |
tree | 5ea0cc7803dffa70257adc0d3e9b63931de59202 /src/mesa/drivers/dri/i965 | |
parent | b7ce7c00e35ceb3518d932359ed52cacd6679acb (diff) |
i965: Allow exec_list sentinels as arguments to insert functions.
To insert an instruction at the end of a basic block, we typically do
something like
inst = block->last_non_control_flow_inst();
inst->insert_after(block, new_inst);
But blocks can consist of a single control flow instruction, so inst
will actually be the exec_list's head sentinel. We shouldn't use it as
if it were a regular instruction, but it is safe to insert something after
it.
This patch avoids assert-failing because an exec_list sentinel wasn't in
the basic block's instruction list.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_shader.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 83734a2ecf8..5781c6b9965 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -993,7 +993,8 @@ adjust_later_block_ips(bblock_t *start_block, int ip_adjustment) void backend_instruction::insert_after(bblock_t *block, backend_instruction *inst) { - assert(inst_is_in_block(block, this) || !"Instruction not in block"); + if (!this->is_head_sentinel()) + assert(inst_is_in_block(block, this) || !"Instruction not in block"); block->end_ip++; @@ -1005,7 +1006,8 @@ backend_instruction::insert_after(bblock_t *block, backend_instruction *inst) void backend_instruction::insert_before(bblock_t *block, backend_instruction *inst) { - assert(inst_is_in_block(block, this) || !"Instruction not in block"); + if (!this->is_tail_sentinel()) + assert(inst_is_in_block(block, this) || !"Instruction not in block"); block->end_ip++; |