i965: Add cfg to backend_visitor.
authorMatt Turner <mattst88@gmail.com>
Sat, 12 Jul 2014 03:54:52 +0000 (20:54 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 21 Jul 2014 17:35:34 +0000 (10:35 -0700)
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_cse.cpp
src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp
src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp
src/mesa/drivers/dri/i965/brw_shader.cpp
src/mesa/drivers/dri/i965/brw_shader.h
src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp

index 63a3e5bbe55f625e97c645833a51a1974e3a905c..14c68986f58ce78c362f1331d64d0f87e2d93cc0 100644 (file)
@@ -39,10 +39,10 @@ dead_control_flow_eliminate(backend_visitor *v)
 {
    bool progress = false;
 
-   cfg_t cfg(&v->instructions);
+   v->calculate_cfg();
 
-   for (int b = 0; b < cfg.num_blocks; b++) {
-      bblock_t *block = cfg.blocks[b];
+   for (int b = 0; b < v->cfg->num_blocks; b++) {
+      bblock_t *block = v->cfg->blocks[b];
       bool found = false;
 
       /* ENDIF instructions, by definition, can only be found at the start of
index 9c76bd236b16a45da747d2f4c69d46424999d89b..9ba3f38534477b6c4eabcf68af25b9ab3a25715d 100644 (file)
@@ -330,7 +330,7 @@ public:
    void assign_constant_locations();
    void demote_pull_constants();
    void invalidate_live_intervals();
-   void calculate_live_intervals(const cfg_t *cfg = NULL);
+   void calculate_live_intervals();
    void calculate_register_pressure();
    bool opt_algebraic();
    bool opt_cse();
index d435d84229015aa24020a476fd22884eed7678d8..63d87f942f3ffdf0c6e951a65c8af47672d33473 100644 (file)
@@ -315,11 +315,10 @@ fs_visitor::opt_cse()
 {
    bool progress = false;
 
-   cfg_t cfg(&instructions);
-   calculate_live_intervals(&cfg);
+   calculate_live_intervals();
 
-   for (int b = 0; b < cfg.num_blocks; b++) {
-      bblock_t *block = cfg.blocks[b];
+   for (int b = 0; b < cfg->num_blocks; b++) {
+      bblock_t *block = cfg->blocks[b];
 
       progress = opt_cse_local(block) || progress;
    }
index d41a42c3ac02e2e7de76f5afccde27e7af179ba6..c00ec1b4de89b8846f16a2cfb4a690092394002b 100644 (file)
@@ -39,15 +39,13 @@ fs_visitor::dead_code_eliminate()
 {
    bool progress = false;
 
-   cfg_t cfg(&instructions);
-
-   calculate_live_intervals(&cfg);
+   calculate_live_intervals();
 
    int num_vars = live_intervals->num_vars;
    BITSET_WORD *live = ralloc_array(NULL, BITSET_WORD, BITSET_WORDS(num_vars));
 
-   for (int b = 0; b < cfg.num_blocks; b++) {
-      bblock_t *block = cfg.blocks[b];
+   for (int b = 0; b < cfg->num_blocks; b++) {
+      bblock_t *block = cfg->blocks[b];
       memcpy(live, live_intervals->bd[b].liveout,
              sizeof(BITSET_WORD) * BITSET_WORDS(num_vars));
 
index 585dc3dad3b53aa6c20bfa3839f62dce7cd64977..57f3ce4783729d092f6c2617f54095deea703eb7 100644 (file)
@@ -295,6 +295,8 @@ fs_visitor::invalidate_live_intervals()
 {
    ralloc_free(live_intervals);
    live_intervals = NULL;
+
+   invalidate_cfg();
 }
 
 /**
@@ -304,7 +306,7 @@ fs_visitor::invalidate_live_intervals()
  * information about whole VGRFs.
  */
 void
-fs_visitor::calculate_live_intervals(const cfg_t *cfg)
+fs_visitor::calculate_live_intervals()
 {
    if (this->live_intervals)
       return;
@@ -320,12 +322,8 @@ fs_visitor::calculate_live_intervals(const cfg_t *cfg)
       virtual_grf_end[i] = -1;
    }
 
-   if (cfg) {
-      this->live_intervals = new(mem_ctx) fs_live_variables(this, cfg);
-   } else {
-      cfg_t cfg(&instructions);
-      this->live_intervals = new(mem_ctx) fs_live_variables(this, &cfg);
-   }
+   calculate_cfg();
+   this->live_intervals = new(mem_ctx) fs_live_variables(this, cfg);
 
    /* Merge the per-component live ranges to whole VGRF live ranges. */
    for (int i = 0; i < live_intervals->num_vars; i++) {
index 1287adb34c4a72a76d0d8d12a1ff6c4dfccdf3ab..0e04d3f7bdb74554aa28966b00d127685162c992 100644 (file)
@@ -93,12 +93,10 @@ fs_visitor::opt_saturate_propagation()
 {
    bool progress = false;
 
-   cfg_t cfg(&instructions);
+   calculate_live_intervals();
 
-   calculate_live_intervals(&cfg);
-
-   for (int b = 0; b < cfg.num_blocks; b++) {
-      progress = opt_saturate_propagation_local(this, cfg.blocks[b])
+   for (int b = 0; b < cfg->num_blocks; b++) {
+      progress = opt_saturate_propagation_local(this, cfg->blocks[b])
                  || progress;
    }
 
index 318802b79e87ecd629548abfd51b79857e8f53d5..072a661ef83ca3fbd55be3a68aac11c540ff3367 100644 (file)
@@ -549,7 +549,8 @@ backend_visitor::backend_visitor(struct brw_context *brw,
         (struct brw_shader *)shader_prog->_LinkedShaders[stage] : NULL),
      shader_prog(shader_prog),
      prog(prog),
-     stage_prog_data(stage_prog_data)
+     stage_prog_data(stage_prog_data),
+     cfg(NULL)
 {
 }
 
@@ -764,6 +765,20 @@ backend_visitor::dump_instructions(const char *name)
    }
 }
 
+void
+backend_visitor::calculate_cfg()
+{
+   if (this->cfg)
+      return;
+   cfg = new(mem_ctx) cfg_t(&this->instructions);
+}
+
+void
+backend_visitor::invalidate_cfg()
+{
+   ralloc_free(this->cfg);
+   this->cfg = NULL;
+}
 
 /**
  * Sets up the starting offsets for the groups of binding table entries
index cfaea9e5b80b6358e0d169335411a3121e997308..1c5f41eeb3a0076f41b3235199c874bd6e279cd6 100644 (file)
@@ -160,11 +160,16 @@ public:
     */
    exec_list instructions;
 
+   cfg_t *cfg;
+
    virtual void dump_instruction(backend_instruction *inst) = 0;
    virtual void dump_instruction(backend_instruction *inst, FILE *file) = 0;
    virtual void dump_instructions();
    virtual void dump_instructions(const char *name);
 
+   void calculate_cfg();
+   void invalidate_cfg();
+
    void assign_common_binding_table_offsets(uint32_t next_binding_table_offset);
 
    virtual void invalidate_live_intervals() = 0;
index 938ae4331a159e72a8920f55a44402f59e42a79f..57eb21eb6d01373104c87411e3602fd67eb24dce 100644 (file)
@@ -248,19 +248,19 @@ vec4_visitor::calculate_live_intervals()
     * The control flow-aware analysis was done at a channel level, while at
     * this point we're distilling it down to vgrfs.
     */
-   cfg_t cfg(&instructions);
-   vec4_live_variables livevars(this, &cfg);
+   calculate_cfg();
+   vec4_live_variables livevars(this, cfg);
 
-   for (int b = 0; b < cfg.num_blocks; b++) {
+   for (int b = 0; b < cfg->num_blocks; b++) {
       for (int i = 0; i < livevars.num_vars; i++) {
         if (BITSET_TEST(livevars.bd[b].livein, i)) {
-           start[i] = MIN2(start[i], cfg.blocks[b]->start_ip);
-           end[i] = MAX2(end[i], cfg.blocks[b]->start_ip);
+           start[i] = MIN2(start[i], cfg->blocks[b]->start_ip);
+           end[i] = MAX2(end[i], cfg->blocks[b]->start_ip);
         }
 
         if (BITSET_TEST(livevars.bd[b].liveout, i)) {
-           start[i] = MIN2(start[i], cfg.blocks[b]->end_ip);
-           end[i] = MAX2(end[i], cfg.blocks[b]->end_ip);
+           start[i] = MIN2(start[i], cfg->blocks[b]->end_ip);
+           end[i] = MAX2(end[i], cfg->blocks[b]->end_ip);
         }
       }
    }
@@ -272,6 +272,8 @@ void
 vec4_visitor::invalidate_live_intervals()
 {
    live_intervals_valid = false;
+
+   invalidate_cfg();
 }
 
 bool