--- src/glsl/opt_minmax.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/src/glsl/opt_minmax.cpp b/src/glsl/opt_minmax.cpp index 8cf0fe5..3d3cfff 100644 --- a/src/glsl/opt_minmax.cpp +++ b/src/glsl/opt_minmax.cpp @@ -80,6 +80,8 @@ public: ir_rvalue *opt_compare(ir_expression *expr, minmax_range baserange); + ir_rvalue *opt_abs(ir_expression *expr, minmax_range baserange); + ir_rvalue *opt_undefined_behaviour(ir_expression *expr, minmax_range baserange); void handle_rvalue(ir_rvalue **rvalue); @@ -598,6 +600,25 @@ ir_minmax_visitor::opt_undefined_behaviour(ir_expression *expr, minmax_range bas } /** + * Removes useless abs. + * + * @param baserange the range of this expression that will be used by its + * parents, if this is applicable + */ +ir_rvalue * +ir_minmax_visitor::opt_abs(ir_expression *expr, minmax_range baserange) +{ + // Get the range for the operand + minmax_range r0 = get_range(expr->operands[0]); + + // Operand >= 0.0 lets us eliminate the abs + if (IS_CONSTANT(r0.low, >=, 0.0f)) + return expr->operands[0]; + + return expr; +} + +/** * Eliminates saturate-operations that are defined to either * 0 or 1 based on the operand being less than zero, or larger than 1. * @@ -863,6 +884,9 @@ ir_minmax_visitor::handle_rvalue(ir_rvalue **rvalue) if (expr->operation == ir_unop_saturate) new_rvalue = opt_saturate(expr, minmax_range()); + if (expr->operation == ir_unop_abs) + new_rvalue = opt_abs(expr, minmax_range()); + if (expr->operation == ir_binop_equal || expr->operation == ir_binop_lequal || expr->operation == ir_binop_gequal || -- 2.2.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev