diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index 0298abecc20..94617e8ca04 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -714,6 +714,7 @@ agx_compile_shader_nir(nir_shader *nir, agx_print_shader(ctx, stdout); agx_optimizer(ctx); + agx_dce(ctx); if (agx_debug & AGX_DBG_SHADERS && !skip_internal) agx_print_shader(ctx, stdout); diff --git a/src/asahi/compiler/agx_compiler.h b/src/asahi/compiler/agx_compiler.h index 722f8e78cb4..f6f717951d8 100644 --- a/src/asahi/compiler/agx_compiler.h +++ b/src/asahi/compiler/agx_compiler.h @@ -548,6 +548,7 @@ void agx_print_instr(agx_instr *I, FILE *fp); void agx_print_block(agx_block *block, FILE *fp); void agx_print_shader(agx_context *ctx, FILE *fp); void agx_optimizer(agx_context *ctx); +void agx_dce(agx_context *ctx); void agx_ra(agx_context *ctx); void agx_pack(agx_context *ctx, struct util_dynarray *emission); diff --git a/src/asahi/compiler/agx_dce.c b/src/asahi/compiler/agx_dce.c new file mode 100644 index 00000000000..4f0109e4e2d --- /dev/null +++ b/src/asahi/compiler/agx_dce.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 Alyssa Rosenzweig + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "agx_compiler.h" + +/* SSA-based scalar dead code elimination */ + +void +agx_dce(agx_context *ctx) +{ + BITSET_WORD *seen = calloc(BITSET_WORDS(ctx->alloc), sizeof(BITSET_WORD)); + + agx_foreach_instr_global_safe_rev(ctx, I) { + if (agx_opcodes_info[I->op].can_eliminate) { + bool needed = false; + + agx_foreach_dest(I, d) { + if (I->dest[d].type == AGX_INDEX_NORMAL) + needed |= BITSET_TEST(seen, I->dest[d].value); + } + + if (!needed) { + agx_remove_instruction(I); + continue; + } + } + + agx_foreach_src(I, s) { + if (I->src[s].type == AGX_INDEX_NORMAL) + BITSET_SET(seen, I->src[s].value); + } + } + + free(seen); +} diff --git a/src/asahi/compiler/meson.build b/src/asahi/compiler/meson.build index 760f273962f..b46f745e61f 100644 --- a/src/asahi/compiler/meson.build +++ b/src/asahi/compiler/meson.build @@ -21,6 +21,7 @@ libasahi_agx_files = files( 'agx_compile.c', + 'agx_dce.c', 'agx_pack.c', 'agx_print.c', 'agx_optimizer.c',