--- src/mesa/drivers/dri/i965/brw_cfg.h | 1 + src/mesa/drivers/dri/i965/brw_shader.cpp | 32 ++++++++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_shader.h | 4 ++++ 3 files changed, 37 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h b/src/mesa/drivers/dri/i965/brw_cfg.h index 35ee29a..e1ec43b 100644 --- a/src/mesa/drivers/dri/i965/brw_cfg.h +++ b/src/mesa/drivers/dri/i965/brw_cfg.h @@ -64,6 +64,7 @@ struct bblock_t { #endif struct exec_node link; + struct cfg_t *cfg; struct backend_instruction *start; struct backend_instruction *end; diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 0deb090..47535a9 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -740,6 +740,38 @@ backend_instruction::has_side_effects() const } void +backend_instruction::remove(bblock_t *block) +{ + bool found = false; (void) found; + foreach_inst_in_block (backend_instruction, i, block) { + if (this == i) { + found = true; + } + } + assert(found || !"Instruction not in block"); + + for (bblock_t *block_iter = (bblock_t *)block->link.next; + !block_iter->link.is_tail_sentinel(); + block_iter = (bblock_t *)block_iter->link.next) { + block_iter->start_ip--; + block_iter->end_ip--; + } + + if (block->start_ip == block->end_ip) { + block->cfg->remove_block(block); + } else { + block->end_ip--; + + if (block->start == this) + block->start = (backend_instruction *)this->next; + if (block->end == this) + block->end = (backend_instruction *)this->prev; + } + + this->remove(); +} + +void backend_visitor::dump_instructions() { dump_instructions(NULL); diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h index 40689eb..4b80ea9 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -78,6 +78,7 @@ struct backend_reg }; struct cfg_t; +struct bblock_t; #ifdef __cplusplus struct backend_instruction : public exec_node { @@ -89,6 +90,9 @@ struct backend_instruction : public exec_node { bool reads_accumulator_implicitly() const; bool writes_accumulator_implicitly(struct brw_context *brw) const; + using exec_node::remove; + void remove(bblock_t *block); + /** * True if the instruction has side effects other than writing to * its destination registers. You are expected not to reorder or -- 1.8.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev