diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2010-06-07 15:08:04 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-06-11 13:51:42 -0700 |
commit | 00eb466e38733f386794b35ae5b0aab18b60b1d2 (patch) | |
tree | 4f49417f595b28eb48f6906913e3c00fff2a89aa | |
parent | 9e08d019ce36aca8c5c95abbe0b07e8de8b7cf16 (diff) |
Constant-fold constructor parameters after type conversion
This causes the following tests to pass:
glslparsertest/shaders/CorrectMatComma2.frag
One of the incorrect errors in glslparsertest/shaders/CorrectComma.frag
is also eliminated.
-rw-r--r-- | ast_function.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/ast_function.cpp b/ast_function.cpp index 6de72ab2d8..07674ada74 100644 --- a/ast_function.cpp +++ b/ast_function.cpp @@ -137,6 +137,7 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type) { const unsigned a = desired_type->base_type; const unsigned b = src->type->base_type; + ir_expression *result = NULL; if (src->type->is_error()) return src; @@ -151,32 +152,37 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type) case GLSL_TYPE_UINT: case GLSL_TYPE_INT: if (b == GLSL_TYPE_FLOAT) - return new ir_expression(ir_unop_f2i, desired_type, src, NULL); + result = new ir_expression(ir_unop_f2i, desired_type, src, NULL); else { assert(b == GLSL_TYPE_BOOL); - return new ir_expression(ir_unop_b2i, desired_type, src, NULL); + result = new ir_expression(ir_unop_b2i, desired_type, src, NULL); } break; case GLSL_TYPE_FLOAT: switch (b) { case GLSL_TYPE_UINT: - return new ir_expression(ir_unop_u2f, desired_type, src, NULL); + result = new ir_expression(ir_unop_u2f, desired_type, src, NULL); + break; case GLSL_TYPE_INT: - return new ir_expression(ir_unop_i2f, desired_type, src, NULL); + result = new ir_expression(ir_unop_i2f, desired_type, src, NULL); + break; case GLSL_TYPE_BOOL: - return new ir_expression(ir_unop_b2f, desired_type, src, NULL); + result = new ir_expression(ir_unop_b2f, desired_type, src, NULL); + break; } break; case GLSL_TYPE_BOOL: { int z = 0; ir_constant *const zero = new ir_constant(src->type, &z); - return new ir_expression(ir_binop_nequal, desired_type, src, zero); + result = new ir_expression(ir_binop_nequal, desired_type, src, zero); } } - assert(!"Should not get here."); - return NULL; + assert(result != NULL); + + ir_constant *const constant = result->constant_expression_value(); + return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result; } |