glsl: Fix loop bounds detection.
authorPaul Berry <stereotype441@gmail.com>
Tue, 8 Jan 2013 02:10:30 +0000 (18:10 -0800)
committerPaul Berry <stereotype441@gmail.com>
Tue, 8 Jan 2013 17:08:53 +0000 (09:08 -0800)
When analyzing a loop where the loop condition is expressed in the
non-standard order (e.g. "4 > i" instead of "i < 4"), we were
reversing the condition incorrectly, leading to a loop bound that was
off by 1.

Fixes piglit tests {vs,fs}-loop-bounds-unrolled.shader_test.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/loop_controls.cpp

index 9acbadc50ea58f7d980ee3eaa62729c776fcb2c2..79c820436fd6951a0643d9fa1189b83b59136b90 100644 (file)
@@ -222,10 +222,10 @@ loop_control_visitor::visit_leave(ir_loop *ir)
            limit = cond->operands[0]->as_constant();
 
            switch (cmp) {
-           case ir_binop_less:    cmp = ir_binop_gequal;  break;
-           case ir_binop_greater: cmp = ir_binop_lequal;  break;
-           case ir_binop_lequal:  cmp = ir_binop_greater; break;
-           case ir_binop_gequal:  cmp = ir_binop_less;    break;
+           case ir_binop_less:    cmp = ir_binop_greater; break;
+           case ir_binop_greater: cmp = ir_binop_less;    break;
+           case ir_binop_lequal:  cmp = ir_binop_gequal;  break;
+           case ir_binop_gequal:  cmp = ir_binop_lequal;  break;
            default: assert(!"Should not get here.");
            }
         }