[Mesa-dev] [PATCH] glsl: fix opt_minmax redundancy checks against baserange

Timothy Arceri timothy.arceri at collabora.com
Thu Jan 5 23:26:24 UTC 2017


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

I'm not 100% sure what is going wrong as a tree like:

        max
     /       \
    max     max
   /   \   /   \
  3    a   b    4

Will remove the right hand side max just fine. But not marking
limits that equal the base range seems to fix the problem.

NIR algebraic opt will clean up the first tree for anyway, hopefully
other backends are smart enough to do this also.

Cc: "13.0" <mesa-stable at lists.freedesktop.org>
---
 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 29482ee..9f64db9 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.9.3



More information about the mesa-dev mailing list