nir: Add helper functions to get the instruction that generated a nir_src
[mesa.git] / src / compiler / nir / nir.h
index e0df95c391c97d467d2362fd8980f7f2e4fcfcd0..9527079a9efdd18d33929966c4fe81042e0387b8 100644 (file)
@@ -2520,6 +2520,29 @@ bool nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state);
 bool nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state);
 
 nir_const_value *nir_src_as_const_value(nir_src src);
+
+static inline struct nir_instr *
+nir_src_instr(const struct nir_src *src)
+{
+   return src->is_ssa ? src->ssa->parent_instr : NULL;
+}
+
+#define NIR_SRC_AS_(name, c_type, type_enum, cast_macro)                \
+static inline c_type *                                                  \
+nir_src_as_ ## name (struct nir_src *src)                               \
+{                                                                       \
+    return src->is_ssa && src->ssa->parent_instr->type == type_enum     \
+           ? cast_macro(src->ssa->parent_instr) : NULL;                 \
+}                                                                       \
+static inline const c_type *                                            \
+nir_src_as_ ## name ## _const(const struct nir_src *src)                \
+{                                                                       \
+    return src->is_ssa && src->ssa->parent_instr->type == type_enum     \
+           ? cast_macro(src->ssa->parent_instr) : NULL;                 \
+}
+
+NIR_SRC_AS_(alu_instr, nir_alu_instr, nir_instr_type_alu, nir_instr_as_alu)
+
 bool nir_src_is_dynamically_uniform(nir_src src);
 bool nir_srcs_equal(nir_src src1, nir_src src2);
 void nir_instr_rewrite_src(nir_instr *instr, nir_src *src, nir_src new_src);