On Tue, Oct 27, 2015 at 10:28:58AM +0100, Iago Toral Quiroga wrote: > We need this so we can configure different behaviors for passes that > cannot deal with side-effectful instructions (CSE) and passes that can > (we will add a load-combine pass shortly). > > For now, when allow_loads is true, we let the instruction set rewrite > SSBO loads. > --- > src/glsl/nir/nir_instr_set.c | 51 > ++++++++++++++++++++++++++++---------------- > src/glsl/nir/nir_instr_set.h | 20 ++++++++++++----- > src/glsl/nir/nir_opt_cse.c | 4 ++-- > 3 files changed, 50 insertions(+), 25 deletions(-) > > diff --git a/src/glsl/nir/nir_instr_set.c b/src/glsl/nir/nir_instr_set.c > index d3f939f..583618f 100644 > --- a/src/glsl/nir/nir_instr_set.c > +++ b/src/glsl/nir/nir_instr_set.c > @@ -398,6 +398,13 @@ dest_is_ssa(nir_dest *dest, void *data) > return dest->is_ssa; > } > > +static bool > +is_load(nir_intrinsic_instr *instr) > +{ > + return instr->intrinsic == nir_intrinsic_load_ssbo || > + instr->intrinsic == nir_intrinsic_load_ssbo_indirect; > +} > + > /* This function determines if uses of an instruction can safely be rewritten > * to use another identical instruction instead. Note that this function must > * be kept in sync with hash_instr() and nir_instrs_equal() -- only > @@ -406,7 +413,7 @@ dest_is_ssa(nir_dest *dest, void *data) > */ > > static bool > -instr_can_rewrite(nir_instr *instr) > +instr_can_rewrite(nir_instr *instr, bool allow_loads) > { > /* We only handle SSA. */ > if (!nir_foreach_dest(instr, dest_is_ssa, NULL) || > @@ -428,11 +435,15 @@ instr_can_rewrite(nir_instr *instr) > return true; > } > case nir_instr_type_intrinsic: { > + nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr); > const nir_intrinsic_info *info = > - &nir_intrinsic_infos[nir_instr_as_intrinsic(instr)->intrinsic]; > - return (info->flags & NIR_INTRINSIC_CAN_ELIMINATE) && > - (info->flags & NIR_INTRINSIC_CAN_REORDER) && > - info->num_variables == 0; /* not implemented yet */ > + &nir_intrinsic_infos[intrinsic->intrinsic]; > + bool can_eliminate_and_reorder = > + (info->flags & NIR_INTRINSIC_CAN_ELIMINATE) && > + (info->flags & NIR_INTRINSIC_CAN_REORDER) && > + info->num_variables == 0; /* not implemented yet */ > + return can_eliminate_and_reorder ? > + true: allow_loads && is_load(intrinsic);
Isn't this just? return can_eliminate_and_reorder || (allow_loads && is_load(intrinsic)); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev