nir: Move nir_cursor to nir.h.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 25 Aug 2015 17:01:31 +0000 (10:01 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 27 Aug 2015 20:36:57 +0000 (13:36 -0700)
We want to use this for normal instruction insertion too, not just
control flow.  Generally these functions are going to be extremely
useful when working with NIR, so I want them to be widely available
without having to include a separate file.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Acked-by: Connor Abbott <cwabbott0@gmail.com>
src/glsl/nir/nir.h
src/glsl/nir/nir_control_flow.h

index 40871f73e965278826f1f878e3d3f0c7129befe0..49430cdce68601180dd4e283ee874ad872c1bd91 100644 (file)
@@ -1546,6 +1546,101 @@ nir_deref *nir_copy_deref(void *mem_ctx, nir_deref *deref);
 nir_load_const_instr *
 nir_deref_get_const_initializer_load(nir_shader *shader, nir_deref_var *deref);
 
+/**
+ * NIR Cursors and Instruction Insertion API
+ * @{
+ *
+ * A tiny struct representing a point to insert/extract instructions or
+ * control flow nodes.  Helps reduce the combinatorial explosion of possible
+ * points to insert/extract.
+ *
+ * \sa nir_control_flow.h
+ */
+typedef enum {
+   nir_cursor_before_block,
+   nir_cursor_after_block,
+   nir_cursor_before_instr,
+   nir_cursor_after_instr,
+} nir_cursor_option;
+
+typedef struct {
+   nir_cursor_option option;
+   union {
+      nir_block *block;
+      nir_instr *instr;
+   };
+} nir_cursor;
+
+static inline nir_cursor
+nir_before_block(nir_block *block)
+{
+   nir_cursor cursor;
+   cursor.option = nir_cursor_before_block;
+   cursor.block = block;
+   return cursor;
+}
+
+static inline nir_cursor
+nir_after_block(nir_block *block)
+{
+   nir_cursor cursor;
+   cursor.option = nir_cursor_after_block;
+   cursor.block = block;
+   return cursor;
+}
+
+static inline nir_cursor
+nir_before_instr(nir_instr *instr)
+{
+   nir_cursor cursor;
+   cursor.option = nir_cursor_before_instr;
+   cursor.instr = instr;
+   return cursor;
+}
+
+static inline nir_cursor
+nir_after_instr(nir_instr *instr)
+{
+   nir_cursor cursor;
+   cursor.option = nir_cursor_after_instr;
+   cursor.instr = instr;
+   return cursor;
+}
+
+static inline nir_cursor
+nir_before_cf_node(nir_cf_node *node)
+{
+   if (node->type == nir_cf_node_block)
+      return nir_before_block(nir_cf_node_as_block(node));
+
+   return nir_after_block(nir_cf_node_as_block(nir_cf_node_prev(node)));
+}
+
+static inline nir_cursor
+nir_after_cf_node(nir_cf_node *node)
+{
+   if (node->type == nir_cf_node_block)
+      return nir_after_block(nir_cf_node_as_block(node));
+
+   return nir_before_block(nir_cf_node_as_block(nir_cf_node_next(node)));
+}
+
+static inline nir_cursor
+nir_before_cf_list(struct exec_list *cf_list)
+{
+   nir_cf_node *first_node = exec_node_data(nir_cf_node,
+                                            exec_list_get_head(cf_list), node);
+   return nir_before_cf_node(first_node);
+}
+
+static inline nir_cursor
+nir_after_cf_list(struct exec_list *cf_list)
+{
+   nir_cf_node *last_node = exec_node_data(nir_cf_node,
+                                           exec_list_get_tail(cf_list), node);
+   return nir_after_cf_node(last_node);
+}
+
 void nir_instr_insert_before(nir_instr *instr, nir_instr *before);
 void nir_instr_insert_after(nir_instr *instr, nir_instr *after);
 
@@ -1560,6 +1655,8 @@ void nir_instr_insert_after_cf_list(struct exec_list *list, nir_instr *after);
 
 void nir_instr_remove(nir_instr *instr);
 
+/** @} */
+
 typedef bool (*nir_foreach_ssa_def_cb)(nir_ssa_def *def, void *state);
 typedef bool (*nir_foreach_dest_cb)(nir_dest *dest, void *state);
 typedef bool (*nir_foreach_src_cb)(nir_src *src, void *state);
index 5efd41caadff208e90ce97da75f753b657fffc42..b71382fc5977566077f14187076988f0b9e2a054 100644 (file)
@@ -45,95 +45,6 @@ extern "C" {
  *    deleting them.
  */
 
-/* Helper struct for representing a point to extract/insert. Helps reduce the
- * combinatorial explosion of possible points to extract.
- */
-
-typedef enum {
-   nir_cursor_before_block,
-   nir_cursor_after_block,
-   nir_cursor_before_instr,
-   nir_cursor_after_instr,
-} nir_cursor_option;
-
-typedef struct {
-   nir_cursor_option option;
-   union {
-      nir_block *block;
-      nir_instr *instr;
-   };
-} nir_cursor;
-
-static inline nir_cursor
-nir_before_block(nir_block *block)
-{
-   nir_cursor cursor;
-   cursor.option = nir_cursor_before_block;
-   cursor.block = block;
-   return cursor;
-}
-
-static inline nir_cursor
-nir_after_block(nir_block *block)
-{
-   nir_cursor cursor;
-   cursor.option = nir_cursor_after_block;
-   cursor.block = block;
-   return cursor;
-}
-
-static inline nir_cursor
-nir_before_instr(nir_instr *instr)
-{
-   nir_cursor cursor;
-   cursor.option = nir_cursor_before_instr;
-   cursor.instr = instr;
-   return cursor;
-}
-
-static inline nir_cursor
-nir_after_instr(nir_instr *instr)
-{
-   nir_cursor cursor;
-   cursor.option = nir_cursor_after_instr;
-   cursor.instr = instr;
-   return cursor;
-}
-
-static inline nir_cursor
-nir_before_cf_node(nir_cf_node *node)
-{
-   if (node->type == nir_cf_node_block)
-      return nir_before_block(nir_cf_node_as_block(node));
-
-   return nir_after_block(nir_cf_node_as_block(nir_cf_node_prev(node)));
-}
-
-static inline nir_cursor
-nir_after_cf_node(nir_cf_node *node)
-{
-   if (node->type == nir_cf_node_block)
-      return nir_after_block(nir_cf_node_as_block(node));
-
-   return nir_before_block(nir_cf_node_as_block(nir_cf_node_next(node)));
-}
-
-static inline nir_cursor
-nir_before_cf_list(struct exec_list *cf_list)
-{
-   nir_cf_node *first_node = exec_node_data(nir_cf_node,
-                                            exec_list_get_head(cf_list), node);
-   return nir_before_cf_node(first_node);
-}
-
-static inline nir_cursor
-nir_after_cf_list(struct exec_list *cf_list)
-{
-   nir_cf_node *last_node = exec_node_data(nir_cf_node,
-                                           exec_list_get_tail(cf_list), node);
-   return nir_after_cf_node(last_node);
-}
-
 /** Control flow insertion. */
 
 /** puts a control flow node where the cursor is */