[Mesa-dev] [PATCH 14/22] glsl/ast: Generate a more compact expression to disable execution of default case
Ian Romanick
idr at freedesktop.org
Thu Sep 21 14:34:27 UTC 2017
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
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);
--
2.9.5
More information about the mesa-dev
mailing list