On 21/09/17 16:34, Ian Romanick wrote: > From: "\"Ian Romanick\"" <i...@freedesktop.org> > > From: Ian Romanick <ian.d.roman...@intel.com> > > Instead of generating a sequence like: > > run_default = true; > if (i == 3) // some label that appears after default > run_default = false; > if (i == 4) // some label that appears after default > run_default = false; > ... > if (run_default) { > ... > } > > generate something like: > > run_default = !((i == 3) || (i == 4) || ...); > if (run_default) { > ... > } > > This eliminates a use of conditional assignements, and it enables the
typo: s/assignements/assignments > elimination of another. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/compiler/glsl/ast_to_hir.cpp | 31 ++++++++++--------------------- > 1 file changed, 10 insertions(+), 21 deletions(-) > > diff --git a/src/compiler/glsl/ast_to_hir.cpp > b/src/compiler/glsl/ast_to_hir.cpp > index 1d74e24..5f751a4 100644 > --- a/src/compiler/glsl/ast_to_hir.cpp > +++ b/src/compiler/glsl/ast_to_hir.cpp > @@ -6589,27 +6589,11 @@ ast_case_statement_list::hir(exec_list *instructions, > * if default should be chosen or not. > */ > if (!default_case.is_empty()) { > - > - ir_rvalue *const true_val = new (state) ir_constant(true); > - ir_dereference_variable *deref_run_default_var = > - new(state) ir_dereference_variable(state->switch_state.run_default); > - > - /* Choose to run default case initially, following conditional > - * assignments might change this. > - */ > - ir_assignment *const init_var = > - new(state) ir_assignment(deref_run_default_var, true_val); > - instructions->push_tail(init_var); > - > - /* Default case was the last one, no checks required. */ > - if (after_default.is_empty()) { > - instructions->append_list(&default_case); > - return NULL; > - } > - > struct hash_entry *entry; > ir_factory body(instructions, state); > > + ir_expression *cmp = NULL; > + > hash_table_foreach(state->switch_state.labels_ht, entry) { > const struct case_label *const l = (struct case_label *) > entry->data; > > @@ -6623,12 +6607,17 @@ ast_case_statement_list::hir(exec_list *instructions, > ? body.constant(unsigned(l->value)) > : body.constant(int(l->value)); > > - body.emit(assign(state->switch_state.run_default, > - body.constant(false), > - equal(cnst, state->switch_state.test_var))); > + cmp = cmp == NULL > + ? equal(cnst, state->switch_state.test_var) > + : logic_or(cmp, equal(cnst, state->switch_state.test_var)); > } > } > > + if (cmp != NULL) > + body.emit(assign(state->switch_state.run_default, logic_not(cmp))); > + else > + body.emit(assign(state->switch_state.run_default, > body.constant(true))); > + > /* Append default case and all cases after it. */ > instructions->append_list(&default_case); > instructions->append_list(&after_default); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev