Mesa (master): i965/cfg: Add functions to combine basic blocks.

Matt Turner mattst88 at kemper.freedesktop.org
Fri Aug 22 17:20:38 UTC 2014


Module: Mesa
Branch: master
Commit: 9cf06e27e1e42ad33f0c6f8dc201300d8d108169
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9cf06e27e1e42ad33f0c6f8dc201300d8d108169

Author: Matt Turner <mattst88 at gmail.com>
Date:   Tue Jul 15 14:51:43 2014 -0700

i965/cfg: Add functions to combine basic blocks.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

---

 src/mesa/drivers/dri/i965/brw_cfg.cpp |   52 +++++++++++++++++++++++++++++++++
 src/mesa/drivers/dri/i965/brw_cfg.h   |    2 ++
 2 files changed, 54 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp b/src/mesa/drivers/dri/i965/brw_cfg.cpp
index 3895469..8714b68 100644
--- a/src/mesa/drivers/dri/i965/brw_cfg.cpp
+++ b/src/mesa/drivers/dri/i965/brw_cfg.cpp
@@ -92,6 +92,58 @@ bblock_t::is_successor_of(const bblock_t *block) const
    return false;
 }
 
+static bool
+ends_block(const backend_instruction *inst)
+{
+   enum opcode op = inst->opcode;
+
+   return op == BRW_OPCODE_IF ||
+          op == BRW_OPCODE_ELSE ||
+          op == BRW_OPCODE_CONTINUE ||
+          op == BRW_OPCODE_BREAK ||
+          op == BRW_OPCODE_WHILE;
+}
+
+static bool
+starts_block(const backend_instruction *inst)
+{
+   enum opcode op = inst->opcode;
+
+   return op == BRW_OPCODE_DO ||
+          op == BRW_OPCODE_ENDIF;
+}
+
+bool
+bblock_t::can_combine_with(const bblock_t *that) const
+{
+   if ((const bblock_t *)this->link.next != that)
+      return false;
+
+   if (ends_block(this->end) ||
+       starts_block(that->start))
+      return false;
+
+   return true;
+}
+
+void
+bblock_t::combine_with(bblock_t *that)
+{
+   assert(this->can_combine_with(that));
+   foreach_list_typed (bblock_link, link, link, &this->children) {
+      assert(link->block == that);
+   }
+   foreach_list_typed (bblock_link, link, link, &that->parents) {
+      assert(link->block == this);
+   }
+
+   this->end_ip = that->end_ip;
+   this->end = that->end;
+   this->else_block = that->else_block;
+
+   this->cfg->remove_block(that);
+}
+
 void
 bblock_t::dump(backend_visitor *v)
 {
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h b/src/mesa/drivers/dri/i965/brw_cfg.h
index ecbb996..ca6a2ac 100644
--- a/src/mesa/drivers/dri/i965/brw_cfg.h
+++ b/src/mesa/drivers/dri/i965/brw_cfg.h
@@ -60,6 +60,8 @@ struct bblock_t {
    void add_successor(void *mem_ctx, bblock_t *successor);
    bool is_predecessor_of(const bblock_t *block) const;
    bool is_successor_of(const bblock_t *block) const;
+   bool can_combine_with(const bblock_t *that) const;
+   void combine_with(bblock_t *that);
    void dump(backend_visitor *v);
 #endif
 




More information about the mesa-commit mailing list