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:
@@ -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 {
|
struct clc_libclc {
|
||||||
const nir_shader *libclc_nir;
|
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();
|
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) {
|
if (!s) {
|
||||||
clc_error(logger, "D3D12: spirv_to_nir failed on libclc blob");
|
clc_error(logger, "D3D12: spirv_to_nir failed on libclc blob");
|
||||||
ralloc_free(ctx);
|
ralloc_free(ctx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options && options->optimize)
|
|
||||||
clc_libclc_optimize(s);
|
|
||||||
|
|
||||||
ralloc_steal(ctx, s);
|
ralloc_steal(ctx, s);
|
||||||
ctx->libclc_nir = s;
|
ctx->libclc_nir = s;
|
||||||
|
|
||||||
|
@@ -21,7 +21,8 @@ nir_shader *
|
|||||||
nir_load_libclc_shader(unsigned ptr_bit_size,
|
nir_load_libclc_shader(unsigned ptr_bit_size,
|
||||||
struct disk_cache *disk_cache,
|
struct disk_cache *disk_cache,
|
||||||
const struct spirv_to_nir_options *spirv_options,
|
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);
|
bool nir_lower_libclc(nir_shader *shader, const nir_shader *clc_shader);
|
||||||
|
|
||||||
|
@@ -304,7 +304,8 @@ nir_shader *
|
|||||||
nir_load_libclc_shader(unsigned ptr_bit_size,
|
nir_load_libclc_shader(unsigned ptr_bit_size,
|
||||||
struct disk_cache *disk_cache,
|
struct disk_cache *disk_cache,
|
||||||
const struct spirv_to_nir_options *spirv_options,
|
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 ==
|
assert(ptr_bit_size ==
|
||||||
nir_address_format_bit_size(spirv_options->global_addr_format));
|
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);
|
NIR_PASS_V(nir, libclc_add_generic_variants);
|
||||||
|
|
||||||
/* TODO: One day, we may want to run some optimizations on the libclc
|
/* Run some optimization passes. Those used here should be considered safe
|
||||||
* shader once and cache them to save time in each shader call.
|
* 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
|
#ifdef ENABLE_SHADER_CACHE
|
||||||
if (disk_cache) {
|
if (disk_cache) {
|
||||||
|
@@ -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);
|
auto *compiler_options = dev_get_nir_compiler_options(dev);
|
||||||
|
|
||||||
return nir_load_libclc_shader(dev.address_bits(), dev.clc_cache,
|
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
|
static bool
|
||||||
|
@@ -379,7 +379,13 @@ impl SPIRVBin {
|
|||||||
let shader_cache = DiskCacheBorrowed::as_ptr(&screen.shader_cache());
|
let shader_cache = DiskCacheBorrowed::as_ptr(&screen.shader_cache());
|
||||||
|
|
||||||
NirShader::new(unsafe {
|
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,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -39,7 +39,8 @@ load_clc_shader(struct brw_compiler *compiler, struct disk_cache *disk_cache,
|
|||||||
return compiler->clc_shader;
|
return compiler->clc_shader;
|
||||||
|
|
||||||
nir_shader *nir = nir_load_libclc_shader(64, disk_cache,
|
nir_shader *nir = nir_load_libclc_shader(64, disk_cache,
|
||||||
spirv_options, nir_options);
|
spirv_options, nir_options,
|
||||||
|
disk_cache != NULL);
|
||||||
if (nir == NULL)
|
if (nir == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user