linker: Add imported functions to the linked IR
[mesa.git] / src / glsl / loop_controls.cpp
index 17a0d2db816e09e835c2eabbe5d965b3f67de36a..9acbadc50ea58f7d980ee3eaa62729c776fcb2c2 100644 (file)
@@ -21,7 +21,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#include <climits>
+#include <limits.h>
 #include "main/compiler.h"
 #include "glsl_types.h"
 #include "loop_analysis.h"
@@ -85,7 +85,10 @@ int
 calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
                     enum ir_expression_operation op)
 {
-   void *mem_ctx = talloc_init(__func__);
+   if (from == NULL || to == NULL || increment == NULL)
+      return -1;
+
+   void *mem_ctx = ralloc_context(NULL);
 
    ir_expression *const sub =
       new(mem_ctx) ir_expression(ir_binop_sub, from->type, to, from);
@@ -144,7 +147,7 @@ calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
       }
    }
 
-   talloc_free(mem_ctx);
+   ralloc_free(mem_ctx);
    return (valid_loop) ? iter_value : -1;
 }
 
@@ -182,7 +185,14 @@ loop_control_visitor::visit_leave(ir_loop *ir)
     * i is a loop induction variable, c is a constant, and < is any relative
     * operator.
     */
-   int max_iterations = (ls->max_iterations < 0) ? INT_MAX : ls->max_iterations;
+   int max_iterations = ls->max_iterations;
+
+   if(ir->from && ir->to && ir->increment)
+      max_iterations = calculate_iterations(ir->from, ir->to, ir->increment, (ir_expression_operation)ir->cmp);
+
+   if(max_iterations < 0)
+      max_iterations = INT_MAX;
+
    foreach_list(node, &ls->terminators) {
       loop_terminator *t = (loop_terminator *) node;
       ir_if *if_stmt = t->ir;