From: Eric Anholt Date: Tue, 16 Jul 2019 17:52:25 +0000 (-0700) Subject: nir: Allow internal changes to the instr in nir_shader_lower_instructions(). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=251c64a53dbfe6ed67347e01e54302fbe13e220a;p=mesa.git nir: Allow internal changes to the instr in nir_shader_lower_instructions(). v3d's NIR txf_ms lowering wants to swizzle around the input coordinates in NIR, but doesn't generate a new txf_ms instructions as replacement. It's pretty easy to allow that in nir_shader_lower_instructions, and it may be common in lowering passes. Reviewed-by: Jason Ekstrand --- diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index bf7a5fa0b7e..e09cb71bb35 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -1876,7 +1876,7 @@ nir_function_impl_lower_instructions(nir_function_impl *impl, b.cursor = nir_after_instr(instr); nir_ssa_def *new_def = lower(&b, instr, cb_data); - if (new_def) { + if (new_def && new_def != NIR_LOWER_INSTR_PROGRESS) { assert(old_def != NULL); if (new_def->parent_instr->block != instr->block) preserved = nir_metadata_none; @@ -1901,6 +1901,9 @@ nir_function_impl_lower_instructions(nir_function_impl *impl, list_replace(&old_if_uses, &old_def->if_uses); } iter = nir_after_instr(instr); + + if (new_def == NIR_LOWER_INSTR_PROGRESS) + progress = true; } } diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 99fa4baa16a..c94da19668e 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3299,6 +3299,13 @@ typedef bool (*nir_instr_filter_cb)(const nir_instr *, const void *); typedef nir_ssa_def *(*nir_lower_instr_cb)(struct nir_builder *, nir_instr *, void *); +/** + * Special return value for nir_lower_instr_cb when some progress occurred + * (like changing an input to the instr) that didn't result in a replacement + * SSA def being generated. + */ +#define NIR_LOWER_INSTR_PROGRESS ((nir_ssa_def *)(uintptr_t)1) + /** Iterate over all the instructions in a nir_function_impl and lower them * using the provided callbacks *