diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2010-12-02 12:17:36 -0800 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-12-07 12:50:38 -0800 |
commit | 6d36be508ff0765beb6cf6bb95a323ff01e458dd (patch) | |
tree | 7e5ea4290dd939afe517723956359dc4e71feab5 | |
parent | 72845d206e692581b6084c56b8d1f3bc689e8a03 (diff) |
glsl: Ensure that equality comparisons don't return a NULL IR tree
This fixes bugzilla #32035 and piglit test case array-compare-01 and
array-compare-02.
NOTE: This is a candidate for the 7.9 branch.
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index d24a7bb752f..4b9b07fbf61 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -759,6 +759,7 @@ static ir_rvalue * do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) { int join_op; + ir_rvalue *cmp = NULL; if (operation == ir_binop_all_equal) join_op = ir_binop_logic_and; @@ -773,8 +774,6 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) return new(mem_ctx) ir_expression(operation, op0, op1); case GLSL_TYPE_ARRAY: { - ir_rvalue *last = NULL; - for (unsigned int i = 0; i < op0->type->length; i++) { ir_rvalue *e0, *e1, *result; @@ -784,22 +783,19 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) new(mem_ctx) ir_constant(i)); result = do_comparison(mem_ctx, operation, e0, e1); - if (last) { - last = new(mem_ctx) ir_expression(join_op, last, result); + if (cmp) { + cmp = new(mem_ctx) ir_expression(join_op, cmp, result); } else { - last = result; + cmp = result; } } mark_whole_array_access(op0); mark_whole_array_access(op1); - - return last; + break; } case GLSL_TYPE_STRUCT: { - ir_rvalue *last = NULL; - for (unsigned int i = 0; i < op0->type->length; i++) { ir_rvalue *e0, *e1, *result; const char *field_name = op0->type->fields.structure[i].name; @@ -810,13 +806,13 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) field_name); result = do_comparison(mem_ctx, operation, e0, e1); - if (last) { - last = new(mem_ctx) ir_expression(join_op, last, result); + if (cmp) { + cmp = new(mem_ctx) ir_expression(join_op, cmp, result); } else { - last = result; + cmp = result; } } - return last; + break; } case GLSL_TYPE_ERROR: @@ -825,10 +821,17 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) /* I assume a comparison of a struct containing a sampler just * ignores the sampler present in the type. */ - return new(mem_ctx) ir_constant(true); + break; + + default: + assert(!"Should not get here."); + break; } - return NULL; + if (cmp == NULL) + cmp = new(mem_ctx) ir_constant(true); + + return cmp; } ir_rvalue * @@ -1029,7 +1032,7 @@ ast_expression::hir(exec_list *instructions, result = do_comparison(ctx, operations[this->oper], op[0], op[1]); type = glsl_type::bool_type; - assert(result->type == glsl_type::bool_type); + assert(error_emitted || (result->type == glsl_type::bool_type)); break; case ast_bit_and: |