glsl: Eliminate assumptions about size of ir_expression::operands
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 11 Nov 2010 00:33:10 +0000 (16:33 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 19 Nov 2010 23:00:25 +0000 (15:00 -0800)
This may grow in the near future.

src/glsl/ir_clone.cpp
src/glsl/ir_constant_expression.cpp
src/glsl/ir_print_visitor.cpp
src/glsl/lower_mat_op_to_vec.cpp
src/glsl/opt_algebraic.cpp
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/program/ir_to_mesa.cpp

index a3cc8dbc9701ba2eb8e8642f8165491d6b9e214b..4032647c3a29e63464fccbdef807b89fb1453f4d 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <string.h>
+#include "main/compiler.h"
 #include "ir.h"
 #include "glsl_types.h"
 extern "C" {
@@ -160,7 +161,7 @@ ir_call::clone(void *mem_ctx, struct hash_table *ht) const
 ir_expression *
 ir_expression::clone(void *mem_ctx, struct hash_table *ht) const
 {
-   ir_rvalue *op[2] = {NULL, NULL};
+   ir_rvalue *op[Elements(this->operands)] = { NULL, };
    unsigned int i;
 
    for (i = 0; i < get_num_operands(); i++) {
index 45860b279fb28a9f4db015aca144573424196abb..1fe1505047041f74a6b78c0a85d089dbbf560627 100644 (file)
@@ -57,7 +57,7 @@ ir_expression::constant_expression_value()
    if (this->type->is_error())
       return NULL;
 
-   ir_constant *op[2] = { NULL, NULL };
+   ir_constant *op[Elements(this->operands)] = { NULL, };
    ir_constant_data data;
 
    memset(&data, 0, sizeof(data));
index 5c19db1326083ccfd8cdeb659a0445ea0c88fe6f..e5067bfdad03856ebfbc251cec5ee7b854ba8685 100644 (file)
@@ -182,11 +182,10 @@ void ir_print_visitor::visit(ir_expression *ir)
 
    printf(" %s ", ir->operator_string());
 
-   if (ir->operands[0])
-      ir->operands[0]->accept(this);
+   for (unsigned i = 0; i < ir->get_num_operands(); i++) {
+      ir->operands[i]->accept(this);
+   }
 
-   if (ir->operands[1])
-      ir->operands[1]->accept(this);
    printf(") ");
 }
 
index 4965df8976dae28f68aa80f9e3a44111b68d940a..7065fdec35f6bd259b8f68315385fcd958930013 100644 (file)
@@ -366,6 +366,8 @@ ir_mat_op_to_vec_visitor::visit_leave(ir_assignment *orig_assign)
    if (!has_matrix_operand(orig_expr, matrix_columns))
       return visit_continue;
 
+   assert(orig_expr->get_num_operands() <= 2);
+
    mem_ctx = talloc_parent(orig_assign);
 
    ir_dereference_variable *lhs_deref =
index 88b6c485d3101a6cb75fd5fa9793c95fb3558c3f..9a8080bff3db287cc24ffd881ad289ed133f635e 100644 (file)
@@ -181,6 +181,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
    ir_expression *temp;
    unsigned int i;
 
+   assert(ir->get_num_operands() <= 2);
    for (i = 0; i < ir->get_num_operands(); i++) {
       if (ir->operands[i]->type->is_matrix())
         return ir;
index 164f89eace4f49251d9ddc76b306d78fbed20677..105327c7fe7fff76444d51d2f192f2832ff066cb 100644 (file)
@@ -708,6 +708,7 @@ fs_visitor::visit(ir_expression *ir)
    fs_reg op[2], temp;
    fs_inst *inst;
 
+   assert(ir->get_num_operands() <= 2);
    for (operand = 0; operand < ir->get_num_operands(); operand++) {
       ir->operands[operand]->accept(this);
       if (this->result.file == BAD_FILE) {
@@ -1387,6 +1388,7 @@ fs_visitor::emit_bool_to_cond_code(ir_rvalue *ir)
       fs_reg op[2];
       fs_inst *inst;
 
+      assert(expr->get_num_operands() <= 2);
       for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
         assert(expr->operands[i]->type->is_scalar());
 
@@ -1494,6 +1496,7 @@ fs_visitor::emit_if_gen6(ir_if *ir)
       fs_inst *inst;
       fs_reg temp;
 
+      assert(expr->get_num_operands() <= 2);
       for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
         assert(expr->operands[i]->type->is_scalar());
 
index ef9f692f946f13f3f5257a95122a286a6dddee25..1b5337e92ee39e8083852b3d6496abdb02736ce8 100644 (file)
@@ -961,7 +961,7 @@ void
 ir_to_mesa_visitor::visit(ir_expression *ir)
 {
    unsigned int operand;
-   struct ir_to_mesa_src_reg op[2];
+   struct ir_to_mesa_src_reg op[Elements(ir->operands)];
    struct ir_to_mesa_src_reg result_src;
    struct ir_to_mesa_dst_reg result_dst;