nv/codegen: Use nir_opt_load_store_vectorize

Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24984>
This commit is contained in:
M Henning
2023-08-27 12:13:34 -04:00
committed by Marge Bot
parent 8887f620b8
commit 86fb61b6dc
+53
View File
@@ -149,6 +149,14 @@ private:
Instruction *storeVector(nir_intrinsic_instr *insn,
uint8_t buffer, Value *indirectBuffer,
uint32_t offset, Value *indirectOffset);
static bool memVectorizeCb(unsigned align_mul,
unsigned align_offset,
unsigned bit_size,
unsigned num_components,
nir_intrinsic_instr *low,
nir_intrinsic_instr *high,
void *cb_data);
static nir_mem_access_size_align
getMemAccessSizeAlign(nir_intrinsic_op intrin,
uint8_t bytes,
@@ -1371,6 +1379,37 @@ Converter::storeVector(nir_intrinsic_instr *insn,
return st;
}
bool
Converter::memVectorizeCb(unsigned align_mul,
unsigned align_offset,
unsigned bit_size,
unsigned num_components,
nir_intrinsic_instr *low,
nir_intrinsic_instr *high,
void *cb_data)
{
/*
* Since we legalize these later with nir_lower_mem_access_bit_sizes,
* we can optimistically combine anything that might be profitable
*/
const Converter* converter = (Converter*) cb_data;
const Target* target = converter->prog->getTarget();
assert(util_is_power_of_two_nonzero(align_mul));
align_mul = std::min(align_mul, 128u / 8u);
const DataFile file = converter->getFile(low->intrinsic);
if (align_mul == 128u / 8u && !target->isAccessSupported(file, TYPE_B128))
align_mul = 64u / 8u;
if (align_mul == 64u / 8u && !target->isAccessSupported(file, TYPE_U64))
align_mul = 32u / 8u;
align_offset = align_offset % align_mul;
return align_offset + num_components * (bit_size / 8) <= align_mul;
}
nir_mem_access_size_align
Converter::getMemAccessSizeAlign(nir_intrinsic_op intrin,
uint8_t original_bytes,
@@ -3429,6 +3468,17 @@ Converter::run()
NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_function_temp, nir_address_format_32bit_offset);
NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp, NULL);
NIR_PASS_V(nir, nir_opt_constant_folding); // Improves aliasing information
nir_load_store_vectorize_options vectorize_opts = {};
vectorize_opts.modes = nir_var_mem_global |
nir_var_mem_ssbo |
nir_var_mem_shared |
nir_var_shader_temp;
vectorize_opts.callback = Converter::memVectorizeCb;
vectorize_opts.cb_data = this;
NIR_PASS_V(nir, nir_opt_load_store_vectorize, &vectorize_opts);
nir_lower_mem_access_bit_sizes_options mem_bit_sizes = {};
mem_bit_sizes.modes = nir_var_mem_global |
nir_var_mem_constant |
@@ -3439,6 +3489,9 @@ Converter::run()
mem_bit_sizes.cb_data = this;
NIR_PASS_V(nir, nir_lower_mem_access_bit_sizes, &mem_bit_sizes);
NIR_PASS_V(nir, nir_lower_alu_to_scalar, NULL, NULL);
NIR_PASS_V(nir, nir_lower_pack);
runOptLoop();
NIR_PASS_V(nir, nir_opt_combine_barriers, NULL, NULL);