[Mesa-dev] [PATCH 10/20] i965: Add a basic-block aware backend_instruction::remove method.

Matt Turner mattst88 at gmail.com
Thu Jul 24 19:54:17 PDT 2014


---
 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



More information about the mesa-dev mailing list