nir/large_constants: pass after lowering copy_deref
v2: by J.Ekstrand suggestion moved lowering of large constants after lowering of copy_deref is done. CC: Jason Ekstrand <jason@jlekstrand.net> CC: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111450 Signed-off-by: Sergii Romantsov <sergii.romantsov@globallogic.com>
This commit is contained in:
parent
e536446b60
commit
2bfcf04345
|
@ -222,13 +222,7 @@ nir_opt_large_constants(nir_shader *shader,
|
|||
break;
|
||||
|
||||
case nir_intrinsic_copy_deref:
|
||||
/* We always assume the src and therefore the dst are not
|
||||
* constants here. Copy and constant propagation passes should
|
||||
* have taken care of this in most cases anyway.
|
||||
*/
|
||||
dst_deref = nir_src_as_deref(intrin->src[0]);
|
||||
src_deref = nir_src_as_deref(intrin->src[1]);
|
||||
src_is_const = false;
|
||||
assert(!"Lowering of copy_deref with large constants is prohibited");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -366,24 +360,7 @@ nir_opt_large_constants(nir_shader *shader,
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case nir_intrinsic_copy_deref: {
|
||||
nir_deref_instr *deref = nir_src_as_deref(intrin->src[1]);
|
||||
if (deref->mode != nir_var_function_temp)
|
||||
continue;
|
||||
|
||||
nir_variable *var = nir_deref_instr_get_variable(deref);
|
||||
struct var_info *info = &var_infos[var->data.index];
|
||||
if (info->is_constant) {
|
||||
b.cursor = nir_after_instr(&intrin->instr);
|
||||
nir_ssa_def *val = build_constant_load(&b, deref, size_align);
|
||||
nir_store_deref(&b, nir_src_as_deref(intrin->src[0]), val, ~0);
|
||||
nir_instr_remove(&intrin->instr);
|
||||
nir_deref_instr_remove_if_unused(deref);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case nir_intrinsic_copy_deref:
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -690,13 +690,6 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
|
|||
OPT(nir_lower_doubles, softfp64, nir->options->lower_doubles_options);
|
||||
OPT(nir_lower_int64, nir->options->lower_int64_options);
|
||||
|
||||
/* This needs to be run after the first optimization pass but before we
|
||||
* lower indirect derefs away
|
||||
*/
|
||||
if (compiler->supports_shader_constants) {
|
||||
OPT(nir_opt_large_constants, NULL, 32);
|
||||
}
|
||||
|
||||
OPT(nir_lower_bit_size, lower_bit_size_callback, (void *)compiler);
|
||||
|
||||
if (is_scalar) {
|
||||
|
@ -706,6 +699,13 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
|
|||
/* Lower a bunch of stuff */
|
||||
OPT(nir_lower_var_copies);
|
||||
|
||||
/* This needs to be run after the first optimization pass but before we
|
||||
* lower indirect derefs away
|
||||
*/
|
||||
if (compiler->supports_shader_constants) {
|
||||
OPT(nir_opt_large_constants, NULL, 32);
|
||||
}
|
||||
|
||||
OPT(nir_lower_system_values);
|
||||
|
||||
const nir_lower_subgroups_options subgroups_options = {
|
||||
|
|
Loading…
Reference in New Issue