summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2014-07-15 14:51:43 -0700
committerMatt Turner <[email protected]>2014-08-22 10:23:34 -0700
commit9cf06e27e1e42ad33f0c6f8dc201300d8d108169 (patch)
tree11ad6b4f3474720f65f07889eb403056023d3159 /src/mesa/drivers
parent5e6ead5e8b0a79dce63f741dfca8328b7d4020f9 (diff)
i965/cfg: Add functions to combine basic blocks.
Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/brw_cfg.cpp52
-rw-r--r--src/mesa/drivers/dri/i965/brw_cfg.h2
2 files changed, 54 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp b/src/mesa/drivers/dri/i965/brw_cfg.cpp
index 3895469b055..8714b682be0 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 ecbb996244e..ca6a2ac2d66 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