On Thu, Feb 5, 2015 at 3:40 PM, Connor Abbott <cwabbo...@gmail.com> wrote:
> This should go before the previous patch, or else that patch won't > work as intended, and also it confused me a little by using a behavior > (the returning NULL) before introducing it. > The previous patch is a bug. It uses a cast of a chunk of the block to an instruction. It just so happens that the ->type of what it gets is never a phi. This patch turns that bug into a segfault hence putting it after the fix. > > On Thu, Feb 5, 2015 at 5:29 PM, Jason Ekstrand <ja...@jlekstrand.net> > wrote: > > --- > > src/glsl/nir/nir.h | 28 ++++++++++++++++++++++------ > > 1 file changed, 22 insertions(+), 6 deletions(-) > > > > diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h > > index 4cb2e92..32c991a 100644 > > --- a/src/glsl/nir/nir.h > > +++ b/src/glsl/nir/nir.h > > @@ -416,15 +416,23 @@ typedef struct { > > } nir_instr; > > > > static inline nir_instr * > > -nir_instr_next(const nir_instr *instr) > > +nir_instr_next(nir_instr *instr) > > { > > - return exec_node_data(nir_instr, (instr)->node.next, node); > > + struct exec_node *next = exec_node_get_next(&instr->node); > > + if (exec_node_is_tail_sentinel(next)) > > + return NULL; > > + else > > + return exec_node_data(nir_instr, next, node); > > } > > > > static inline nir_instr * > > -nir_instr_prev(const nir_instr *instr) > > +nir_instr_prev(nir_instr *instr) > > { > > - return exec_node_data(nir_instr, (instr)->node.prev, node); > > + struct exec_node *prev = exec_node_get_prev(&instr->node); > > + if (exec_node_is_head_sentinel(prev)) > > + return NULL; > > + else > > + return exec_node_data(nir_instr, prev, node); > > } > > > > typedef struct { > > @@ -1264,13 +1272,21 @@ typedef struct { > > static inline nir_cf_node * > > nir_cf_node_next(nir_cf_node *node) > > { > > - return exec_node_data(nir_cf_node, exec_node_get_next(&node->node), > node); > > + struct exec_node *next = exec_node_get_next(&node->node); > > + if (exec_node_is_tail_sentinel(next)) > > + return NULL; > > + else > > + return exec_node_data(nir_cf_node, next, node); > > } > > > > static inline nir_cf_node * > > nir_cf_node_prev(nir_cf_node *node) > > { > > - return exec_node_data(nir_cf_node, exec_node_get_prev(&node->node), > node); > > + struct exec_node *prev = exec_node_get_prev(&node->node); > > + if (exec_node_is_head_sentinel(prev)) > > + return NULL; > > + else > > + return exec_node_data(nir_cf_node, prev, node); > > } > > > > static inline bool > > -- > > 2.2.2 > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev