nir/sink,nir/move: move/sink nir_op_mov
Can uncover opportunities to move other instructions. This can increase register usage, but that doesn't seem to actually happen. This optimizes a pattern of a load_per_vertex_input followed by several moves and then a store_output in a different block. v2: add nir_move_copies to make it optional Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Acked-by: Jason Ekstrand <jason@jlekstrand.net> (v1) Acked-by: Rob Clark <robdclark@chromium.org> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2420> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2420>
This commit is contained in:
@@ -4217,6 +4217,7 @@ typedef enum {
|
||||
nir_move_load_ubo = (1 << 1),
|
||||
nir_move_load_input = (1 << 2),
|
||||
nir_move_comparisons = (1 << 3),
|
||||
nir_move_copies = (1 << 4),
|
||||
} nir_move_options;
|
||||
|
||||
bool nir_can_move_instr(nir_instr *instr, nir_move_options options);
|
||||
|
@@ -59,6 +59,11 @@ nir_can_move_instr(nir_instr *instr, nir_move_options options)
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((options & nir_move_copies) && instr->type == nir_instr_type_alu &&
|
||||
nir_instr_as_alu(instr)->op == nir_op_mov) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((options & nir_move_comparisons) && instr->type == nir_instr_type_alu &&
|
||||
nir_alu_instr_is_comparison(nir_instr_as_alu(instr))) {
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user