diff options
author | Jason Ekstrand <jason.ekstrand@intel.com> | 2015-12-23 18:09:42 -0800 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2015-12-23 18:09:42 -0800 |
commit | eae352e75c4effcfda306df2c589ade06d1d3fdb (patch) | |
tree | cb4cfd94a442b797a3ccc82e6f630f501f30c8e7 /src | |
parent | 54c870ff61b1860a253729e397c0c83fc759f625 (diff) | |
download | external_mesa3d-eae352e75c4effcfda306df2c589ade06d1d3fdb.zip external_mesa3d-eae352e75c4effcfda306df2c589ade06d1d3fdb.tar.gz external_mesa3d-eae352e75c4effcfda306df2c589ade06d1d3fdb.tar.bz2 |
nir: Add a function for comparing cursors
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/nir/nir.c | 63 | ||||
-rw-r--r-- | src/glsl/nir/nir.h | 2 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c index d2e9afa..f01d5e2 100644 --- a/src/glsl/nir/nir.c +++ b/src/glsl/nir/nir.c @@ -711,6 +711,69 @@ nir_cf_node_get_function(nir_cf_node *node) return nir_cf_node_as_function(node); } +/* Reduces a cursor by trying to convert everything to after and trying to + * go up to block granularity when possible. + */ +static nir_cursor +reduce_cursor(nir_cursor cursor) +{ + switch (cursor.option) { + case nir_cursor_before_block: + if (exec_list_is_empty(&cursor.block->instr_list)) { + /* Empty block. After is as good as before. */ + cursor.option = nir_cursor_after_block; + } else { + /* Try to switch to after the previous block if there is one. + * (This isn't likely, but it can happen.) + */ + nir_cf_node *prev_node = nir_cf_node_prev(&cursor.block->cf_node); + if (prev_node && prev_node->type == nir_cf_node_block) { + cursor.block = nir_cf_node_as_block(prev_node); + cursor.option = nir_cursor_after_block; + } + } + return cursor; + + case nir_cursor_after_block: + return cursor; + + case nir_cursor_before_instr: { + nir_instr *prev_instr = nir_instr_prev(cursor.instr); + if (prev_instr) { + /* Before this instruction is after the previous */ + cursor.instr = prev_instr; + cursor.option = nir_cursor_after_instr; + } else { + /* No previous instruction. Switch to before block */ + cursor.block = cursor.instr->block; + cursor.option = nir_cursor_before_block; + } + return reduce_cursor(cursor); + } + + case nir_cursor_after_instr: + if (nir_instr_next(cursor.instr) == NULL) { + /* This is the last instruction, switch to after block */ + cursor.option = nir_cursor_after_block; + cursor.block = cursor.instr->block; + } + return cursor; + + default: + unreachable("Inavlid cursor option"); + } +} + +bool +nir_cursors_equal(nir_cursor a, nir_cursor b) +{ + /* Reduced cursors should be unique */ + a = reduce_cursor(a); + b = reduce_cursor(b); + + return a.block == b.block && a.option == b.option; +} + static bool add_use_cb(nir_src *src, void *state) { diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h index 6888ede..8655c14 100644 --- a/src/glsl/nir/nir.h +++ b/src/glsl/nir/nir.h @@ -1778,6 +1778,8 @@ nir_cursor_current_block(nir_cursor cursor) } } +bool nir_cursors_equal(nir_cursor a, nir_cursor b); + static inline nir_cursor nir_before_block(nir_block *block) { |