From: Rhys Perry Date: Thu, 2 Dec 2021 10:34:44 +0000 (+0000) Subject: nir/opt_access: infer CAN_REORDER for global access X-Git-Tag: upstream/22.3.5~14676 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a65285f54be6d756a8a558f638c18bb4f075222c;p=platform%2Fupstream%2Fmesa.git 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 Part-of: --- diff --git a/src/compiler/nir/nir_opt_access.c b/src/compiler/nir/nir_opt_access.c index 4e5f0c4..14e49ee 100644 --- a/src/compiler/nir/nir_opt_access.c +++ b/src/compiler/nir/nir_opt_access.c @@ -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: