i965: Replace cfg instances with calls to calculate_cfg().
authorMatt Turner <mattst88@gmail.com>
Sat, 12 Jul 2014 04:24:02 +0000 (21:24 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 21 Jul 2014 17:35:39 +0000 (10:35 -0700)
Avoids regenerating it unnecessarily.

Every program in shader-db improved, none by an amount less than a 1/3
reduction. One Dota2 shader decreased from 62 -> 24.

cfg calculations:     429492 -> 193197 (-55.02%)

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
src/mesa/drivers/dri/i965/brw_fs_peephole_predicated_break.cpp
src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4_cse.cpp

index 62e64a6773bdd07e7cc0492c4511a2836f237c55..071620279b23f9838bd042231dde02e47ea0933d 100644 (file)
@@ -591,31 +591,33 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
 bool
 fs_visitor::opt_copy_propagate()
 {
+   calculate_cfg();
+
    bool progress = false;
    void *copy_prop_ctx = ralloc_context(NULL);
-   cfg_t cfg(&instructions);
-   exec_list *out_acp[cfg.num_blocks];
-   for (int i = 0; i < cfg.num_blocks; i++)
+   exec_list *out_acp[cfg->num_blocks];
+
+   for (int i = 0; i < cfg->num_blocks; i++)
       out_acp[i] = new exec_list [ACP_HASH_SIZE];
 
    /* First, walk through each block doing local copy propagation and getting
     * the set of copies available at the end of the block.
     */
-   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_copy_propagate_local(copy_prop_ctx, block,
                                           out_acp[b]) || progress;
    }
 
    /* Do dataflow analysis for those available copies. */
-   fs_copy_prop_dataflow dataflow(copy_prop_ctx, &cfg, out_acp);
+   fs_copy_prop_dataflow dataflow(copy_prop_ctx, cfg, out_acp);
 
    /* Next, re-run local copy propagation, this time with the set of copies
     * provided by the dataflow analysis available at the start of a block.
     */
-   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];
       exec_list in_acp[ACP_HASH_SIZE];
 
       for (int i = 0; i < dataflow.num_acp; i++) {
@@ -628,7 +630,7 @@ fs_visitor::opt_copy_propagate()
       progress = opt_copy_propagate_local(copy_prop_ctx, block, in_acp) || progress;
    }
 
-   for (int i = 0; i < cfg.num_blocks; i++)
+   for (int i = 0; i < cfg->num_blocks; i++)
       delete [] out_acp[i];
    ralloc_free(copy_prop_ctx);
 
index bb0a2ac09a10b54454b1485ce97f5bf4511fdd36..3ba0b262451324ce938509d89120ae807b491fa1 100644 (file)
@@ -45,10 +45,10 @@ fs_visitor::opt_peephole_predicated_break()
 {
    bool progress = false;
 
-   cfg_t cfg(&instructions);
+   calculate_cfg();
 
-   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];
 
       /* BREAK and CONTINUE instructions, by definition, can only be found at
        * the ends of basic blocks.
index db0be1911cc439905406398580f21a97d7695a36..cf47cb5fd81520b9b2d9d823baf228eb23123a86 100644 (file)
@@ -127,10 +127,10 @@ fs_visitor::opt_peephole_sel()
 {
    bool progress = false;
 
-   cfg_t cfg(&instructions);
+   calculate_cfg();
 
-   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];
 
       /* IF instructions, by definition, can only be found at the ends of
        * basic blocks.
index 9ea0b147644dfabf54f214a5ddc28c486dfe98d9..49a4e9b62742118c8a53b92f0512c828dc764021 100644 (file)
@@ -748,13 +748,13 @@ vec4_visitor::opt_set_dependency_control()
    vec4_instruction *last_mrf_write[BRW_MAX_GRF];
    uint8_t mrf_channels_written[BRW_MAX_GRF];
 
-   cfg_t cfg(&instructions);
+   calculate_cfg();
 
    assert(prog_data->total_grf ||
           !"Must be called after register allocation");
 
-   for (int i = 0; i < cfg.num_blocks; i++) {
-      bblock_t *bblock = cfg.blocks[i];
+   for (int i = 0; i < cfg->num_blocks; i++) {
+      bblock_t *bblock = cfg->blocks[i];
       vec4_instruction *inst;
 
       memset(last_grf_write, 0, sizeof(last_grf_write));
index 83c7eb83eb287b85d62b3bfe7af046a03650d52f..86360d25d2abfa0bf1c2a9c211e07ea07806f3d0 100644 (file)
@@ -254,10 +254,8 @@ vec4_visitor::opt_cse()
 
    calculate_live_intervals();
 
-   cfg_t cfg(&instructions);
-
-   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;
    }