From 1edc53a66b33e4d17688a3d03b1bdffed2aec414 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 6 Jan 2017 10:26:24 +1100 Subject: [PATCH] glsl: fix opt_minmax redundancy checks against baserange MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Marking operations as redundant if they are equal to the base range is fine when the tree structure is something like this: max / \ max b / \ 3 max / \ 3 a But the opt falls apart with a tree like this: max / \ max max / \ / \ 3 a b 3 The problem is that both branches are treated the same: descending in the left branch will prune the constant, and then descending the right branch will prune the constant there as well, because limits[0] wasn't updated to take the change on the left branch into account, and so we still get [3,\infty) as baserange. In order to fix the bug we just disable the marking of redundant expressions when they match the baserange. NIR algebraic opt will clean up the first tree for anyway, hopefully other backends are smart enough to do this also. Cc: "13.0" Reviewed-by: Nicolai Hähnle --- src/compiler/glsl/opt_minmax.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/opt_minmax.cpp b/src/compiler/glsl/opt_minmax.cpp index 29482ee69de..9f64db9c07e 100644 --- a/src/compiler/glsl/opt_minmax.cpp +++ b/src/compiler/glsl/opt_minmax.cpp @@ -355,7 +355,7 @@ ir_minmax_visitor::prune_expression(ir_expression *expr, minmax_range baserange) */ if (!is_redundant && limits[i].low && baserange.high) { cr = compare_components(limits[i].low, baserange.high); - if (cr >= EQUAL && cr != MIXED) + if (cr > EQUAL && cr != MIXED) is_redundant = true; } } else { @@ -373,7 +373,7 @@ ir_minmax_visitor::prune_expression(ir_expression *expr, minmax_range baserange) */ if (!is_redundant && limits[i].high && baserange.low) { cr = compare_components(limits[i].high, baserange.low); - if (cr <= EQUAL) + if (cr < EQUAL) is_redundant = true; } } -- 2.30.2