diff options
author | Matt Turner <mattst88@gmail.com> | 2014-07-11 21:24:02 -0700 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2014-07-21 10:35:39 -0700 |
commit | 1761671b0627ce8e1c0eae721e1fca5c2d04690e (patch) | |
tree | 8307a0771b9ce98f737680e1e96b3e56346abf45 /src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | |
parent | dd65a6d9ada7cfa1b694d4211d8c95e446b29c62 (diff) | |
download | external_mesa3d-1761671b0627ce8e1c0eae721e1fca5c2d04690e.zip external_mesa3d-1761671b0627ce8e1c0eae721e1fca5c2d04690e.tar.gz external_mesa3d-1761671b0627ce8e1c0eae721e1fca5c2d04690e.tar.bz2 |
i965: Replace cfg instances with calls to calculate_cfg().
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>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp index 62e64a6..0716202 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -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); |