From 6d36be508ff0765beb6cf6bb95a323ff01e458dd Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Thu, 2 Dec 2010 12:17:36 -0800 Subject: 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. --- src/glsl/ast_to_hir.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'src/glsl/ast_to_hir.cpp') diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index d24a7bb752..4b9b07fbf6 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: -- cgit v1.2.3