nir/opt_access: infer CAN_REORDER for global access

fossil-db (Sienna Cichlid):
Totals from 352 (0.26% of 134621) affected shaders:
VGPRs: 17240 -> 17272 (+0.19%)
CodeSize: 1753640 -> 1755744 (+0.12%); split: -0.04%, +0.16%
Instrs: 323190 -> 323801 (+0.19%); split: -0.03%, +0.22%
Latency: 3241205 -> 3241293 (+0.00%); split: -0.10%, +0.10%
InvThroughput: 568927 -> 568067 (-0.15%); split: -0.16%, +0.00%
SClause: 12109 -> 10444 (-13.75%); split: -13.76%, +0.01%
Copies: 27802 -> 27717 (-0.31%); split: -0.56%, +0.26%
PreSGPRs: 14699 -> 14690 (-0.06%)
PreVGPRs: 15793 -> 15799 (+0.04%)

fossil-db (Polaris10):
Totals from 348 (0.26% of 135668) affected shaders:
SGPRs: 21446 -> 21574 (+0.60%); split: -0.15%, +0.75%
VGPRs: 17004 -> 16996 (-0.05%); split: -0.09%, +0.05%
CodeSize: 1782796 -> 1783060 (+0.01%); split: -0.03%, +0.05%
Instrs: 337828 -> 337921 (+0.03%); split: -0.03%, +0.06%
Latency: 3726328 -> 3726721 (+0.01%); split: -0.09%, +0.10%
InvThroughput: 1307917 -> 1299841 (-0.62%); split: -0.62%, +0.00%
VClause: 4327 -> 4337 (+0.23%); split: -0.09%, +0.32%
SClause: 12178 -> 10529 (-13.54%); split: -13.55%, +0.01%
Copies: 40227 -> 40244 (+0.04%); split: -0.19%, +0.24%
PreSGPRs: 14946 -> 14937 (-0.06%)
PreVGPRs: 15637 -> 15643 (+0.04%)

fossil-db (Pitcairn):
Totals from 351 (0.26% of 135668) affected shaders:
SGPRs: 20382 -> 20619 (+1.16%); split: -0.79%, +1.95%
CodeSize: 1789732 -> 1789836 (+0.01%); split: -0.04%, +0.04%
MaxWaves: 1947 -> 1949 (+0.10%)
Instrs: 352274 -> 352318 (+0.01%); split: -0.04%, +0.06%
Latency: 4057829 -> 4058226 (+0.01%); split: -0.08%, +0.09%
InvThroughput: 1332245 -> 1317578 (-1.10%); split: -1.11%, +0.01%
VClause: 8581 -> 8583 (+0.02%); split: -0.13%, +0.15%
SClause: 12187 -> 10552 (-13.42%); split: -13.43%, +0.02%
Copies: 44906 -> 44915 (+0.02%); split: -0.24%, +0.26%
PreSGPRs: 16571 -> 16562 (-0.05%)

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14227>
This commit is contained in:
Rhys Perry 2021-12-02 10:34:44 +00:00 committed by Marge Bot
parent 403ae3b48e
commit a65285f54b
1 changed files with 18 additions and 10 deletions

View File

@ -221,7 +221,7 @@ process_variable(struct access_state *state, nir_variable *var)
}
static bool
update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_image, bool is_buffer)
update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_buffer, bool is_global)
{
enum gl_access_qualifier access = nir_intrinsic_access(instr);
@ -230,15 +230,21 @@ update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_im
if (instr->intrinsic != nir_intrinsic_bindless_image_load &&
instr->intrinsic != nir_intrinsic_bindless_image_store &&
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load) {
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load &&
!is_global) {
const nir_variable *var = nir_get_binding_variable(
state->shader, nir_chase_binding(instr->src[0]));
is_memory_readonly |= var && (var->data.access & ACCESS_NON_WRITEABLE);
is_memory_writeonly |= var && (var->data.access & ACCESS_NON_READABLE);
}
is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
if (is_global) {
is_memory_readonly |= !state->buffers_written && !state->images_written;
is_memory_writeonly |= !state->buffers_read && !state->images_read;
} else {
is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
}
if (is_memory_readonly)
access |= ACCESS_NON_WRITEABLE;
@ -259,15 +265,17 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_store:
case nir_intrinsic_bindless_image_sparse_load:
return update_access(state, instr, true,
nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
return update_access(state, instr, nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF,
false);
case nir_intrinsic_load_deref:
case nir_intrinsic_store_deref: {
if (!nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_global))
return update_access(state, instr, false, true);
else if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
return update_access(state, instr, true, false);
else
return false;
return update_access(state, instr, false, true);
}
case nir_intrinsic_image_deref_load:
@ -278,7 +286,7 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
bool is_buffer =
glsl_get_sampler_dim(glsl_without_array(var->type)) == GLSL_SAMPLER_DIM_BUF;
return update_access(state, instr, true, is_buffer);
return update_access(state, instr, is_buffer, false);
}
default: