nir/load_libclc: run some opt passes for everybody

Cuts down serialized size from 2850288 to 1377780 bytes.

Reduces clinfo with Rusticl time by 40% for debug builds.

(Old data, but the point stands)

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15996>
This commit is contained in:
Karol Herbst
2022-04-17 00:06:54 +02:00
committed by Marge Bot
parent 3a981acf55
commit 570c263ea3
6 changed files with 47 additions and 36 deletions

View File

@@ -88,31 +88,6 @@ clc_print_kernels_info(const struct clc_parsed_spirv *obj)
}
}
static void
clc_libclc_optimize(nir_shader *s)
{
bool progress;
do {
progress = false;
NIR_PASS(progress, s, nir_split_var_copies);
NIR_PASS(progress, s, nir_opt_copy_prop_vars);
NIR_PASS(progress, s, nir_lower_var_copies);
NIR_PASS(progress, s, nir_lower_vars_to_ssa);
NIR_PASS(progress, s, nir_copy_prop);
NIR_PASS(progress, s, nir_opt_remove_phis);
NIR_PASS(progress, s, nir_opt_dce);
NIR_PASS(progress, s, nir_opt_if, nir_opt_if_aggressive_last_continue | nir_opt_if_optimize_phi_true_false);
NIR_PASS(progress, s, nir_opt_dead_cf);
NIR_PASS(progress, s, nir_opt_cse);
NIR_PASS(progress, s, nir_opt_peephole_select, 8, true, true);
NIR_PASS(progress, s, nir_opt_algebraic);
NIR_PASS(progress, s, nir_opt_constant_folding);
NIR_PASS(progress, s, nir_opt_undef);
NIR_PASS(progress, s, nir_lower_undef_to_zero);
NIR_PASS(progress, s, nir_opt_deref);
} while (progress);
}
struct clc_libclc {
const nir_shader *libclc_nir;
};
@@ -145,16 +120,15 @@ clc_libclc_new(const struct clc_logger *logger, const struct clc_libclc_options
};
glsl_type_singleton_init_or_ref();
nir_shader *s = nir_load_libclc_shader(64, NULL, &libclc_spirv_options, options->nir_options);
bool optimize = options && options->optimize;
nir_shader *s =
nir_load_libclc_shader(64, NULL, &libclc_spirv_options, options->nir_options, optimize);
if (!s) {
clc_error(logger, "D3D12: spirv_to_nir failed on libclc blob");
ralloc_free(ctx);
return NULL;
}
if (options && options->optimize)
clc_libclc_optimize(s);
ralloc_steal(ctx, s);
ctx->libclc_nir = s;

View File

@@ -21,7 +21,8 @@ nir_shader *
nir_load_libclc_shader(unsigned ptr_bit_size,
struct disk_cache *disk_cache,
const struct spirv_to_nir_options *spirv_options,
const nir_shader_compiler_options *nir_options);
const nir_shader_compiler_options *nir_options,
bool optimize);
bool nir_lower_libclc(nir_shader *shader, const nir_shader *clc_shader);

View File

@@ -304,7 +304,8 @@ nir_shader *
nir_load_libclc_shader(unsigned ptr_bit_size,
struct disk_cache *disk_cache,
const struct spirv_to_nir_options *spirv_options,
const nir_shader_compiler_options *nir_options)
const nir_shader_compiler_options *nir_options,
bool optimize)
{
assert(ptr_bit_size ==
nir_address_format_bit_size(spirv_options->global_addr_format));
@@ -356,9 +357,36 @@ nir_load_libclc_shader(unsigned ptr_bit_size,
NIR_PASS_V(nir, libclc_add_generic_variants);
/* TODO: One day, we may want to run some optimizations on the libclc
* shader once and cache them to save time in each shader call.
/* Run some optimization passes. Those used here should be considered safe
* for all use cases and drivers.
*/
if (optimize) {
NIR_PASS_V(nir, nir_split_var_copies);
bool progress;
do {
progress = false;
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
NIR_PASS(progress, nir, nir_lower_var_copies);
NIR_PASS(progress, nir, nir_lower_vars_to_ssa);
NIR_PASS(progress, nir, nir_copy_prop);
NIR_PASS(progress, nir, nir_opt_remove_phis);
NIR_PASS(progress, nir, nir_opt_dce);
NIR_PASS(progress, nir, nir_opt_if, false);
NIR_PASS(progress, nir, nir_opt_dead_cf);
NIR_PASS(progress, nir, nir_opt_cse);
/* drivers run this pass, so don't be too aggressive. More aggressive
* values only increase effectiveness by <5%
*/
NIR_PASS(progress, nir, nir_opt_peephole_select, 0, false, false);
NIR_PASS(progress, nir, nir_opt_algebraic);
NIR_PASS(progress, nir, nir_opt_constant_folding);
NIR_PASS(progress, nir, nir_opt_undef);
NIR_PASS(progress, nir, nir_opt_deref);
} while(progress);
nir_sweep(nir);
}
#ifdef ENABLE_SHADER_CACHE
if (disk_cache) {

View File

@@ -257,7 +257,8 @@ nir_shader *clover::nir::load_libclc_nir(const device &dev, std::string &r_log)
auto *compiler_options = dev_get_nir_compiler_options(dev);
return nir_load_libclc_shader(dev.address_bits(), dev.clc_cache,
&spirv_options, compiler_options);
&spirv_options, compiler_options,
dev.clc_cache != nullptr);
}
static bool

View File

@@ -379,7 +379,13 @@ impl SPIRVBin {
let shader_cache = DiskCacheBorrowed::as_ptr(&screen.shader_cache());
NirShader::new(unsafe {
nir_load_libclc_shader(address_bits, shader_cache, &spirv_options, nir_options)
nir_load_libclc_shader(
address_bits,
shader_cache,
&spirv_options,
nir_options,
true,
)
})
}

View File

@@ -39,7 +39,8 @@ load_clc_shader(struct brw_compiler *compiler, struct disk_cache *disk_cache,
return compiler->clc_shader;
nir_shader *nir = nir_load_libclc_shader(64, disk_cache,
spirv_options, nir_options);
spirv_options, nir_options,
disk_cache != NULL);
if (nir == NULL)
return NULL;