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-sta...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to