[Mesa-dev] [PATCH 14/22] glsl/ast: Generate a more compact expression to disable execution of default case
Alejandro PiƱeiro
apinheiro at igalia.com
Fri Sep 22 10:59:22 UTC 2017
On 21/09/17 16:34, Ian Romanick wrote:
> From: "\"Ian Romanick\"" <idr at freedesktop.org>
>
> From: Ian Romanick <ian.d.romanick at 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.romanick at 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);
More information about the mesa-dev
mailing list