Module: Mesa Branch: main Commit: b5cd91501dd0bb6624e50a9728882b787ace5dfb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b5cd91501dd0bb6624e50a9728882b787ace5dfb
Author: Caio Oliveira <caio.olive...@intel.com> Date: Mon Oct 2 10:39:09 2023 -0700 intel/fs: Use linear allocator in opt_copy_propagation Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25670> --- src/intel/compiler/brw_fs_copy_propagation.cpp | 44 ++++++++++++++------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/intel/compiler/brw_fs_copy_propagation.cpp b/src/intel/compiler/brw_fs_copy_propagation.cpp index 3a5b917cdb3..62c16be4e64 100644 --- a/src/intel/compiler/brw_fs_copy_propagation.cpp +++ b/src/intel/compiler/brw_fs_copy_propagation.cpp @@ -265,7 +265,7 @@ struct block_data { class fs_copy_prop_dataflow { public: - fs_copy_prop_dataflow(void *mem_ctx, cfg_t *cfg, + fs_copy_prop_dataflow(linear_ctx *lin_ctx, cfg_t *cfg, const fs_live_variables &live, struct acp *out_acp); @@ -274,7 +274,6 @@ public: void dump_block_data() const UNUSED; - void *mem_ctx; cfg_t *cfg; const fs_live_variables &live; @@ -286,31 +285,33 @@ public: }; } /* anonymous namespace */ -fs_copy_prop_dataflow::fs_copy_prop_dataflow(void *mem_ctx, cfg_t *cfg, +fs_copy_prop_dataflow::fs_copy_prop_dataflow(linear_ctx *lin_ctx, cfg_t *cfg, const fs_live_variables &live, struct acp *out_acp) - : mem_ctx(mem_ctx), cfg(cfg), live(live) + : cfg(cfg), live(live) { - bd = rzalloc_array(mem_ctx, struct block_data, cfg->num_blocks); + bd = linear_zalloc_array(lin_ctx, struct block_data, cfg->num_blocks); num_acp = 0; foreach_block (block, cfg) num_acp += out_acp[block->num].length(); - acp = rzalloc_array(mem_ctx, struct acp_entry *, num_acp); - bitset_words = BITSET_WORDS(num_acp); - int next_acp = 0; foreach_block (block, cfg) { - bd[block->num].livein = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].liveout = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].copy = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].kill = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].undef = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].reachin = rzalloc_array(bd, BITSET_WORD, bitset_words); - bd[block->num].exec_mismatch = rzalloc_array(bd, BITSET_WORD, bitset_words); + bd[block->num].livein = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].liveout = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].copy = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].kill = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].undef = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].reachin = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + bd[block->num].exec_mismatch = linear_zalloc_array(lin_ctx, BITSET_WORD, bitset_words); + } + acp = linear_zalloc_array(lin_ctx, struct acp_entry *, num_acp); + + int next_acp = 0; + foreach_block (block, cfg) { for (auto iter = out_acp[block->num].begin(); iter != out_acp[block->num].end(); ++iter) { acp[next_acp] = *iter; @@ -1273,7 +1274,7 @@ can_propagate_from(fs_inst *inst) * list. */ static bool -opt_copy_propagation_local(const brw_compiler *compiler, void *copy_prop_ctx, +opt_copy_propagation_local(const brw_compiler *compiler, linear_ctx *lin_ctx, bblock_t *block, struct acp &acp, const brw::simple_allocator &alloc, uint8_t max_polygons) @@ -1355,7 +1356,7 @@ opt_copy_propagation_local(const brw_compiler *compiler, void *copy_prop_ctx, * operand of another instruction, add it to the ACP. */ if (can_propagate_from(inst)) { - acp_entry *entry = rzalloc(copy_prop_ctx, acp_entry); + acp_entry *entry = linear_zalloc(lin_ctx, acp_entry); entry->dst = inst->dst; entry->src = inst->src[0]; entry->size_written = inst->size_written; @@ -1379,7 +1380,7 @@ opt_copy_propagation_local(const brw_compiler *compiler, void *copy_prop_ctx, BRW_REGISTER_TYPE_UD : inst->src[i].type; fs_reg dst = byte_offset(retype(inst->dst, t), offset); if (!dst.equals(inst->src[i])) { - acp_entry *entry = rzalloc(copy_prop_ctx, acp_entry); + acp_entry *entry = linear_zalloc(lin_ctx, acp_entry); entry->dst = dst; entry->src = retype(inst->src[i], t); entry->size_written = size_written; @@ -1402,6 +1403,7 @@ fs_visitor::opt_copy_propagation() { bool progress = false; void *copy_prop_ctx = ralloc_context(NULL); + linear_ctx *lin_ctx = linear_context(copy_prop_ctx); struct acp out_acp[cfg->num_blocks]; const fs_live_variables &live = live_analysis.require(); @@ -1410,7 +1412,7 @@ fs_visitor::opt_copy_propagation() * the set of copies available at the end of the block. */ foreach_block (block, cfg) { - progress = opt_copy_propagation_local(compiler, copy_prop_ctx, block, + progress = opt_copy_propagation_local(compiler, lin_ctx, block, out_acp[block->num], alloc, max_polygons) || progress; @@ -1435,7 +1437,7 @@ fs_visitor::opt_copy_propagation() } /* Do dataflow analysis for those available copies. */ - fs_copy_prop_dataflow dataflow(copy_prop_ctx, cfg, live, out_acp); + fs_copy_prop_dataflow dataflow(lin_ctx, cfg, live, 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. @@ -1451,7 +1453,7 @@ fs_visitor::opt_copy_propagation() } } - progress = opt_copy_propagation_local(compiler, copy_prop_ctx, block, + progress = opt_copy_propagation_local(compiler, lin_ctx, block, in_acp, alloc, max_polygons) || progress; }