summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-07-22 21:01:54 -0400
committerMarge Bot <eric+marge@anholt.net>2020-08-05 22:04:47 +0000
commitf2d5f4851ab1d4ac38cbf071029f406504e6a552 (patch)
tree7d319af3757cca9d8b08ad69fea0554905c9f2f9
parenta88fd7bfdc6df38f160324afbd62279883323b4e (diff)
glsl: lower_precision - fix assertion failure with dereferences of constants
Reviewed-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6073>
-rw-r--r--src/compiler/glsl/lower_precision.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/compiler/glsl/lower_precision.cpp b/src/compiler/glsl/lower_precision.cpp
index 1685483bacd..805b8d975a7 100644
--- a/src/compiler/glsl/lower_precision.cpp
+++ b/src/compiler/glsl/lower_precision.cpp
@@ -1114,10 +1114,12 @@ lower_variables_visitor::visit_enter(ir_assignment *ir)
if (lhs->type->is_array() &&
(rhs_var || rhs_const) &&
(!rhs_var ||
- var->type->without_array()->is_16bit() !=
- rhs_var->type->without_array()->is_16bit()) &&
+ (var &&
+ var->type->without_array()->is_16bit() !=
+ rhs_var->type->without_array()->is_16bit())) &&
(!rhs_const ||
- (var->type->without_array()->is_16bit() &&
+ (var &&
+ var->type->without_array()->is_16bit() &&
rhs_const->type->without_array()->is_32bit()))) {
assert(ir->rhs->type->is_array());
@@ -1131,7 +1133,8 @@ lower_variables_visitor::visit_enter(ir_assignment *ir)
}
/* Fix array assignments from non-lowered to lowered. */
- if (_mesa_set_search(lower_vars, var) &&
+ if (var &&
+ _mesa_set_search(lower_vars, var) &&
ir->rhs->type->without_array()->is_32bit()) {
fix_types_in_deref_chain(lhs);
/* Convert to 16 bits for LHS. */
@@ -1142,7 +1145,8 @@ lower_variables_visitor::visit_enter(ir_assignment *ir)
}
/* Fix assignment types. */
- if (_mesa_set_search(lower_vars, var)) {
+ if (var &&
+ _mesa_set_search(lower_vars, var)) {
/* Fix the LHS type. */
if (lhs->type->without_array()->is_32bit())
fix_types_in_deref_chain(lhs);
@@ -1188,7 +1192,8 @@ lower_variables_visitor::visit_enter(ir_return *ir)
ir_variable *var = deref->variable_referenced();
/* Fix the type of the return value. */
- if (_mesa_set_search(lower_vars, var) &&
+ if (var &&
+ _mesa_set_search(lower_vars, var) &&
deref->type->without_array()->is_32bit()) {
/* Create a 32-bit temporary variable. */
ir_variable *new_var =
@@ -1229,6 +1234,7 @@ void lower_variables_visitor::handle_rvalue(ir_rvalue **rvalue)
expr->operation == ir_unop_u2u) &&
expr->type->without_array()->is_16bit() &&
expr_op0_deref->type->without_array()->is_32bit() &&
+ expr_op0_deref->variable_referenced() &&
_mesa_set_search(lower_vars, expr_op0_deref->variable_referenced())) {
fix_types_in_deref_chain(expr_op0_deref);
@@ -1241,9 +1247,10 @@ void lower_variables_visitor::handle_rvalue(ir_rvalue **rvalue)
if (deref) {
ir_variable *var = deref->variable_referenced();
- assert(var);
- if (_mesa_set_search(lower_vars, var) &&
+ /* var can be NULL if we are dereferencing ir_constant. */
+ if (var &&
+ _mesa_set_search(lower_vars, var) &&
deref->type->without_array()->is_32bit()) {
fix_types_in_deref_chain(deref);
@@ -1270,7 +1277,9 @@ lower_variables_visitor::visit_enter(ir_call *ir)
ir_variable *var = param_deref->variable_referenced();
- if (_mesa_set_search(lower_vars, var) &&
+ /* var can be NULL if we are dereferencing ir_constant. */
+ if (var &&
+ _mesa_set_search(lower_vars, var) &&
param->type->without_array()->is_32bit()) {
fix_types_in_deref_chain(param_deref);